Ignore:
Timestamp:
Mar 2, 2018, 7:22:28 PM (18 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: tentative version of the createRoutineData.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.cpp

    r3864 r3865  
    601601    LastSSAIdMap curSSAIdMap;
    602602    LastSSAIdMap lastSSAIdMap;
     603   
     604    size_t weight() const
     605    { return rbwSSAIdMap.size() + lastSSAIdMap.weight(); }
    603606};
    604607
     
    12071210}
    12081211
    1209 static void updateRoutineData(RoutineData& rdata, SSAEntry& ssaEntry)
     1212static void updateRoutineData(RoutineData& rdata, const SSAEntry& ssaEntry)
    12101213{
    12111214    const SSAInfo& sinfo = ssaEntry.second;
     
    13081311    std::cout << std::endl;
    13091312}
     1313
     1314static void createRoutineData(const std::vector<CodeBlock>& codeBlocks,
     1315        const ResSecondPointsToCache& subroutToCache,
     1316        SimpleCache<size_t, RoutineData>& subroutinesCache,
     1317        const std::unordered_map<size_t, RoutineData>& routineMap, RoutineData& rdata,
     1318        size_t routineBlock)
     1319{
     1320    std::cout << "--------- createRoutineData ----------------\n";
     1321    std::vector<bool> visited(codeBlocks.size(), false);
     1322    std::deque<FlowStackEntry> flowStack;
     1323    flowStack.push_back({ routineBlock, 0 });
     1324   
     1325    while (!flowStack.empty())
     1326    {
     1327        FlowStackEntry& entry = flowStack.back();
     1328        const CodeBlock& cblock = codeBlocks[entry.blockIndex];
     1329       
     1330        if (entry.nextIndex == 0)
     1331        {
     1332            // process current block
     1333            RoutineData* cachedRdata = subroutinesCache.use(entry.blockIndex);
     1334            if (cachedRdata != nullptr && flowStack.size() > 1)
     1335            {
     1336                // TODO: correctly join this path with routine data
     1337                // currently does not include further substitutions in visited path
     1338                std::cout << "procret2: " << entry.blockIndex << std::endl;
     1339                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap);
     1340                std::cout << "procretend2" << std::endl;
     1341                flowStack.pop_back();
     1342                continue;
     1343            }
     1344            else if (!visited[entry.blockIndex])
     1345            {
     1346                std::cout << "proc: " << entry.blockIndex << std::endl;
     1347                visited[entry.blockIndex] = true;
     1348               
     1349                for (const auto& ssaEntry: cblock.ssaInfoMap)
     1350                    // put data to routine data
     1351                    updateRoutineData(rdata, ssaEntry);
     1352            }
     1353            else if (subroutToCache.count(entry.blockIndex)!=0)
     1354            {   // begin caching
     1355                flowStack.pop_back();
     1356                continue;
     1357            }
     1358        }
     1359       
     1360        // join and skip calls
     1361        for (; entry.nextIndex < cblock.nexts.size() &&
     1362                    cblock.nexts[entry.nextIndex].isCall; entry.nextIndex++)
     1363            joinRoutineData(rdata, routineMap.find(
     1364                            cblock.nexts[entry.nextIndex].block)->second);
     1365       
     1366        if (entry.nextIndex < cblock.nexts.size())
     1367        {
     1368            flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
     1369            entry.nextIndex++;
     1370        }
     1371        else if (((entry.nextIndex==0 && cblock.nexts.empty()) ||
     1372                // if have any call then go to next block
     1373                (cblock.haveCalls && entry.nextIndex==cblock.nexts.size())) &&
     1374                 !cblock.haveReturn && !cblock.haveEnd)
     1375        {
     1376            flowStack.push_back({ entry.blockIndex+1, 0 });
     1377            entry.nextIndex++;
     1378        }
     1379        else
     1380        {
     1381            if (cblock.haveReturn)
     1382            {
     1383                std::cout << "procret: " << entry.blockIndex << std::endl;
     1384                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap);
     1385                std::cout << "procretend" << std::endl;
     1386            }
     1387           
     1388            for (const auto& ssaEntry: cblock.ssaInfoMap)
     1389            {
     1390                if (ssaEntry.first.regVar == nullptr)
     1391                    continue;
     1392                size_t curSSAId = ssaEntry.second.ssaIdBefore+1;
     1393                size_t nextSSAId = (ssaEntry.second.ssaIdLast != SIZE_MAX) ?
     1394                    ssaEntry.second.ssaIdLast+1 : curSSAId;
     1395               
     1396                std::cout << "popcurnext: " << ssaEntry.first.regVar <<
     1397                            ":" << ssaEntry.first.index << ": " <<
     1398                            nextSSAId << ", " << curSSAId << std::endl;
     1399               
     1400                updateRoutineCurSSAIdMap(&rdata, ssaEntry, entry, curSSAId, nextSSAId);
     1401            }
     1402           
     1403            flowStack.pop_back();
     1404        }
     1405    }
     1406    std::cout << "--------- createRoutineData end ------------\n";
     1407}
     1408
    13101409
    13111410void AsmRegAllocator::createSSAData(ISAUsageHandler& usageHandler)
     
    13771476    size_t wrCount = 0;
    13781477   
     1478    SimpleCache<size_t, RoutineData> subroutinesCache(codeBlocks.size()<<3);
     1479   
    13791480    std::deque<CallStackEntry> callStack;
    13801481    std::deque<FlowStackEntry> flowStack;
     
    13931494   
    13941495    std::vector<bool> waysToCache(codeBlocks.size(), false);
     1496    // subroutToCache - true if given block begin subroutine to cache
    13951497    ResSecondPointsToCache cblocksToCache(codeBlocks.size());
    13961498    std::vector<bool> visited(codeBlocks.size(), false);
     
    15021604            const RoutineData& prevRdata =
    15031605                    routineMap.find(callStack.back().routineBlock)->second;
     1606            RoutineData myRoutineData;
     1607            createRoutineData(codeBlocks, cblocksToCache, subroutinesCache,
     1608                        routineMap, myRoutineData, callStack.back().routineBlock);
    15041609            callStack.pop_back(); // just return from call
    15051610            if (!callStack.empty())
Note: See TracChangeset for help on using the changeset viewer.