Changeset 4116 in CLRX


Ignore:
Timestamp:
May 8, 2018, 3:45:53 PM (2 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Remove applyToLiveCallTime and callLiveTimesMap and callLiveTime (change concept of joining
svreg from routines and svreg between this routine calls). Fixed joinVRegRecur: check first whether first position in flowStack is not beyond end.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r4115 r4116  
    740740
    741741
    742 static void applyToLiveCallTime(size_t block, Liveness& lv,
    743             const std::vector<CodeBlock>& codeBlocks, const RoutineLvMap& routineMap,
    744             const std::unordered_map<size_t, size_t>& callLiveTimesMap)
    745 {
    746     auto cit = callLiveTimesMap.find(block);
    747     if (cit != callLiveTimesMap.end())
    748     {
    749         size_t callLiveTime = cit->second;
    750         const CodeBlock& cblock = codeBlocks[block];
    751         for (const NextBlock& next: cblock.nexts)
    752             if (next.isCall)
    753             {
    754                 const auto& allLvs= routineMap.find(next.block)->second.allLivenesses;
    755                 if (allLvs.find(&lv) == allLvs.end())
    756                     // add callLiveTime only if vreg not present in routine
    757                     lv.insert(callLiveTime, callLiveTime+1);
    758                 callLiveTime--;
    759             }
    760     }
    761 }
    762 
    763742static void fillUpInsideRoutine(std::vector<bool>& visited,
    764             const std::vector<CodeBlock>& codeBlocks, const RoutineLvMap& routineMap,
    765             const std::unordered_map<size_t, size_t>& callLiveTimesMap,
     743            const std::vector<CodeBlock>& codeBlocks,
    766744            size_t startBlock, const AsmSingleVReg& svreg, Liveness& lv)
    767745{
     
    793771                // just insert
    794772                lv.insert(cbStart, cblock.end);
    795                
    796                 applyToLiveCallTime(entry.blockIndex, lv, codeBlocks, routineMap,
    797                         callLiveTimesMap);
    798773            }
    799774            else
     
    824799static void joinVRegRecur(const std::deque<FlowStackEntry3>& flowStack,
    825800            const std::vector<CodeBlock>& codeBlocks, const RoutineLvMap& routineMap,
    826             const std::unordered_map<size_t, size_t>& callLiveTimesMap,
    827801            LastVRegStackPos flowStkStart, const AsmSingleVReg& svreg, size_t ssaId,
    828802            const VarIndexMap* vregIndexMaps, std::vector<Liveness>* livenesses,
     
    901875            /* if inSubroutines, then first block
    902876             * (that with subroutines calls) will be skipped */
    903             fillUpInsideRoutine(visited, codeBlocks, routineMap, callLiveTimesMap,
     877            fillUpInsideRoutine(visited, codeBlocks,
    904878                    entry.blockIndex + (entry.inSubroutines), svreg, lv);
    905879            rjStack.pop();
     
    910884    const CodeBlock& lastBlk = codeBlocks[flit->blockIndex];
    911885   
    912     applyToLiveCallTime(flit->blockIndex, lv, codeBlocks, routineMap, callLiveTimesMap);
    913    
    914     auto sinfoIt = lastBlk.ssaInfoMap.find(svreg);
    915     size_t lastPos = lastBlk.start;
    916     if (sinfoIt != lastBlk.ssaInfoMap.end())
    917     {
    918         // if begin at some point at last block
    919         lastPos = sinfoIt->second.lastPos;
    920         lv.insert(lastPos + 1, lastBlk.end);
    921         ++flit; // skip last block in stack
     886    if (flit != flitEnd)
     887    {
     888        auto sinfoIt = lastBlk.ssaInfoMap.find(svreg);
     889        size_t lastPos = lastBlk.start;
     890        if (sinfoIt != lastBlk.ssaInfoMap.end())
     891        {
     892            // if begin at some point at last block
     893            lastPos = sinfoIt->second.lastPos;
     894            lv.insert(lastPos + 1, lastBlk.end);
     895            ++flit; // skip last block in stack
     896        }
    922897    }
    923898    // fill up to this
     
    925900    {
    926901        const CodeBlock& cblock = codeBlocks[flit->blockIndex];
    927         applyToLiveCallTime(flit->blockIndex, lv, codeBlocks,
    928                         routineMap, callLiveTimesMap);
    929902        lv.insert(cblock.start, cblock.end);
    930903    }
     
    938911static void putCrossBlockLivenesses(const std::deque<FlowStackEntry3>& flowStack,
    939912        const std::vector<CodeBlock>& codeBlocks, const RoutineLvMap& routineMap,
    940         const std::unordered_map<size_t, size_t>& callLiveTimesMap,
    941913        const LastVRegMap& lastVRegMap, std::vector<Liveness>* livenesses,
    942914        const VarIndexMap* vregIndexMaps, size_t regTypesNum, const cxuint* regRanges)
     
    952924                lvrit->second.back() : LastVRegStackPos{ 0, false };
    953925           
    954             joinVRegRecur(flowStack, codeBlocks, routineMap, callLiveTimesMap,
    955                     flowStackStart, entry.first, entry.second.ssaIdBefore,
    956                     vregIndexMaps, livenesses, regTypesNum, regRanges, true);
     926            joinVRegRecur(flowStack, codeBlocks, routineMap, flowStackStart,
     927                    entry.first, entry.second.ssaIdBefore, vregIndexMaps, livenesses,
     928                    regTypesNum, regRanges, true);
    957929        }
    958930}
     
    11051077static void joinRegVarLivenesses(const std::deque<FlowStackEntry3>& prevFlowStack,
    11061078        const std::vector<CodeBlock>& codeBlocks, const RoutineLvMap& routineMap,
    1107         const std::unordered_map<size_t, size_t>& callLiveTimesMap,
    11081079        const PrevWaysIndexMap& prevWaysIndexMap,
    11091080        const std::vector<bool>& waysToCache, ResSecondPointsToCache& cblocksToCache,
     
    12111182                                        it->second : LastVRegStackPos{ 0, false });
    12121183                           
    1213                             joinVRegRecur(prevFlowStack, codeBlocks, routineMap,
    1214                                 callLiveTimesMap, stackPos,
     1184                            joinVRegRecur(prevFlowStack, codeBlocks, routineMap, stackPos,
    12151185                                sentry.first, sentry.second.ssaIdBefore, vregIndexMaps,
    12161186                                livenesses, regTypesNum, regRanges, true);
     
    12351205                                        it->second : LastVRegStackPos{ 0, false });
    12361206                           
    1237                             joinVRegRecur(prevFlowStack, codeBlocks, routineMap,
    1238                                 callLiveTimesMap, stackPos,
     1207                            joinVRegRecur(prevFlowStack, codeBlocks, routineMap, stackPos,
    12391208                                rsentry.first, rsentry.second, vregIndexMaps,
    12401209                                livenesses, regTypesNum, regRanges, true);
     
    16591628    RoutineLvMap routineMap;
    16601629    std::vector<Liveness> livenesses[MAX_REGTYPES_NUM];
    1661     std::unordered_map<size_t, size_t> callLiveTimesMap;
    16621630   
    16631631    for (size_t i = 0; i < regTypesNum; i++)
     
    16671635    // reverse counted, begin from SIZE_MAX, used for joining svreg from routines
    16681636    // and svreg used in this time
    1669     size_t callLiveTime = SIZE_MAX-1;
    16701637    size_t curLiveTime = 0;
    16711638    flowStack.push_back({ 0, 0 });
     
    16851652                ARDOut << "joinpush: " << entry.blockIndex << "\n";
    16861653                if (flowStack.size() > 1)
    1687                     putCrossBlockLivenesses(flowStack, codeBlocks, routineMap,
    1688                             callLiveTimesMap, lastVRegMap,
     1654                    putCrossBlockLivenesses(flowStack, codeBlocks, routineMap, lastVRegMap,
    16891655                            livenesses, vregIndexMaps, regTypesNum, regRanges);
    16901656                // update last vreg position
     
    18321798                            lvrit->second.back() : LastVRegStackPos{ 0, false };
    18331799                   
    1834                     joinVRegRecur(flowStack, codeBlocks, routineMap,
    1835                             callLiveTimesMap, flowStackStart,
     1800                    joinVRegRecur(flowStack, codeBlocks, routineMap, flowStackStart,
    18361801                            entry.first, entry.second, vregIndexMaps,
    18371802                            livenesses, regTypesNum, regRanges, false);
     
    18611826            if (entry.nextIndex!=0) // if back from calls (just return from calls)
    18621827            {
    1863                 callLiveTimesMap.insert({ entry.blockIndex, callLiveTime });
    1864                
    18651828                std::unordered_set<AsmSingleVReg> regSVRegs;
    18661829                // just add last access of svreg from call routines to lastVRegMap
     
    18801843                                                { flowStack.size()-1, true });
    18811844                            }
    1882                        
    1883                         for(Liveness* lv: rdata.allLivenesses)
    1884                             lv->insert(callLiveTime, callLiveTime+1);
    1885                         callLiveTime--;
    18861845                    }
    18871846            }
     
    19421901            else
    19431902            {
    1944                 joinRegVarLivenesses(flowStack, codeBlocks, routineMap, callLiveTimesMap,
     1903                joinRegVarLivenesses(flowStack, codeBlocks, routineMap,
    19451904                        prevWaysIndexMap, waysToCache, cblocksToCache,
    19461905                        joinFirstPointsCache, joinSecondPointsCache,
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4115 r4116  
    979979    {   // 17 - simple call
    980980        R"ffDXD(.regvar sa:s:8, va:v:8
    981         s_mov_b32 sa[2], s4
    982         s_mov_b32 sa[3], s5
    983        
    984         s_getpc_b64 s[2:3]
    985         s_add_u32 s2, s2, routine-.
    986         s_add_u32 s3, s3, routine-.+4
     981        s_mov_b32 sa[2], s4             # 0
     982        s_mov_b32 sa[3], s5             # 4
     983       
     984        s_getpc_b64 s[2:3]              # 8
     985        s_add_u32 s2, s2, routine-.     # 12
     986        s_add_u32 s3, s3, routine-.+4   # 20
    987987        .cf_call routine
    988         s_swappc_b64 s[0:1], s[2:3]
    989        
    990         s_lshl_b32 sa[2], sa[2], 3
    991         s_lshl_b32 sa[3], sa[3], 4
    992         s_endpgm
     988        s_swappc_b64 s[0:1], s[2:3]     # 28
     989       
     990        s_lshl_b32 sa[2], sa[2], 3      # 32
     991        s_lshl_b32 sa[3], sa[3], 4      # 36
     992        s_endpgm                        # 40
    993993       
    994994routine:
    995         s_xor_b32 sa[2], sa[2], sa[4]
    996         s_xor_b32 sa[3], sa[3], sa[4]
     995        s_xor_b32 sa[2], sa[2], sa[4]   # 44
     996        s_xor_b32 sa[3], sa[3], sa[4]   # 48
    997997        .cf_ret
    998         s_setpc_b64 s[0:1]
     998        s_setpc_b64 s[0:1]              # 52
    999999)ffDXD",
    10001000        {
     1001            {   // for SGPRs
     1002                { { 29, 32 }, { 44, 53 }, { SIZE_MAX-1, SIZE_MAX } }, // 0: S0
     1003                { }, // 1: S1
     1004                { }, // 2: S2
     1005                { }, // 3: S3
     1006                { }, // 4: S4
     1007                { }, // 5: S5
     1008                { }, // 6: sa[2]'0
     1009                { }, // 7: sa[2]'1
     1010                { }, // 8: sa[2]'2
     1011                { }, // 9: sa[3]'0
     1012                { }, // 10: sa[3]'1
     1013                { }, // 11: sa[3]'2
     1014                { }  // 12: sa[4]'0
     1015            },
     1016            { },
     1017            { },
     1018            { }
    10011019        },
    10021020        {
     1021            { },
     1022            { },
     1023            { },
     1024            { }
    10031025        },
    10041026        true, ""
Note: See TracChangeset for help on using the changeset viewer.