Changeset 3877 in CLRX


Ignore:
Timestamp:
Mar 7, 2018, 6:57:28 PM (9 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Tentative support for loops inside routines. Fixed updateRoutineData (includes only read regvar ssaids).

File:
1 edited

Legend:

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

    r3875 r3877  
    11411141
    11421142static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src,
    1143                     const RoutineData& laterRdata)
     1143                    const RoutineData& laterRdata, bool loop = false)
    11441144{
    11451145    for (const auto& entry: src)
     
    11771177        std::cout << std::endl;
    11781178    }
    1179     joinLastSSAIdMap(dest, laterRdata.lastSSAIdMap);
     1179    if (!loop) // do not if loop
     1180        joinLastSSAIdMap(dest, laterRdata.lastSSAIdMap);
    11801181}
    11811182
     
    12611262    {
    12621263        //std::cout << "PutCRBW: " << sinfo.ssaIdBefore << std::endl;
    1263         rdata.rbwSSAIdMap.insert({ ssaEntry.first, sinfo.ssaIdBefore });
     1264        rdata.rbwSSAIdMap.insert({ ssaEntry.first, prevSSAId });
    12641265    }
    12651266   
     
    12761277                ssaIds.eraseValue(prevSSAId);
    12771278            ssaIds.insertValue(sinfo.ssaIdLast);
     1279        }
     1280    }
     1281    else
     1282    {
     1283        // insert read ssaid if no change
     1284        auto res = rdata.curSSAIdMap.insert({ ssaEntry.first, { prevSSAId } });
     1285        if (!res.second)
     1286        {
     1287            VectorSet<size_t>& ssaIds = res.first->second;
     1288            ssaIds.insertValue(prevSSAId);
    12781289        }
    12791290    }
     
    13591370}
    13601371
     1372struct CLRX_INTERNAL LoopSSAIdMap
     1373{
     1374    LastSSAIdMap ssaIdMap;
     1375    bool passed;
     1376};
     1377
    13611378static void createRoutineData(const std::vector<CodeBlock>& codeBlocks,
    13621379        std::unordered_map<AsmSingleVReg, size_t>& curSSAIdMap,
     1380        const std::unordered_set<size_t>& loopBlocks,
    13631381        const ResSecondPointsToCache& subroutToCache,
    13641382        SimpleCache<size_t, RoutineData>& subroutinesCache,
     
    13731391    flowStack.push_back({ routineBlock, 0 });
    13741392   
     1393    std::unordered_map<size_t, LoopSSAIdMap> loopSSAIdMap;
     1394   
    13751395    while (!flowStack.empty())
    13761396    {
     
    13841404                //visited[entry.blockIndex] && flowStack.size() > 1)
    13851405            const RoutineData* cachedRdata = nullptr;
     1406           
     1407            bool isLoop = loopBlocks.find(entry.blockIndex) != loopBlocks.end();
    13861408            if (routineBlock != entry.blockIndex)
    13871409            {
     
    13941416                        cachedRdata = &rit->second;
    13951417                }
    1396                 if (cachedRdata == nullptr && subroutToCache.count(entry.blockIndex)!=0)
     1418                if (!isLoop && cachedRdata == nullptr &&
     1419                    subroutToCache.count(entry.blockIndex)!=0)
    13971420                {
    13981421                    RoutineData subrData;
    13991422                    std::cout << "-- subrcache2 for " << entry.blockIndex << std::endl;
    1400                     createRoutineData(codeBlocks, curSSAIdMap, subroutToCache,
     1423                    createRoutineData(codeBlocks, curSSAIdMap, loopBlocks, subroutToCache,
    14011424                            subroutinesCache, routineMap, subrData, entry.blockIndex);
     1425                    if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
     1426                    {   // leave from loop point
     1427                        auto loopsit = loopSSAIdMap.find(entry.blockIndex);
     1428                        if (loopsit != loopSSAIdMap.end())
     1429                            joinLastSSAIdMap(subrData.lastSSAIdMap,
     1430                                    loopsit->second.ssaIdMap, subrData, true);
     1431                    }
    14021432                    subroutinesCache.put(entry.blockIndex, subrData);
    14031433                   
     
    14301460                    }
    14311461            }
     1462            else if (isLoop && routineBlock != entry.blockIndex)
     1463            {
     1464                // handle loops
     1465                std::cout << "  join loop ssaids: " << entry.blockIndex << std::endl;
     1466                auto loopsit = loopSSAIdMap.find(entry.blockIndex);
     1467                if (loopsit != loopSSAIdMap.end())
     1468                {
     1469                    if (!loopsit->second.passed)
     1470                        // still in loop join ssaid map
     1471                        joinLastSSAIdMap(loopsit->second.ssaIdMap, rdata.curSSAIdMap);
     1472                }
     1473                else // insert new
     1474                    loopSSAIdMap.insert({ entry.blockIndex,
     1475                                { rdata.curSSAIdMap, false } });
     1476                flowStack.pop_back();
     1477                continue;
     1478            }
    14321479            else
    1433             {   // begin caching
     1480            {
    14341481                flowStack.pop_back();
    14351482                continue;
     
    14961543            }
    14971544           
     1545            auto loopsit = loopSSAIdMap.find(entry.blockIndex);
    14981546            if (flowStack.size() > 1 && subroutToCache.count(entry.blockIndex)!=0)
    14991547            { //put to cache
    15001548                RoutineData subrData;
    15011549                std::cout << "-- subrcache for " << entry.blockIndex << std::endl;
    1502                 createRoutineData(codeBlocks, curSSAIdMap, subroutToCache,
     1550                createRoutineData(codeBlocks, curSSAIdMap, loopBlocks, subroutToCache,
    15031551                        subroutinesCache, routineMap, subrData, entry.blockIndex);
     1552                if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
     1553                {   // leave from loop point
     1554                    if (loopsit != loopSSAIdMap.end())
     1555                        joinLastSSAIdMap(subrData.lastSSAIdMap, loopsit->second.ssaIdMap,
     1556                                         subrData, true);
     1557                }
    15041558                subroutinesCache.put(entry.blockIndex, subrData);
    15051559            }
     1560            if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
     1561                // mark that loop has passed fully
     1562                loopsit->second.passed = true;
    15061563           
    15071564            flowStack.pop_back();
     
    15991656   
    16001657    std::vector<bool> waysToCache(codeBlocks.size(), false);
     1658    std::vector<bool> flowStackBlocks(codeBlocks.size(), false);
    16011659    // subroutToCache - true if given block begin subroutine to cache
    16021660    ResSecondPointsToCache cblocksToCache(codeBlocks.size());
    16031661    std::vector<bool> visited(codeBlocks.size(), false);
    16041662    flowStack.push_back({ 0, 0 });
     1663    flowStackBlocks[0] = true;
     1664    std::unordered_set<size_t> loopBlocks;
    16051665   
    16061666    while (!flowStack.empty())
     
    16811741                            cblocksToCache.count(entry.blockIndex) << std::endl;
    16821742                // back, already visited
     1743                flowStackBlocks[entry.blockIndex] = false;
    16831744                flowStack.pop_back();
    16841745               
     
    17091770            {
    17101771                //RoutineData myRoutineData;
    1711                 createRoutineData(codeBlocks, curSSAIdMap, cblocksToCache, subroutinesCache,
    1712                             routineMap, prevRdata, callStack.back().routineBlock);
     1772                createRoutineData(codeBlocks, curSSAIdMap, loopBlocks,
     1773                            cblocksToCache, subroutinesCache, routineMap, prevRdata,
     1774                            callStack.back().routineBlock);
    17131775                //prevRdata.compare(myRoutineData);
    17141776                isRoutineGen[callStack.back().routineBlock] = true;
     
    17241786        {
    17251787            bool isCall = false;
     1788            const size_t nextBlock = cblock.nexts[entry.nextIndex].block;
    17261789            if (cblock.nexts[entry.nextIndex].isCall)
    17271790            {
    17281791                std::cout << " call: " << entry.blockIndex << std::endl;
    1729                 callStack.push_back({ entry.blockIndex, entry.nextIndex,
    1730                             cblock.nexts[entry.nextIndex].block });
    1731                 routineMap.insert({ cblock.nexts[entry.nextIndex].block, { } });
     1792                callStack.push_back({ entry.blockIndex, entry.nextIndex, nextBlock });
     1793                routineMap.insert({ nextBlock, { } });
    17321794                isCall = true;
    17331795            }
    17341796           
    1735             flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0, isCall });
     1797            flowStack.push_back({ nextBlock, 0, isCall });
     1798            if (flowStackBlocks[nextBlock])
     1799                loopBlocks.insert(nextBlock);
     1800            flowStackBlocks[nextBlock] = true;
    17361801            entry.nextIndex++;
    17371802        }
     
    17531818            }
    17541819            flowStack.push_back({ entry.blockIndex+1, 0, false });
     1820            if (flowStackBlocks[entry.blockIndex+1])
     1821                loopBlocks.insert(entry.blockIndex+1);
     1822            flowStackBlocks[entry.blockIndex+1] = true;
    17551823            entry.nextIndex++;
    17561824        }
     
    17911859           
    17921860            std::cout << "pop: " << entry.blockIndex << std::endl;
     1861            flowStackBlocks[entry.blockIndex] = false;
    17931862            flowStack.pop_back();
    17941863            if (!flowStack.empty() && lastCommonCacheWayPoint.first != SIZE_MAX &&
     
    17991868                std::cout << "POPlastCcwP: " << lastCommonCacheWayPoint.first << std::endl;
    18001869            }
     1870           
    18011871        }
    18021872    }
Note: See TracChangeset for help on using the changeset viewer.