Changeset 3652 in CLRX


Ignore:
Timestamp:
Jan 22, 2018, 3:29:25 PM (17 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Resolve SSA conflict after visiting all code blocks: fix missing a SSA replaces when SSA readBeforeWrite with old SSA is
beyond visited code blocks before current resolveSSAConflicts.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3651 r3652  
    496496
    497497static void resolveSSAConflicts(const std::deque<FlowStackEntry>& prevFlowStack,
    498         const std::deque<CallStackEntry>& prevCallStack,
    499         const std::vector<bool>& prevVisited,
    500498        const std::unordered_map<size_t, RoutineData>& routineMap,
    501499        const std::vector<CodeBlock>& codeBlocks,
     
    605603            callStack.pop(); // just return from call
    606604        */
    607         if (entry.nextIndex < cblock.nexts.size() &&
    608             prevVisited[cblock.nexts[entry.nextIndex].block])
     605        if (entry.nextIndex < cblock.nexts.size())
    609606        {
    610607            /*if (cblock.nexts[entry.nextIndex].isCall)
     
    617614                // if have any call then go to next block
    618615                (cblock.haveCalls && entry.nextIndex==cblock.nexts.size())) &&
    619                  !cblock.haveReturn && !cblock.haveEnd &&
    620                  prevVisited[entry.blockIndex+1])
     616                 !cblock.haveReturn && !cblock.haveEnd)
    621617        {
    622618            flowStack.push_back({ entry.blockIndex+1, 0 });
     
    10621058            {
    10631059                // BUG - it does not resolve conflicts beyond this in rest ways
    1064                 resolveSSAConflicts(flowStack, callStack, visited, routineMap, codeBlocks,
    1065                                     ssaReplacesMap);
     1060                /*resolveSSAConflicts(flowStack, callStack, visited, routineMap, codeBlocks,
     1061                                    ssaReplacesMap);*/
    10661062               
    10671063                // join routine data
     
    12731269            flowStack.pop_back();
    12741270        }
     1271    }
     1272   
     1273    /**********
     1274     * after that, we find points to resolve conflicts
     1275     **********/
     1276    flowStack.clear();
     1277    std::fill(visited.begin(), visited.end(), false);
     1278    flowStack.push_back({ 0, 0 });
     1279   
     1280    while (!flowStack.empty())
     1281    {
     1282        FlowStackEntry& entry = flowStack.back();
     1283        CodeBlock& cblock = codeBlocks[entry.blockIndex];
     1284       
     1285        if (entry.nextIndex == 0)
     1286        {
     1287            // process current block
     1288            if (!visited[entry.blockIndex])
     1289                visited[entry.blockIndex] = true;
     1290            else
     1291            {
     1292                resolveSSAConflicts(flowStack, routineMap, codeBlocks, ssaReplacesMap);
     1293               
     1294                // join routine data
     1295                /*auto rit = routineMap.find(entry.blockIndex);
     1296                if (rit != routineMap.end())
     1297                    // just join with current routine data
     1298                    joinRoutineData(routineMap.find(
     1299                            callStack.back().routineBlock)->second, rit->second);*/
     1300                /*if (!callStack.empty())
     1301                    collectSSAIdsForCall(flowStack, callStack, visited,
     1302                            routineMap, codeBlocks);*/
     1303                // back, already visited
     1304                flowStack.pop_back();
     1305                continue;
     1306            }
     1307        }
     1308       
     1309        if (entry.nextIndex < cblock.nexts.size())
     1310        {
     1311            flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
     1312            entry.nextIndex++;
     1313        }
     1314        else if (((entry.nextIndex==0 && cblock.nexts.empty()) ||
     1315                // if have any call then go to next block
     1316                (cblock.haveCalls && entry.nextIndex==cblock.nexts.size())) &&
     1317                 !cblock.haveReturn && !cblock.haveEnd)
     1318        {
     1319            flowStack.push_back({ entry.blockIndex+1, 0 });
     1320            entry.nextIndex++;
     1321        }
     1322        else // back
     1323            flowStack.pop_back();
    12751324    }
    12761325}
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3650 r3652  
    21082108        true, ""
    21092109    },
    2110     {   // 15 - simple call
     2110    {   // 15 - trick - SSA replaces beyond visited point
     2111        R"ffDXD(.regvar sa:s:8, va:v:8
     2112        s_mov_b32 sa[2], s4
     2113        s_mov_b32 sa[3], s5
     2114       
     2115loop:   s_xor_b32 sa[2], sa[2], sa[4]
     2116        s_cbranch_scc0 end
     2117       
     2118        s_xor_b32 sa[3], sa[2], sa[4]
     2119        s_cbranch_scc0 loop
     2120       
     2121        s_endpgm
     2122       
     2123end:    s_xor_b32 sa[3], sa[3], sa[4]
     2124        s_endpgm
     2125)ffDXD",
     2126        {
     2127            // block 0 - start
     2128            { 0, 8,
     2129                { },
     2130                {
     2131                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2132                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2133                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2134                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2135                }, false, false, false },
     2136            // block 1 - loop
     2137            { 8, 16,
     2138                { { 2, false }, { 4, false } },
     2139                {
     2140                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2141                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2142                }, false, false, false },
     2143            // block 2 - loop part 2
     2144            { 16, 24,
     2145                { { 1, false }, { 3, false } },
     2146                {
     2147                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
     2148                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, false) },
     2149                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2150                }, false, false, false },
     2151            // block 3 - end 2
     2152            { 24, 28,
     2153                { },
     2154                { }, false, false, true },
     2155            // block 4 - end
     2156            { 28, 36,
     2157                { },
     2158                {
     2159                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
     2160                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2161                }, false, false, true }
     2162        },
     2163        {
     2164            { { "sa", 2 }, { { 2, 1 } } },
     2165            // must be
     2166            { { "sa", 3 }, { { 2, 1 } } }
     2167        },
     2168        true, ""
     2169    },
     2170    {   // 16 - simple call
    21112171        R"ffDXD(.regvar sa:s:8, va:v:8
    21122172        s_mov_b32 sa[2], s4
     
    21612221        true, ""
    21622222    },
    2163     {   // 16 - simple call, more complex routine
     2223    {   // 17 - simple call, more complex routine
    21642224        R"ffDXD(.regvar sa:s:8, va:v:8
    21652225        s_mov_b32 sa[2], s4
     
    22462306        true, ""
    22472307    },
    2248     {   // 17 - simple call, more complex routine
     2308    {   // 18 - simple call, more complex routine
    22492309        R"ffDXD(.regvar sa:s:8, va:v:8
    22502310        s_mov_b32 sa[2], s4
     
    23272387        true, ""
    23282388    },
    2329     {   // 18 - simple call, more complex routine
     2389    {   // 19 - simple call, more complex routine
    23302390        R"ffDXD(.regvar sa:s:8, va:v:8
    23312391        s_mov_b32 sa[2], s4
     
    24072467        true, ""
    24082468    },
    2409     {   // 19 - simple call, many deep returns
     2469    {   // 20 - simple call, many deep returns
    24102470        R"ffDXD(.regvar sa:s:8, va:v:8
    24112471        s_mov_b32 sa[2], s4
     
    26032663        true, ""
    26042664    },
    2605     {   // 20 - multiple call of routine
     2665    {   // 21 - multiple call of routine
    26062666        R"ffDXD(.regvar sa:s:8, va:v:8
    26072667        s_mov_b32 sa[2], s4
     
    27272787        true, ""
    27282788    },
    2729     {   // 21 - simple call, more complex routine (no use return)
     2789    {   // 22 - simple call, more complex routine (no use return)
    27302790        R"ffDXD(.regvar sa:s:8, va:v:8
    27312791        s_mov_b32 sa[2], s4
     
    28032863        true, ""
    28042864    },
    2805     {   // 22 - simple call, more complex routine
     2865    {   // 23 - simple call, more complex routine
    28062866        R"ffDXD(.regvar sa:s:8, va:v:8
    28072867        s_mov_b32 sa[2], s4
     
    28842944        true, ""
    28852945    },
    2886     {   // 23 - nested calls
     2946    {   // 24 - nested calls
    28872947        R"ffDXD(.regvar sa:s:8, va:v:8
    28882948        s_mov_b32 sa[2], s4
     
    30373097        },
    30383098        {   // SSA replaces
    3039             { { "sa", 2 }, { { 5, 4 }, { 6, 4 }, { 7, 3 }, { 5, 4 } } },
    3040             { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 4, 3 } } }
     3099            { { "sa", 2 }, { { 5, 4 }, { 6, 4 }, { 5, 4 }, { 7, 3 } } },
     3100            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 4, 3 }, { 5, 2 } } }
    30413101        }, true, ""
    30423102    },
    3043     {   // 24 - many routines in single calls
     3103    {   // 25 - many routines in single calls
    30443104        R"ffDXD(.regvar sa:s:8, va:v:8
    30453105        s_mov_b32 sa[2], s4
Note: See TracChangeset for help on using the changeset viewer.