Changeset 4061 in CLRX


Ignore:
Timestamp:
May 2, 2018, 8:37:55 PM (6 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: add handleSSAEntryWhileJoining (joinRegVarLivenesses).

File:
1 edited

Legend:

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

    r4060 r4061  
    777777}
    778778
     779static void handleSSAEntryWhileJoining(
     780            const std::unordered_map<AsmSingleVReg, size_t>* stackVarMap,
     781            std::unordered_map<AsmSingleVReg, size_t>& alreadyReadMap,
     782            FlowStackEntry3& entry, const SSAEntry& sentry,
     783            const std::deque<FlowStackEntry3>& prevFlowStack,
     784            const std::vector<CodeBlock>& codeBlocks, const VarIndexMap* vregIndexMaps,
     785            std::vector<Liveness>* livenesses, size_t regTypesNum, const cxuint* regRanges)
     786{
     787    auto pfEnd = prevFlowStack.end();
     788    --pfEnd;
     789   
     790    const SSAInfo& sinfo = sentry.second;
     791    auto res = alreadyReadMap.insert({ sentry.first, entry.blockIndex });
     792   
     793    if (res.second && sinfo.readBeforeWrite)
     794    {
     795        /*if (cacheSecPoints != nullptr)
     796        {
     797            auto res = cacheSecPoints->insert({ sentry.first, { sinfo.ssaIdBefore } });
     798            if (!res.second)
     799                res.first->second.insertValue(sinfo.ssaIdBefore);
     800        }*/
     801       
     802        if (stackVarMap != nullptr)
     803        {
     804            // join liveness for this variable ssaId>.
     805            // only if in previous block previous SSAID is
     806            // read before all writes
     807            auto it = stackVarMap->find(sentry.first);
     808           
     809            const size_t pfStart = (it != stackVarMap->end() ? it->second : 0);
     810            //if (it == stackVarMap.end())
     811                //continue;
     812            // fill up previous part
     813            Liveness& lv = getLiveness(sentry.first, 0, sinfo,
     814                    livenesses, vregIndexMaps, regTypesNum, regRanges);
     815            auto flit = prevFlowStack.begin() + pfStart;
     816            {
     817                // fill up liveness for first code block
     818                const CodeBlock& cblock = codeBlocks[flit->blockIndex];
     819                auto ssaInfoIt = cblock.ssaInfoMap.find(sentry.first);
     820                size_t prevLastPos = (ssaInfoIt != cblock.ssaInfoMap.end()) ?
     821                        ssaInfoIt->second.lastPos+1 : cblock.start;
     822                lv.insert(prevLastPos, cblock.end);
     823            }
     824           
     825            for (++flit; flit != pfEnd; ++flit)
     826            {
     827                const CodeBlock& cblock = codeBlocks[flit->blockIndex];
     828                lv.insert(cblock.start, cblock.end);
     829            }
     830        }
     831    }
     832}
     833
    779834static void joinRegVarLivenesses(const std::deque<FlowStackEntry3>& prevFlowStack,
    780835        const std::vector<CodeBlock>& codeBlocks, const VarIndexMap* vregIndexMaps,
     
    818873                ARDOut << "  lvjoin: " << entry.blockIndex << "\n";
    819874                for (const auto& sentry: cblock.ssaInfoMap)
    820                 {
    821                     const SSAInfo& sinfo = sentry.second;
    822                     auto res = alreadyReadMap.insert({ sentry.first, entry.blockIndex });
    823                    
    824                     if (res.second && sinfo.readBeforeWrite)
    825                     {
    826                         // join liveness for this variable ssaId>.
    827                         // only if in previous block previous SSAID is
    828                         // read before all writes
    829                         auto it = stackVarMap.find(sentry.first);
    830                        
    831                         const size_t pfStart = (it != stackVarMap.end() ? it->second : 0);
    832                         //if (it == stackVarMap.end())
    833                             //continue;
    834                         // fill up previous part
    835                         Liveness& lv = getLiveness(sentry.first, 0, sinfo,
    836                                 livenesses, vregIndexMaps, regTypesNum, regRanges);
    837                         auto flit = prevFlowStack.begin() + pfStart;
    838                         {
    839                             // fill up liveness for first code block
    840                             const CodeBlock& cblock = codeBlocks[flit->blockIndex];
    841                             auto ssaInfoIt = cblock.ssaInfoMap.find(sentry.first);
    842                             size_t prevLastPos = (ssaInfoIt != cblock.ssaInfoMap.end()) ?
    843                                     ssaInfoIt->second.lastPos+1 : cblock.start;
    844                             lv.insert(prevLastPos, cblock.end);
    845                         }
    846                        
    847                         for (++flit; flit != pfEnd; ++flit)
    848                         {
    849                             const CodeBlock& cblock = codeBlocks[flit->blockIndex];
    850                             lv.insert(cblock.start, cblock.end);
    851                         }
    852                     }
    853                 }
     875                    handleSSAEntryWhileJoining(&stackVarMap, alreadyReadMap, entry, sentry,
     876                                //toCache ? &cacheSecPoints : nullptr)
     877                                prevFlowStack, codeBlocks, vregIndexMaps, livenesses,
     878                                regTypesNum, regRanges);
    854879            }
    855880            /*else
Note: See TracChangeset for help on using the changeset viewer.