Changeset 3967 in CLRX


Ignore:
Timestamp:
Apr 5, 2018, 8:34:47 PM (3 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Correct clearing/keeping regvar before joining calls in createRoutineData.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3964 r3967  
    13341334        auto res = dest.curSSAIdMap.insert(entry); // find
    13351335        VectorSet<size_t>& destEntry = res.first->second;
     1336       
    13361337        if (!res.second)
    13371338        {
     
    13471348                        { (csit!=curSSAIdMap.end() ? csit->second : 1)-1 } });
    13481349        }
    1349         auto rbwit = src.rbwSSAIdMap.find(entry.first);
    1350         if (rbwit != src.rbwSSAIdMap.end() &&
    1351             // remove only if not in src lastSSAIdMap
    1352             std::find(entry.second.begin(), entry.second.end(),
    1353                       rbwit->second) == entry.second.end())
    1354             destEntry.eraseValue(rbwit->second);
     1350       
    13551351        std::cout << "    :";
    13561352        for (size_t v: destEntry)
     
    19371933       
    19381934        // join and skip calls
    1939         for (; entry.nextIndex < cblock.nexts.size() &&
    1940                     cblock.nexts[entry.nextIndex].isCall; entry.nextIndex++)
    1941         {
    1942             BlockIndex rblock = cblock.nexts[entry.nextIndex].block;
    1943             if (callBlocks.find(rblock) != callBlocks.end())
    1944                 rblock.pass = 1;
    1945             if (rblock != routineBlock)
     1935        {
     1936            std::vector<BlockIndex> calledRoutines;
     1937            for (; entry.nextIndex < cblock.nexts.size() &&
     1938                        cblock.nexts[entry.nextIndex].isCall; entry.nextIndex++)
     1939            {
     1940                BlockIndex rblock = cblock.nexts[entry.nextIndex].block;
     1941                if (callBlocks.find(rblock) != callBlocks.end())
     1942                    rblock.pass = 1;
     1943                if (rblock != routineBlock)
     1944                    calledRoutines.push_back(rblock);
     1945            }
     1946           
     1947            if (!calledRoutines.empty())
     1948            {
     1949                // toNotClear - regvar to no keep (because is used in called routines)
     1950                std::unordered_set<AsmSingleVReg> toNotClear;
     1951                // if regvar any called routine (used)
     1952                std::unordered_set<AsmSingleVReg> allInCalls;
     1953                for (BlockIndex rblock: calledRoutines)
     1954                {
     1955                    const RoutineData& srcRdata = routineMap.find(rblock)->second;
     1956                    for (const auto& rbw: srcRdata.rbwSSAIdMap)
     1957                    {
     1958                        allInCalls.insert(rbw.first);
     1959                        auto lsit = srcRdata.lastSSAIdMap.find(rbw.first);
     1960                        if (lsit != srcRdata.lastSSAIdMap.end() &&
     1961                             lsit->second.hasValue(rbw.second))
     1962                            // if returned not modified, then do not clear this regvar
     1963                            toNotClear.insert(rbw.first);
     1964                    }
     1965                    for (const auto& rbw: srcRdata.lastSSAIdMap)
     1966                        allInCalls.insert(rbw.first);
     1967                }
     1968                for (auto& entry: rdata.curSSAIdMap)
     1969                    // if any called routine and if to clear
     1970                    if (allInCalls.find(entry.first) != allInCalls.end() &&
     1971                        toNotClear.find(entry.first) == toNotClear.end())
     1972                        // not found
     1973                        entry.second.clear();
     1974            }
     1975           
     1976            for (BlockIndex rblock: calledRoutines)
    19461977                joinRoutineData(rdata, routineMap.find(rblock)->second,
    1947                             curSSAIdMap, rdata.notFirstReturn);
     1978                                curSSAIdMap, rdata.notFirstReturn);
    19481979        }
    19491980       
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase3.cpp

    r3966 r3967  
    384384            { { "sa", 2 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
    385385            { { "sa", 3 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 6, 1 } } },
    386             { { "sa", 4 }, { { 2, 1 }, { 4, 3 }, { 3, 1 }, { 5, 1 },
     386            /*{ { "sa", 4 }, { { 2, 1 }, { 4, 3 }, { 3, 1 }, { 5, 1 },
     387                        { 6, 1 }, { 8, 3 }, { 7, 3 } } },*/
     388            { { "sa", 4 }, { { 2, 1 }, { 4, 3 }, { 3, 1 },
    387389                        { 6, 1 }, { 8, 3 }, { 7, 3 } } },
    388             { { "sa", 5 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 3, 1 } } }
     390            { { "sa", 5 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } }
    389391        },
    390392        true, ""
Note: See TracChangeset for help on using the changeset viewer.