Changeset 4162 in CLRX


Ignore:
Timestamp:
May 14, 2018, 2:38:45 PM (11 days ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixes for next recursion testcases (still doesn't work). Small fix in fillUpInsideRoutine.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r4161 r4162  
    119119            if (next.isCall)
    120120            {
    121                 const auto& allLvs = vidxRoutineMap.find(next.block)->second;
     121                auto vidxRIt = vidxRoutineMap.find(next.block);
     122                if (vidxRIt == vidxRoutineMap.end())
     123                    continue;
     124                const auto& allLvs = vidxRIt->second;
    122125                if (allLvs.vs[regType].find(vidx) == allLvs.vs[regType].end())
    123126                    // add callLiveTime only if vreg not present in routine
     
    250253                }
    251254                if (endOfPath && sinfoIt != cblock.ssaInfoMap.end())
    252                     cbEnd = sinfoIt->second.firstPos;
     255                    cbEnd = sinfoIt->second.firstPos+1;
    253256                // fill up block
    254257                lv.insert(cbStart, cbEnd);
     
    914917
    915918static void createRoutineDataLv(const std::vector<CodeBlock>& codeBlocks,
    916         const RoutineLvMap& routineMap,
     919        const RoutineLvMap& routineMap, const std::unordered_set<size_t>& recurseBlocks,
    917920        const std::unordered_map<size_t, VIdxSetEntry>& vidxRoutineMap,
    918921        RoutineDataLv& rdata, VIdxSetEntry& routineVIdxes,
     
    10101013            {
    10111014                size_t rblock = cblock.nexts[entry.nextIndex].block;
    1012                 if (rblock != routineBlock)
     1015                if (rblock != routineBlock &&
     1016                    recurseBlocks.find(rblock) == recurseBlocks.end())
    10131017                    calledRoutines.push_back(rblock);
    10141018            }
     
    10161020            for (size_t srcRoutBlock: calledRoutines)
    10171021            {
     1022                auto srcRIt = routineMap.find(srcRoutBlock);
     1023                if (srcRIt == routineMap.end())
     1024                    continue; // skip not initialized recursion
    10181025                // update svregs 'not in all returns'
    1019                 const RoutineDataLv& srcRdata = routineMap.find(srcRoutBlock)->second;
     1026                const RoutineDataLv& srcRdata = srcRIt->second;
    10201027                if (notFirstReturn)
    10211028                    for (const auto& vrentry: srcRdata.rbwSSAIdMap)
     
    12041211    ResSecondPointsToCache cblocksToCache(codeBlocks.size());
    12051212    std::unordered_set<size_t> callBlocks;
     1213    std::unordered_set<size_t> recurseBlocks;
    12061214   
    12071215    size_t rbwCount = 0;
     
    13711379            {
    13721380                auto varRes = vidxRoutineMap.insert({ routineBlock, VIdxSetEntry{} });
    1373                 createRoutineDataLv(codeBlocks, routineMap, vidxRoutineMap,
     1381                createRoutineDataLv(codeBlocks, routineMap, recurseBlocks, vidxRoutineMap,
    13741382                        res.first->second, varRes.first->second,
    13751383                        routineBlock, vregIndexMaps, regTypesNum, regRanges);
     
    14061414                {
    14071415                    // just skip recursion (is good?)
     1416                    recurseBlocks.insert(nextBlock);
    14081417                    entry.nextIndex++;
    14091418                    continue;
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4161 r4162  
    26432643        true, ""
    26442644    }
     2645#if 0
     2646    ,
     2647    {   // 41 - second recursion testcase
     2648        R"ffDXD(.regvar sa:s:8, va:v:8
     2649        s_mov_b32 sa[2], s4             # 0
     2650        s_mov_b32 sa[3], s4             # 4
     2651        s_mov_b32 sa[4], s5             # 8
     2652        s_mov_b32 sa[5], s6             # 12
     2653        s_mov_b32 sa[6], s7             # 16
     2654       
     2655        .cf_call routine
     2656        s_swappc_b64 s[0:1], s[2:3]     # 20
     2657       
     2658        s_add_u32 sa[2], sa[2], sa[0]   # 24
     2659        s_add_u32 sa[3], sa[3], sa[0]   # 28
     2660        s_add_u32 sa[4], sa[4], sa[1]   # 32
     2661        s_add_u32 sa[5], sa[5], sa[1]   # 36
     2662        s_add_u32 sa[6], sa[6], sa[1]   # 40
     2663        s_endpgm                        # 44
     2664       
     2665routine:
     2666        s_xor_b32 sa[2], sa[2], sa[0]   # 48
     2667        s_xor_b32 sa[3], sa[3], sa[1]   # 52
     2668        s_cbranch_vccnz b0              # 56
     2669       
     2670        .cf_call routine2
     2671        s_swappc_b64 s[0:1], s[2:3]     # 60
     2672       
     2673        s_xor_b32 sa[3], sa[3], sa[1]   # 64
     2674        s_xor_b32 sa[6], sa[6], sa[1]   # 68
     2675        s_xor_b32 sa[5], sa[5], sa[0]   # 72
     2676        .cf_ret
     2677        s_setpc_b64 s[0:1]              # 76
     2678       
     2679b0:     s_xor_b32 sa[3], sa[3], sa[0]   # 80
     2680        s_xor_b32 sa[2], sa[2], sa[0]   # 84
     2681        s_xor_b32 sa[6], sa[6], sa[0]   # 88
     2682        .cf_ret
     2683        s_setpc_b64 s[0:1]              # 92
     2684       
     2685routine2:
     2686        s_xor_b32 sa[2], sa[2], sa[0]   # 96
     2687        s_xor_b32 sa[3], sa[3], sa[1]   # 100
     2688        s_cbranch_vccnz b1              # 104
     2689       
     2690        .cf_call routine
     2691        s_swappc_b64 s[0:1], s[2:3]     # 108
     2692       
     2693        s_xor_b32 sa[3], sa[3], sa[1]   # 112
     2694        s_xor_b32 sa[6], sa[6], sa[1]   # 116
     2695        s_xor_b32 sa[4], sa[4], sa[0]   # 120
     2696        .cf_ret
     2697        s_setpc_b64 s[0:1]              # 124
     2698       
     2699b1:     s_xor_b32 sa[3], sa[3], sa[0]   # 128
     2700        s_xor_b32 sa[2], sa[2], sa[0]   # 132
     2701        s_xor_b32 sa[6], sa[6], sa[0]   # 136
     2702        .cf_ret
     2703        s_setpc_b64 s[0:1]              # 140
     2704)ffDXD",
     2705        {   // livenesses
     2706            {   // for SGPRs
     2707                { { 21, 24 }, { 48, 60 }, { 61, 108 }, { 109, 144 } }, // 0: S0
     2708                { { 21, 24 }, { 48, 60 }, { 61, 108 }, { 109, 144 } }, // 1: S1
     2709                { { 0, 24 }, { 48, 64 }, { 96, 112 } }, // 2: S2
     2710                { { 0, 24 }, { 48, 64 }, { 96, 112 } }, // 3: S3
     2711                { { 0, 5 } }, // 4: S4
     2712                { { 0, 9 } }, // 5: S5
     2713                { { 0, 13 } }, // 6: s6
     2714                { { 0, 17 } }, // 7: S7
     2715                { { 0, 29 }, { 48, 144 } }, // 8: sa[0]'0
     2716                { { 0, 41 }, { 48, 144 } }, // 9: sa[1]'0
     2717                { { 1, 25 }, { 48, 96 }, { 97, 112 }, { 128, 134 } }, // 10: sa[2]'0
     2718                { }, // 11: sa[2]'1
     2719                { }, // 12: sa[2]'2
     2720                { }, // 13: sa[3]'0
     2721                { }, // 14: sa[3]'1
     2722                { }, // 15: sa[3]'2
     2723                { }, // 16: sa[4]'0
     2724                { }, // 17: sa[4]'1
     2725                { }, // 18: sa[5]'0
     2726                { }, // 19: sa[5]'1
     2727                { }, // 20: sa[6]'0
     2728                { }  // 21: sa[6]'1
     2729            },
     2730            { },
     2731            { },
     2732            { }
     2733        },
     2734        { },
     2735        { },
     2736        { },
     2737        true, ""
     2738    }
     2739#endif
    26452740};
    26462741
Note: See TracChangeset for help on using the changeset viewer.