Changeset 3923 in CLRX


Ignore:
Timestamp:
Mar 22, 2018, 7:53:04 PM (9 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Modify last testcase to find bug. Fixing joinLastSSAIdMap with laterRdata (include laterRdata curSSAIdMap to dest) (tentative version).
Include loop ssaIds from second pass in subroutines (tentative version).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r3919 r3923  
    586586
    587587typedef LastSSAIdMap RBWSSAIdMap;
     588typedef std::unordered_map<size_t, VectorSet<size_t> > SubrLoopsMap;
    588589
    589590struct CLRX_INTERNAL RetSSAEntry
     
    11901191                    const LastSSAIdMap& laterRdataLastSSAIdMap, bool loop)
    11911192{
     1193    //bool haveReturns = !dest.empty();
     1194    bool haveReturns = true;
    11921195    for (const auto& entry: src)
    11931196    {
     
    12221225        std::cout << std::endl;
    12231226    }
     1227    if (haveReturns)
     1228        // add not in src but in laterRdataCurSSAIdMap
     1229        for (const auto& entry: laterRdataCurSSAIdMap)
     1230        {
     1231            if (src.find(entry.first) != src.end())
     1232                continue; // if processed from src
     1233           
     1234            auto res = dest.insert(entry); // find
     1235            if (res.second)
     1236                continue; // added new
     1237            VectorSet<size_t>& destEntry = res.first->second;
     1238            // add new ways
     1239            for (size_t ssaId: entry.second)
     1240                destEntry.insertValue(ssaId);
     1241            std::cout << "  entry (lrc): " << entry.first.regVar << ":" <<
     1242                    cxuint(entry.first.index) << ":";
     1243            for (size_t v: destEntry)
     1244                std::cout << " " << v;
     1245            std::cout << std::endl;
     1246        }
    12241247    if (!loop) // do not if loop
    12251248        joinLastSSAIdMap(dest, laterRdataLastSSAIdMap);
     
    15711594    std::cout << "--------- createRoutineData ----------------\n";
    15721595    std::vector<bool> visited(codeBlocks.size(), false);
     1596   
     1597    VectorSet<size_t> activeLoops;
     1598    SubrLoopsMap subrLoopsMap;
     1599    SubrLoopsMap loopSubrsMap;
    15731600    std::deque<FlowStackEntry> flowStack;
    15741601    std::vector<bool> flowStackBlocks(codeBlocks.size(), false);
     
    16101637                flowStackBlocks);
    16111638            flowStackBlocks[entry.blockIndex] = oldFB;
     1639           
    16121640            if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
    16131641            {   // leave from loop point
     
    16251653                }
    16261654            }
     1655           
     1656            // apply loops for subroutine
     1657            auto it = loopSubrsMap.find(entry.blockIndex);
     1658            if (it != loopSubrsMap.end())
     1659            {
     1660                std::cout << "    found loopsubrsmap: " << entry.blockIndex << ":";
     1661                for (size_t subr: it->second)
     1662                {
     1663                    std::cout << " " << subr;
     1664                    RoutineData* subrData2 = subroutinesCache.use(subr);
     1665                    if (subrData2 == nullptr)
     1666                        continue;
     1667                    std::cout << "*";
     1668                    joinLastSSAIdMap(subrData2->lastSSAIdMap,
     1669                            loopsit2->second.ssaIdMap, subrData, false);
     1670                }
     1671                std::cout << "\n";
     1672            }
     1673           
    16271674            subrData.calculateWeight();
    16281675            subroutinesCache.put(entry.blockIndex, subrData);
     
    16881735            else if (!visited[entry.blockIndex])
    16891736            {
     1737                // set up loops for which subroutine is present
     1738                if (subroutToCache.count(entry.blockIndex)!=0 && !activeLoops.empty())
     1739                {
     1740                    subrLoopsMap.insert({ entry.blockIndex, activeLoops });
     1741                    for (size_t loop: activeLoops)
     1742                    {
     1743                        auto res = loopSubrsMap.insert({ loop, { entry.blockIndex} });
     1744                        if (!res.second)
     1745                            res.first->second.insertValue(entry.blockIndex);
     1746                    }
     1747                }
     1748               
     1749                if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
     1750                    activeLoops.insertValue(entry.blockIndex);
    16901751                std::cout << "proc: " << entry.blockIndex << std::endl;
    16911752                visited[entry.blockIndex] = true;
     
    17781839            }
    17791840           
     1841            activeLoops.eraseValue(entry.blockIndex);
     1842           
    17801843            auto loopsit2 = rdata.loopEnds.find(entry.blockIndex);
    1781             if ((!noMainLoop || flowStack.size() > 1) &&
    1782                 subroutToCache.count(entry.blockIndex)!=0)
    1783             { //put to cache
    1784                 std::cout << "-- subrcache for " << entry.blockIndex << std::endl;
    1785                 addSubroutine(loopsit2, true);
    1786             }
    17871844            if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
    17881845            {
     
    17971854                    std::cout << "   loopblocks nopassed: " <<
    17981855                                entry.blockIndex << std::endl;
     1856            }
     1857           
     1858            if ((!noMainLoop || flowStack.size() > 1) &&
     1859                subroutToCache.count(entry.blockIndex)!=0)
     1860            { //put to cache
     1861                std::cout << "-- subrcache for " << entry.blockIndex << std::endl;
     1862                addSubroutine(loopsit2, true);
    17991863            }
    18001864           
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase2.cpp

    r3917 r3923  
    35333533            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 }, { 7, 2 },
    35343534                        { 8, 2 }, { 4, 3 }, { 7, 3 } } },
     3535            /*{ { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
     3536                        { 6, 1 }, { 8, 1 }, { 7, 1 } } },*/
    35353537            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
    3536                         { 6, 1 }, { 8, 1 }, { 7, 1 } } },
     3538                        { 6, 1 }, { 7, 1 }, { 8, 1 } } },
    35373539            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 },
    35383540                        { 7, 2 }, { 8, 2 } } },
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase3.cpp

    r3922 r3923  
    699699        s_setpc_b64 s[0:1]
    700700       
    701 end2:   s_xor_b32 sa[6], sa[6], sa[1]
     701end2:   s_xor_b32 sa[6], sa[0], sa[1]
    702702        .cf_ret
    703703        s_setpc_b64 s[0:1]
     
    788788                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
    789789                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     790                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
    790791                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
    791                     { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
     792                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, false) }
    792793                }, false, true, true },
    793794            {   // block 9 - b0
Note: See TracChangeset for help on using the changeset viewer.