Changeset 3899 in CLRX


Ignore:
Timestamp:
Mar 14, 2018, 3:27:42 PM (2 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed infinite recursion if forks/join encountered inside loop inside routine.
Enable tescase with routine with loop with fork/join.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3897 r3899  
    14191419        SimpleCache<size_t, RoutineData>& subroutinesCache,
    14201420        const std::unordered_map<size_t, RoutineData>& routineMap, RoutineData& rdata,
    1421         size_t routineBlock, bool noMainLoop = false)
     1421        size_t routineBlock, bool noMainLoop = false,
     1422        const std::vector<bool>& prevFlowStackBlocks = {})
    14221423{
    14231424    std::cout << "--------- createRoutineData ----------------\n";
    14241425    std::vector<bool> visited(codeBlocks.size(), false);
    14251426    std::deque<FlowStackEntry> flowStack;
     1427    std::vector<bool> flowStackBlocks(codeBlocks.size(), false);
    14261428    // last SSA ids map from returns
    14271429    RetSSAIdMap retSSAIdMap;
    14281430    flowStack.push_back({ routineBlock, 0 });
     1431    flowStackBlocks[routineBlock] = true;
    14291432   
    14301433    std::unordered_map<size_t, LoopSSAIdMap> loopSSAIdMap;
     
    14371440        if (entry.nextIndex == 0)
    14381441        {
     1442            if (!prevFlowStackBlocks.empty() && prevFlowStackBlocks[entry.blockIndex])
     1443            {
     1444                flowStackBlocks[entry.blockIndex] = false;
     1445                flowStack.pop_back();
     1446                continue;
     1447            }
     1448           
    14391449            // process current block
    14401450            //if (/*cachedRdata != nullptr &&*/
     
    14581468                    RoutineData subrData;
    14591469                    std::cout << "-- subrcache2 for " << entry.blockIndex << std::endl;
     1470                    flowStackBlocks[entry.blockIndex] = false;
    14601471                    createRoutineData(codeBlocks, curSSAIdMap, loopBlocks, subroutToCache,
    1461                         subroutinesCache, routineMap, subrData, entry.blockIndex, true);
     1472                        subroutinesCache, routineMap, subrData, entry.blockIndex, true,
     1473                        flowStackBlocks);
     1474                    flowStackBlocks[entry.blockIndex] = true;
    14621475                    if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
    14631476                    {   // leave from loop point
     
    14841497                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap, *cachedRdata);
    14851498                std::cout << "procretend2" << std::endl;
     1499                flowStackBlocks[entry.blockIndex] = false;
    14861500                flowStack.pop_back();
    14871501                continue;
     
    15161530                    loopSSAIdMap.insert({ entry.blockIndex,
    15171531                                { rdata.curSSAIdMap, false } });
     1532               
     1533                flowStackBlocks[entry.blockIndex] = false;
    15181534                flowStack.pop_back();
    15191535                continue;
     
    15211537            else
    15221538            {
     1539                flowStackBlocks[entry.blockIndex] = false;
    15231540                flowStack.pop_back();
    15241541                continue;
     
    15351552        {
    15361553            flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
     1554            flowStackBlocks[cblock.nexts[entry.nextIndex].block] = true;
    15371555            entry.nextIndex++;
    15381556        }
     
    15551573            }
    15561574            flowStack.push_back({ entry.blockIndex+1, 0 });
     1575            flowStackBlocks[entry.blockIndex+1] = true;
    15571576            entry.nextIndex++;
    15581577        }
     
    15921611                RoutineData subrData;
    15931612                std::cout << "-- subrcache for " << entry.blockIndex << std::endl;
     1613                flowStackBlocks[entry.blockIndex] = false;
    15941614                createRoutineData(codeBlocks, curSSAIdMap, loopBlocks, subroutToCache,
    1595                         subroutinesCache, routineMap, subrData, entry.blockIndex, true);
     1615                        subroutinesCache, routineMap, subrData, entry.blockIndex, true,
     1616                        flowStackBlocks);
     1617                flowStackBlocks[entry.blockIndex] = true;
    15961618                if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
    15971619                {   // leave from loop point
     
    16201642            }
    16211643           
     1644            flowStackBlocks[entry.blockIndex] = false;
    16221645            flowStack.pop_back();
    16231646        }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase2.cpp

    r3898 r3899  
    528528        true, ""
    529529    },
    530 #if 0
    531530    {   // 3 - routine with loop
    532531        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
     
    598597                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
    599598                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
    600                     { { "sa", 5 }, SSAInfo(2, 6, 6, 6, 1, true) }
     599                    { { "sa", 5 }, SSAInfo(4, 6, 6, 6, 1, true) }
    601600                }, true, false, false },
    602601            {   // block 2 - end
     
    659658        },
    660659        {   // SSA replaces
    661             { { "sa", 2 }, { { 3, 2 }, { 3, 2 }, { 4, 1 } } },
    662             { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 3, 1 }, { 5, 2 }, { 6, 1 } } }
     660            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
     661            { { "sa", 5 }, { { 3, 1 }, { 5, 2 }, { 6, 1 } } }
    663662        },
    664663        true, ""
    665     }
    666 #endif
     664    },
    667665    {   // 4 - routine with condition
    668666        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
Note: See TracChangeset for help on using the changeset viewer.