Changeset 3843 in CLRX


Ignore:
Timestamp:
Feb 23, 2018, 7:51:30 PM (14 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Remove obsolete routine.

File:
1 edited

Legend:

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

    r3841 r3843  
    881881            std::cout << " " << v;
    882882        std::cout << std::endl;
    883     }
    884 }
    885 
    886 static void collectSSAIdsForCall(const std::deque<FlowStackEntry>& prevFlowStack,
    887         const std::deque<CallStackEntry>& prevCallStack,
    888         const std::vector<bool>& prevVisited,
    889         std::unordered_map<size_t, RoutineData>& routineMap,
    890         const std::vector<CodeBlock>& codeBlocks)
    891 {
    892     std::deque<FlowStackEntry> flowStack;
    893     // total SSA count
    894     std::unordered_map<AsmSingleVReg, size_t> totalSSACountMap;
    895     // last SSA ids map from returns
    896     LastSSAIdMap retSSAIdMap;
    897     // last SSA ids in current way in code flow
    898     std::unordered_map<AsmSingleVReg, size_t> curSSAIdMap;
    899    
    900     std::vector<bool> visited(codeBlocks.size(), false);
    901     flowStack.push_back({ 0, 0 });
    902    
    903     RoutineData& rdata = routineMap.find(prevCallStack.back().routineBlock)->second;
    904    
    905     while (!flowStack.empty())
    906     {
    907         FlowStackEntry& entry = flowStack.back();
    908         const CodeBlock& cblock = codeBlocks[entry.blockIndex];
    909        
    910         if (entry.nextIndex == 0)
    911         {
    912             // process current block
    913             if (!visited[entry.blockIndex])
    914             {
    915                 visited[entry.blockIndex] = true;
    916                
    917                 for (const auto& ssaEntry: cblock.ssaInfoMap)
    918                 {
    919                     const SSAInfo& sinfo = ssaEntry.second;
    920                     curSSAIdMap[ssaEntry.first] = sinfo.ssaIdLast != SIZE_MAX ?
    921                         sinfo.ssaIdLast : sinfo.ssaIdBefore+1;
    922                    
    923                     if (sinfo.ssaIdChange != 0)
    924                     {
    925                         // put last SSAId
    926                         auto res = rdata.curSSAIdMap.insert({ ssaEntry.first,
    927                                 { sinfo.ssaIdLast } });
    928                         if (!res.second)
    929                         {
    930                             // if not inserted
    931                             std::vector<size_t>& ssaIds = res.first->second;
    932                             auto ssaIdIt = ssaIds.end();
    933                             if (sinfo.readBeforeWrite)
    934                                 ssaIdIt = std::find(ssaIds.begin(), ssaIds.end(),
    935                                         sinfo.ssaIdBefore);
    936                             if (ssaIdIt == ssaIds.end())
    937                                 ssaIds.push_back(sinfo.ssaIdLast);
    938                             else
    939                                 *ssaIdIt = sinfo.ssaIdLast;
    940                         }
    941                     }
    942                 }
    943             }
    944             else
    945             {
    946                 // join routine data
    947                 auto rit = routineMap.find(entry.blockIndex);
    948                 if (rit != routineMap.end())
    949                     // just join with current routine data
    950                     joinRoutineData(rdata, rit->second);
    951                
    952                 collectSSAIdsForCall(flowStack, prevCallStack, visited,
    953                             routineMap, codeBlocks);
    954                 // back, already visited
    955                 flowStack.pop_back();
    956                 continue;
    957             }
    958         }
    959        
    960         if (entry.nextIndex < cblock.nexts.size() &&
    961             prevVisited[cblock.nexts[entry.nextIndex].block])
    962         {
    963             flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
    964             entry.nextIndex++;
    965         }
    966         else if (((entry.nextIndex==0 && cblock.nexts.empty()) ||
    967                 // if have any call then go to next block
    968                 (cblock.haveCalls && entry.nextIndex==cblock.nexts.size())) &&
    969                  !cblock.haveReturn && !cblock.haveEnd &&
    970                  prevVisited[entry.blockIndex+1])
    971         {
    972             flowStack.push_back({ entry.blockIndex+1, 0 });
    973             entry.nextIndex++;
    974         }
    975         else // back
    976         {
    977             flowStack.pop_back();
    978             // previous code block
    979             const CodeBlock& pcblock = codeBlocks[((!flowStack.empty()) ?
    980                     flowStack.back().blockIndex : prevFlowStack.back().blockIndex)];
    981            
    982             //std::cout << "  popresolv" << std::endl;
    983             for (const auto& ssaEntry: cblock.ssaInfoMap)
    984             {
    985                 size_t& curSSAId = curSSAIdMap[ssaEntry.first];
    986                 const size_t nextSSAId = curSSAId;
    987                 curSSAId = ssaEntry.second.ssaIdBefore+1;
    988                 auto psit = pcblock.ssaInfoMap.find(ssaEntry.first);
    989                 if (psit != pcblock.ssaInfoMap.end())
    990                     curSSAId = psit->second.ssaIdLast;
    991                
    992                 std::vector<size_t>& ssaIds = rdata.curSSAIdMap
    993                         .find(ssaEntry.first)->second;
    994                
    995                 if (!cblock.nexts.empty() || (!cblock.haveEnd && !cblock.haveReturn))
    996                 {   // if cblock with some children
    997                     auto nit = std::find(ssaIds.begin(), ssaIds.end(), nextSSAId-1);
    998                     if (nit != ssaIds.end())
    999                         ssaIds.erase(nit);  // just remove
    1000                 }
    1001                 // push previous SSAId to lastSSAIdMap (later will be replaced)
    1002                 if (std::find(ssaIds.begin(), ssaIds.end(), curSSAId-1) == ssaIds.end())
    1003                     ssaIds.push_back(curSSAId-1);
    1004             }
    1005         }
    1006883    }
    1007884}
Note: See TracChangeset for help on using the changeset viewer.