Changeset 4065 in CLRX


Ignore:
Timestamp:
May 3, 2018, 3:01:21 PM (6 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Add weight to SVRegMap. Put some functions to another routines (code reorganization).

Location:
CLRadeonExtender/trunk/amdasm
Files:
2 edited

Legend:

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

    r4064 r4065  
    825825}
    826826
    827 static void handleSSAEntryWhileJoining(const SVRegMap* stackVarMap,
    828             SVRegMap& alreadyReadMap, FlowStackEntry3& entry, const SSAEntry& sentry,
    829             SVRegMap* cacheSecPoints, const std::deque<FlowStackEntry3>& prevFlowStack,
    830             const std::vector<CodeBlock>& codeBlocks, const VarIndexMap* vregIndexMaps,
    831             std::vector<Liveness>* livenesses, size_t regTypesNum, const cxuint* regRanges)
    832 {
    833     auto pfEnd = prevFlowStack.end();
    834     --pfEnd;
    835    
    836     const SSAInfo& sinfo = sentry.second;
    837     auto res = alreadyReadMap.insert({ sentry.first, entry.blockIndex });
    838    
    839     if (res.second && sinfo.readBeforeWrite)
    840     {
    841         if (cacheSecPoints != nullptr)
    842         {
    843             auto res = cacheSecPoints->insert({ sentry.first, sinfo.ssaIdBefore });
    844             if (!res.second)
    845                 res.first->second = sinfo.ssaIdBefore;
    846         }
    847        
    848         if (stackVarMap != nullptr)
    849             joinSVregWithVisited(stackVarMap, sentry.first,
    850                     sentry.second.ssaIdBefore, prevFlowStack,
    851                     codeBlocks, vregIndexMaps, livenesses, regTypesNum, regRanges);
    852     }
    853 }
    854 
    855827static void useJoinSecPointCache(const SVRegMap* stackVarMap,
    856828        const SVRegBlockMap& alreadyReadMap,
    857829        const SVRegMap* resSecondPoints, size_t nextBlock,
    858         SVRegMap* destCacheSecPoints,
    859830        const std::deque<FlowStackEntry3>& prevFlowStack,
    860831        const std::vector<CodeBlock>& codeBlocks, const VarIndexMap* vregIndexMaps,
     
    866837    {
    867838        const bool alreadyRead = alreadyReadMap.find(rsentry.first) != alreadyReadMap.end();
    868         if (destCacheSecPoints != nullptr && !alreadyRead)
    869         {
    870             auto res = destCacheSecPoints->insert(rsentry);
    871             if (!res.second)
    872                 res.first->second = rsentry.second;
    873         }
    874        
    875         if (stackVarMap != nullptr)
    876         {
    877             if (!alreadyRead)
    878                 joinSVregWithVisited(stackVarMap, rsentry.first, rsentry.second,
    879                     prevFlowStack, codeBlocks, vregIndexMaps, livenesses, regTypesNum,
    880                     regRanges);
    881         }
     839        if (stackVarMap != nullptr && !alreadyRead)
     840            joinSVregWithVisited(stackVarMap, rsentry.first, rsentry.second,
     841                prevFlowStack, codeBlocks, vregIndexMaps, livenesses, regTypesNum,
     842                regRanges);
    882843    }
    883844}
     
    916877                if (resSecondPoints == nullptr)
    917878                {
     879                    // if joinSecondPointCache not found
    918880                    for (auto& sentry: cblock.ssaInfoMap)
    919                         /*handleSSAEntryWhileResolving(nullptr, nullptr,
    920                                 alreadyReadMap, entry, sentry,
    921                                 &cacheSecPoints)*/;
     881                    {
     882                        const SSAInfo& sinfo = sentry.second;
     883                        auto res = alreadyReadMap.insert(
     884                                    { sentry.first, entry.blockIndex });
     885                       
     886                        if (res.second && sinfo.readBeforeWrite)
     887                        {
     888                            auto res = cacheSecPoints.insert(
     889                                        { sentry.first, sinfo.ssaIdBefore });
     890                           
     891                            if (!res.second)
     892                                res.first->second = sinfo.ssaIdBefore;
     893                        }
     894                    }
    922895                }
    923896                else // to use cache
    924897                {
    925                     /*useResSecPointCache(nullptr, nullptr, alreadyReadMap,
    926                             resSecondPoints, entry.blockIndex, &cacheSecPoints);*/
     898                    // add to current cache sec points
     899                    for (const auto& rsentry: *resSecondPoints)
     900                    {
     901                        const bool alreadyRead =
     902                            alreadyReadMap.find(rsentry.first) != alreadyReadMap.end();
     903                        if (!alreadyRead)
     904                        {
     905                            auto res = cacheSecPoints.insert(rsentry);
     906                            if (!res.second)
     907                                res.first->second = rsentry.second;
     908                        }
     909                    }
    927910                    flowStack.pop_back();
    928911                    continue;
     
    997980    }
    998981   
    999     //resSecondPointsCache.put(nextBlock, cacheSecPoints);
     982    resSecondPointsCache.put(nextBlock, cacheSecPoints);
    1000983}
    1001984
     
    10411024                ARDOut << "  lvjoin: " << entry.blockIndex << "\n";
    10421025                for (const auto& sentry: cblock.ssaInfoMap)
    1043                     handleSSAEntryWhileJoining(&stackVarMap, alreadyReadMap, entry, sentry,
    1044                                 nullptr,
    1045                                 prevFlowStack, codeBlocks, vregIndexMaps, livenesses,
    1046                                 regTypesNum, regRanges);
     1026                {
     1027                    const SSAInfo& sinfo = sentry.second;
     1028                    auto res = alreadyReadMap.insert({ sentry.first, entry.blockIndex });
     1029                   
     1030                    if (res.second && sinfo.readBeforeWrite)
     1031                        joinSVregWithVisited(&stackVarMap, sentry.first,
     1032                            sentry.second.ssaIdBefore, prevFlowStack, codeBlocks,
     1033                            vregIndexMaps, livenesses, regTypesNum, regRanges);
     1034                }
    10471035            }
    10481036            /*else
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.h

    r4062 r4065  
    137137
    138138typedef std::unordered_map<AsmSingleVReg, BlockIndex> SVRegBlockMap;
    139 typedef std::unordered_map<AsmSingleVReg, size_t> SVRegMap;
     139
     140class CLRX_INTERNAL SVRegMap: public std::unordered_map<AsmSingleVReg, size_t>
     141{
     142public:
     143    SVRegMap()
     144    { }
     145   
     146    size_t weight() const
     147    { return size(); }
     148};
     149
    140150typedef LastSSAIdMap RBWSSAIdMap;
    141151typedef std::unordered_map<BlockIndex, VectorSet<BlockIndex> > SubrLoopsMap;
     
    159169{
    160170    // rbwSSAIdMap - read before write SSAId's map
    161     std::unordered_map<AsmSingleVReg, size_t> rbwSSAIdMap;
    162     std::unordered_map<AsmSingleVReg, size_t> origRbwSSAIdMap;
     171    SVRegMap rbwSSAIdMap;
     172    SVRegMap origRbwSSAIdMap;
    163173    LastSSAIdMap curSSAIdMap;
    164174    LastSSAIdMap lastSSAIdMap;
Note: See TracChangeset for help on using the changeset viewer.