Changeset 3869 in CLRX


Ignore:
Timestamp:
Mar 3, 2018, 4:41:21 PM (16 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixing createRoutineData (while passing by routines with calls).

File:
1 edited

Legend:

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

    r3868 r3869  
    12521252        if (rbwit != src.rbwSSAIdMap.end() &&
    12531253            // remove only if not in src lastSSAIdMap
    1254             std::find(entry.second.begin(), entry.second.end(), rbwit->second) == entry.second.end())
     1254            std::find(entry.second.begin(), entry.second.end(),
     1255                      rbwit->second) == entry.second.end())
    12551256            destEntry.eraseValue(rbwit->second);
    12561257        std::cout << "    :";
     
    13381339}
    13391340
    1340 static void revertRetSSAIdMap(std::unordered_map<AsmSingleVReg, size_t>& curSSAIdMap,
     1341static void revertRetSSAIdMap(const std::unordered_map<AsmSingleVReg, size_t>& curSSAIdMap,
    13411342            RetSSAIdMap& retSSAIdMap, FlowStackEntry& entry, RoutineData* rdata)
    13421343{
     
    13631364                ssaIds.insertValue(ssaId);
    13641365            if (v.second.ssaIds.empty())
    1365                 ssaIds.push_back(curSSAIdMap[v.first]-1);
     1366            {
     1367                auto cit = curSSAIdMap.find(v.first);
     1368                ssaIds.push_back((cit!=curSSAIdMap.end() ? cit->second : 0)-1);
     1369            }
    13661370           
    13671371            std::cout << " popentry2 " << entry.blockIndex << ": " <<
     
    14011405
    14021406static void createRoutineData(const std::vector<CodeBlock>& codeBlocks,
     1407        std::unordered_map<AsmSingleVReg, size_t>& curSSAIdMap,
    14031408        const ResSecondPointsToCache& subroutToCache,
    14041409        SimpleCache<size_t, RoutineData>& subroutinesCache,
     
    14091414    std::vector<bool> visited(codeBlocks.size(), false);
    14101415    std::deque<FlowStackEntry> flowStack;
     1416    // last SSA ids map from returns
     1417    RetSSAIdMap retSSAIdMap;
    14111418    flowStack.push_back({ routineBlock, 0 });
    14121419   
     
    14371444                for (const auto& ssaEntry: cblock.ssaInfoMap)
    14381445                    if (ssaEntry.first.regVar != nullptr)
     1446                    {
    14391447                        // put data to routine data
    14401448                        updateRoutineData(rdata, ssaEntry);
     1449                       
     1450                        if (ssaEntry.second.ssaIdChange!=0)
     1451                            curSSAIdMap[ssaEntry.first] = ssaEntry.second.ssaIdLast+1;
     1452                    }
    14411453            }
    14421454            else if (subroutToCache.count(entry.blockIndex)!=0)
     
    14631475                 !cblock.haveReturn && !cblock.haveEnd)
    14641476        {
     1477            if (entry.nextIndex!=0) // if back from calls (just return from calls)
     1478            {
     1479                for (const NextBlock& next: cblock.nexts)
     1480                    if (next.isCall)
     1481                    {
     1482                        //std::cout << "joincall:"<< next.block << std::endl;
     1483                        auto it = routineMap.find(next.block); // must find
     1484                        initializePrevRetSSAIds(retSSAIdMap, it->second, entry);
     1485                        joinRetSSAIdMap(retSSAIdMap, it->second.lastSSAIdMap, next.block);
     1486                    }
     1487            }
    14651488            flowStack.push_back({ entry.blockIndex+1, 0 });
    14661489            entry.nextIndex++;
     
    14741497                std::cout << "procretend" << std::endl;
    14751498            }
     1499           
     1500            // revert retSSAIdMap
     1501            revertRetSSAIdMap(curSSAIdMap, retSSAIdMap, entry, &rdata);
     1502            //
    14761503           
    14771504            for (const auto& ssaEntry: cblock.ssaInfoMap)
     
    14821509                size_t nextSSAId = (ssaEntry.second.ssaIdLast != SIZE_MAX) ?
    14831510                    ssaEntry.second.ssaIdLast+1 : curSSAId;
     1511                curSSAIdMap[ssaEntry.first] = curSSAId;
    14841512               
    14851513                std::cout << "popcurnext: " << ssaEntry.first.regVar <<
     
    16941722            {
    16951723                RoutineData myRoutineData;
    1696                 createRoutineData(codeBlocks, cblocksToCache, subroutinesCache,
     1724                createRoutineData(codeBlocks, curSSAIdMap, cblocksToCache, subroutinesCache,
    16971725                            routineMap, myRoutineData, callStack.back().routineBlock);
    16981726                prevRdata.compare(myRoutineData);
Note: See TracChangeset for help on using the changeset viewer.