Changeset 4148 in CLRX


Ignore:
Timestamp:
May 11, 2018, 8:25:30 PM (4 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: First working testcase with routine with end (s_endpgm) (createLivenesses).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r4124 r4148  
    239239    // key - svreg, value - list of the last codeblocks where is svreg
    240240    LastAccessMap lastAccessMap;
     241    std::unordered_set<size_t> haveReturnBlocks;
    241242};
    242243
     
    272273    size_t nextIndex;
    273274    bool isCall;
     275    bool haveReturn;
    274276    RoutineCurAccessMap prevCurSVRegMap;
    275277};
  • CLRadeonExtender/trunk/amdasm/AsmRegAllocLive.cpp

    r4140 r4148  
    132132            const std::unordered_map<size_t, VIdxSetEntry>& vidxRoutineMap,
    133133            size_t startBlock, const AsmSingleVReg& svreg, Liveness& lv,
    134             cxuint lvRType /* lv register type */, size_t vidx)
     134            cxuint lvRType /* lv register type */, size_t vidx,
     135            const std::unordered_set<size_t>& haveReturnBlocks)
    135136{
    136137    std::deque<FlowStackEntry3> flowStack;
     
    148149        if (entry.nextIndex == 0)
    149150        {
    150             if (visited.insert(entry.blockIndex).second)
     151            if (visited.insert(entry.blockIndex).second &&
     152                haveReturnBlocks.find(entry.blockIndex) != haveReturnBlocks.end())
    151153            {
    152154                size_t cbStart = cblock.start;
     
    207209        size_t lastAccessIndex; // last access pos index
    208210        bool inSubroutines;
     211        const std::unordered_set<size_t>* haveReturnBlocks;
    209212    };
    210213   
     
    221224    std::stack<JoinEntry> rjStack; // routine join stack
    222225    if (flowStkStart.inSubroutines)
    223         rjStack.push({ flowStack[flowStkStart.stackPos].blockIndex, 0, 0, true });
     226        rjStack.push({ flowStack[flowStkStart.stackPos].blockIndex,
     227                            0, 0, true, nullptr });
    224228   
    225229    while (!rjStack.empty())
     
    242246                        const auto& lastAccess =
    243247                                lastAccessIt->second[entry.lastAccessIndex];
    244                         rjStack.push({ lastAccess.blockIndex, 0,
    245                                     0, lastAccess.inSubroutines });
     248                        rjStack.push({ lastAccess.blockIndex, 0, 0,
     249                                lastAccess.inSubroutines, &rdata.haveReturnBlocks });
    246250                        entry.lastAccessIndex++;
    247251                        if (entry.lastAccessIndex == lastAccessIt->second.size())
     
    272276                fillUpInsideRoutine(visited, codeBlocks, vidxCallMap, vidxRoutineMap,
    273277                        entry.blockIndex + (entry.inSubroutines), svreg,
    274                         lv, lvRegType, vidx);
     278                        lv, lvRegType, vidx, *entry.haveReturnBlocks);
    275279            rjStack.pop();
    276280        }
     
    835839    std::unordered_set<AsmSingleVReg> vregsNotInAllRets;
    836840    std::unordered_set<AsmSingleVReg> vregsInFirstReturn;
     841    std::unordered_set<size_t>& haveReturnBlocks = rdata.haveReturnBlocks;
    837842   
    838843    bool notFirstReturn = false;
     
    896901            else
    897902            {
     903                const bool prevReturn = haveReturnBlocks.find(entry.blockIndex) !=
     904                        haveReturnBlocks.end();
    898905                flowStack.pop_back();
     906                // propagate haveReturn to previous block
     907                if (prevReturn)
     908                {
     909                    flowStack.back().haveReturn = true;
     910                    haveReturnBlocks.insert(flowStack.back().blockIndex);
     911                }
    899912                continue;
    900913            }
     
    951964                    if (!res.second)
    952965                        res.first->second.insertValue(entry.second);
     966                }
     967               
     968                entry.haveReturn = true;
     969                haveReturnBlocks.insert(entry.blockIndex);
     970            }
     971           
     972            if (cblock.haveReturn || cblock.haveEnd)
     973            {
     974                // handle return
     975                // add curSVReg access positions to lastAccessMap
     976                for (const auto& entry: curSVRegMap)
    953977                    if (!notFirstReturn)
    954978                        // fill up vregs for first return
    955979                        vregsInFirstReturn.insert(entry.first);
    956                 }
    957980                if (notFirstReturn)
    958981                    for (const AsmSingleVReg& vreg: vregsInFirstReturn)
     
    960983                            // not found in this path then add to 'not in all paths'
    961984                            vregsNotInAllRets.insert(vreg);
    962                
    963985                notFirstReturn = true;
    964986            }
     987           
     988            const bool curHaveReturn = entry.haveReturn;
     989           
    965990            // revert curSVRegMap
    966991            for (const auto& sentry: entry.prevCurSVRegMap)
     
    9801005            ARDOut << "  popjoin\n";
    9811006            flowStack.pop_back();
     1007            // set up haveReturn
     1008            if (!flowStack.empty())
     1009            {
     1010                flowStack.back().haveReturn |= curHaveReturn;
     1011                if (flowStack.back().haveReturn)
     1012                    haveReturnBlocks.insert(flowStack.back().blockIndex);
     1013            }
    9821014        }
    9831015    }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4147 r4148  
    19891989            { 5, { { { 7 }, { }, { }, { } } } },
    19901990            { 11, { { { 13 }, { }, { }, { } } } }
     1991        },
     1992        true, ""
     1993    },
     1994    {   // 31 - routine with ends (s_endpgm, no return)
     1995        R"ffDXD(.regvar sa:s:8, va:v:8
     1996        s_mov_b32 sa[2], s4             # 0
     1997        s_mov_b32 sa[3], s5             # 4
     1998        s_mov_b32 sa[5], s5             # 8
     1999       
     2000        s_getpc_b64 s[2:3]              # 12
     2001        s_add_u32 s2, s2, routine-.     # 16
     2002        s_add_u32 s3, s3, routine-.+4   # 24
     2003        .cf_call routine
     2004        s_swappc_b64 s[0:1], s[2:3]     # 32
     2005       
     2006        s_lshl_b32 sa[2], sa[2], 3      # 36
     2007        s_lshl_b32 sa[3], sa[3], sa[5]  # 40
     2008        s_endpgm                        # 44
     2009       
     2010routine:
     2011        s_xor_b32 sa[2], sa[2], sa[4]   # 48
     2012        s_cbranch_scc1 bb1              # 52
     2013       
     2014        s_min_u32 sa[2], sa[2], sa[4]   # 56
     2015        s_xor_b32 sa[3], sa[3], sa[4]   # 60
     2016        s_endpgm                        # 64
     2017       
     2018bb1:    s_and_b32 sa[2], sa[2], sa[4]   # 68
     2019        .cf_ret
     2020        s_setpc_b64 s[0:1]              # 72
     2021)ffDXD",
     2022        {   // livenesses
     2023            {   // for SGPRs
     2024                { { 33, 36 }, { 48, 56 }, { 68, 73 } }, // 0: S0
     2025                { { 33, 36 }, { 48, 56 }, { 68, 73 } }, // 1: S1
     2026                { { 13, 33 } }, // 2: S2
     2027                { { 13, 33 } }, // 3: S3
     2028                { { 0, 1 } }, // 4: S4
     2029                { { 0, 9 } }, // 5: S5
     2030                { { 1, 36 }, { 48, 49 } }, // 6: sa[2]'0
     2031                { { 49, 57 }, { 68, 69 } }, // 7: sa[2]'1
     2032                { { 57, 58 } }, // 8: sa[2]'2
     2033                { { 36, 37 }, { 69, 76 } }, // 9: sa[2]'3
     2034                { { 37, 38 } }, // 10: sa[2]'4
     2035                { { 5, 41 }, { 48, 61 }, { 68, 76 } }, // 11: sa[3]'0
     2036                { { 61, 62 } }, // 12: sa[3]'1
     2037                { { 41, 42 } }, // 13: sa[3]'2
     2038                { { 0, 36 }, { 48, 61 }, { 68, 69 } }, // 14: sa[4]'0
     2039                { { 9, 41 } }  // 15: sa[5]'0
     2040            },
     2041            { },
     2042            { },
     2043            { }
     2044        },
     2045        { }, // linearDepMaps
     2046        {   // vidxRoutineMap
     2047            { 2, { { { 0, 1, 6, 7, 8, 9, 11, 12, 14 }, { }, { }, { } } } }
     2048        },
     2049        {   // vidxCallMap
     2050            { 0, { { { 15 }, { }, { }, { } } } }
    19912051        },
    19922052        true, ""
Note: See TracChangeset for help on using the changeset viewer.