Changeset 4125 in CLRX


Ignore:
Timestamp:
May 9, 2018, 1:58:13 PM (2 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: use unordered_set for registering visited blocks instead bitsets for local traversing (creating routines, caching, resolving conflicts, etc).
Use unordered_set for haveReturns.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r4124 r4125  
    773773}
    774774
    775 static void fillUpInsideRoutine(std::vector<bool>& visited,
     775static void fillUpInsideRoutine(std::unordered_set<size_t>& visited,
    776776            const std::vector<CodeBlock>& codeBlocks,
    777777            std::unordered_map<size_t, VIdxSetEntry>& vidxCallMap,
     
    794794        if (entry.nextIndex == 0)
    795795        {
    796             if (!visited[entry.blockIndex])
    797             {
    798                 visited[entry.blockIndex] = true;
     796            if (visited.insert(entry.blockIndex).second)
     797            {
    799798                size_t cbStart = cblock.start;
    800799                if (flowStack.size() == 1)
     
    868867    }
    869868   
    870     std::vector<bool> visited(codeBlocks.size(), false);
     869    std::unordered_set<size_t> visited;
    871870   
    872871    std::stack<JoinEntry> rjStack; // routine join stack
     
    14721471{
    14731472    std::deque<FlowStackEntry4> flowStack;
    1474     std::vector<bool> visited(codeBlocks.size(), false);
     1473    std::unordered_set<size_t> visited;
    14751474   
    14761475    // already read in current path
     
    14891488        {
    14901489            // process current block
    1491             if (!visited[entry.blockIndex])
    1492             {
    1493                 visited[entry.blockIndex] = true;
    1494                
     1490            if (visited.insert(entry.blockIndex).second)
     1491            {
    14951492                for (const auto& sentry: cblock.ssaInfoMap)
    14961493                {
  • CLRadeonExtender/trunk/amdasm/AsmRegAllocSSAData.cpp

    r4090 r4125  
    150150    std::deque<FlowStackEntry2> flowStack;
    151151    flowStack.push_back({ nextBlock, 0 });
    152     CBlockBitPool visited(codeBlocks.size(), false);
     152    std::unordered_set<size_t> visited;
    153153   
    154154    SVRegBlockMap alreadyReadMap;
     
    164164        {
    165165            // process current block
    166             if (!visited[entry.blockIndex])
    167             {
    168                 visited[entry.blockIndex] = true;
     166            if (visited.insert(entry.blockIndex).second)
     167            {
    169168                ARDOut << "  resolv (cache): " << entry.blockIndex << "\n";
    170169               
     
    358357    std::deque<FlowStackEntry2> flowStack;
    359358    flowStack.push_back({ nextBlock, 0 });
    360     CBlockBitPool visited(codeBlocks.size(), false);
     359    std::unordered_set<size_t> visited;
    361360   
    362361    // already read in current path
     
    372371        {
    373372            // process current block
    374             if (!visited[entry.blockIndex])
    375             {
    376                 visited[entry.blockIndex] = true;
     373            if (visited.insert(entry.blockIndex).second)
     374            {
    377375                ARDOut << "  resolv: " << entry.blockIndex << "\n";
    378376               
     
    972970    bool fromSubroutine = noMainLoop;
    973971    ARDOut << "--------- createRoutineData ----------------\n";
    974     CBlockBitPool visited(codeBlocks.size(), false);
    975     CBlockBitPool haveReturnBlocks(codeBlocks.size(), false);
     972    std::unordered_set<BlockIndex> visited;
     973    std::unordered_set<BlockIndex> haveReturnBlocks;
    976974   
    977975    VectorSet<BlockIndex> activeLoops;
     
    11171115                        cachedRdata = &rit->second;
    11181116                }
    1119                 if (!isLoop && visited[entry.blockIndex] && cachedRdata == nullptr &&
    1120                     subroutToCache.count(entry.blockIndex)!=0)
     1117                if (!isLoop && visited.find(entry.blockIndex)!=visited.end() &&
     1118                    cachedRdata == nullptr && subroutToCache.count(entry.blockIndex)!=0)
    11211119                {
    11221120                    auto loopsit2 = rdata.loopEnds.find(entry.blockIndex);
     
    11311129                ARDOut << "use cached subr " << entry.blockIndex << "\n";
    11321130                ARDOut << "procret2: " << entry.blockIndex << "\n";
    1133                 if (visited[entry.blockIndex] && !haveReturnBlocks[entry.blockIndex])
     1131                if (visited.find(entry.blockIndex)!=visited.end() &&
     1132                    haveReturnBlocks.find(entry.blockIndex)==haveReturnBlocks.end())
    11341133                {
    11351134                    // no joining. no returns
     
    11741173                // propagate haveReturn to previous block
    11751174                flowStack.back().haveReturn = true;
    1176                 haveReturnBlocks[flowStack.back().blockIndex] = true;
     1175                haveReturnBlocks.insert(flowStack.back().blockIndex);
    11771176                continue;
    11781177            }
    1179             else if (!visited[entry.blockIndex])
     1178            else if (visited.insert(entry.blockIndex).second)
    11801179            {
    11811180                // set up loops for which subroutine is present
     
    11941193                    activeLoops.insertValue(entry.blockIndex);
    11951194                ARDOut << "proc: " << entry.blockIndex << "\n";
    1196                 visited[entry.blockIndex] = true;
    11971195               
    11981196                for (const auto& ssaEntry: cblock.ssaInfoMap)
     
    13201318                rdata.notFirstReturn = true;
    13211319                entry.haveReturn = true;
    1322                 haveReturnBlocks[entry.blockIndex] = true;
     1320                haveReturnBlocks.insert(entry.blockIndex);
    13231321            }
    13241322           
     
    13781376            {
    13791377                flowStack.back().haveReturn |= curHaveReturn;
    1380                 haveReturnBlocks[flowStack.back().blockIndex] =
    1381                         flowStack.back().haveReturn;
     1378                if (flowStack.back().haveReturn)
     1379                    haveReturnBlocks.insert(flowStack.back().blockIndex);
    13821380            }
    13831381        }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4124 r4125  
    11461146        true, ""
    11471147    }
     1148#if 0
     1149    ,
     1150    {   // 22 - multiple call of routine
     1151        R"ffDXD(.regvar sa:s:8, va:v:8
     1152        s_mov_b32 sa[2], s4
     1153        s_mov_b32 sa[3], s5
     1154       
     1155        s_getpc_b64 s[2:3]
     1156        s_add_u32 s2, s2, routine-.
     1157        s_add_u32 s3, s3, routine-.+4
     1158        .cf_call routine
     1159        s_swappc_b64 s[0:1], s[2:3]
     1160       
     1161        s_lshl_b32 sa[2], sa[2], 3
     1162        s_lshl_b32 sa[3], sa[3], 4
     1163       
     1164        s_getpc_b64 s[2:3]
     1165        s_add_u32 s2, s2, routine-.
     1166        s_add_u32 s3, s3, routine-.+4
     1167        .cf_call routine
     1168        s_swappc_b64 s[0:1], s[2:3]
     1169       
     1170        s_ashr_i32 sa[2], sa[2], 3
     1171        s_ashr_i32 sa[2], sa[2], 3
     1172        s_ashr_i32 sa[3], sa[3], 4
     1173        s_ashr_i32 sa[3], sa[3], 4
     1174       
     1175        s_getpc_b64 s[2:3]
     1176        s_add_u32 s2, s2, routine-.
     1177        s_add_u32 s3, s3, routine-.+4
     1178        .cf_call routine
     1179        s_swappc_b64 s[0:1], s[2:3]
     1180       
     1181        s_ashr_i32 sa[2], sa[2], 3
     1182        s_ashr_i32 sa[3], sa[3], 3
     1183        s_endpgm
     1184       
     1185routine:
     1186        s_xor_b32 sa[2], sa[2], sa[4]
     1187        s_xor_b32 sa[3], sa[3], sa[4]
     1188        s_cbranch_scc1 bb1
     1189       
     1190        s_min_u32 sa[2], sa[2], sa[4]
     1191        .cf_ret
     1192        s_setpc_b64 s[0:1]
     1193       
     1194bb1:    s_and_b32 sa[2], sa[2], sa[4]
     1195        .cf_ret
     1196        s_setpc_b64 s[0:1]
     1197)ffDXD"
     1198    }
     1199#endif
    11481200};
    11491201
Note: See TracChangeset for help on using the changeset viewer.