Changeset 3643 in CLRX


Ignore:
Timestamp:
Jan 19, 2018, 8:33:07 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Remove obsolete commented code. Reduce SSA replaces after calls.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3625 r3643  
    446446
    447447typedef std::unordered_map<AsmSingleVReg, std::vector<bool> > LastOccurMap;
     448
     449struct RetSSAEntry
     450{
     451    std::vector<size_t> routines;
     452    std::vector<size_t> ssaIds;
     453};
     454
     455typedef std::unordered_map<AsmSingleVReg, RetSSAEntry> RetSSAIdMap;
    448456
    449457struct RoutineData
     
    629637}
    630638
     639static void joinRetSSAIdMap(RetSSAIdMap& dest, const LastSSAIdMap& src,
     640                size_t routineBlock)
     641{
     642    for (const auto& entry: src)
     643    {
     644        /*std::cout << "entry: " << entry.first.regVar << ":" <<
     645                cxuint(entry.first.index) << ":";
     646        for (size_t v: entry.second)
     647            std::cout << " " << v;
     648        std::cout << std::endl;*/
     649        // insert if not inserted
     650        auto res = dest.insert({entry.first, { { routineBlock }, entry.second } });
     651        if (res.second)
     652            continue; // added new
     653        std::vector<size_t>& destEntry = res.first->second.ssaIds;
     654        res.first->second.routines.push_back(routineBlock);
     655        // add new ways
     656        for (size_t ssaId: entry.second)
     657        {
     658            auto it = std::find(destEntry.begin(), destEntry.end(), ssaId);
     659            if (it == destEntry.end())
     660                destEntry.push_back(ssaId);
     661        }
     662        /*std::cout << "  :";
     663        for (size_t v: destEntry)
     664            std::cout << " " << v;
     665        std::cout << std::endl;*/
     666    }
     667}
     668
    631669static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src)
    632670{
     
    857895    std::unordered_map<AsmSingleVReg, size_t> totalSSACountMap;
    858896    // last SSA ids map from returns
    859     LastSSAIdMap retSSAIdMap;
     897    RetSSAIdMap retSSAIdMap;
    860898    // last SSA ids in current way in code flow
    861899    std::unordered_map<AsmSingleVReg, size_t> curSSAIdMap;
     
    902940                    if (ssaIdsIt != retSSAIdMap.end() && sinfo.readBeforeWrite)
    903941                    {
    904                         auto& ssaIds = ssaIdsIt->second;
    905                         /*std::cout << "rssaidtr: " << ssaEntry.first.regVar << ":" <<
    906                                     ssaEntry.first.index << std::endl;*/
    907                         // remove ssaIds from constructed routine datas (before reduction)
    908                         // SSAId can reduced in nested call, thus this loop
    909                         /*auto cit = callStack.rbegin();
    910                         for (; cit != callStack.rend(); ++cit)
    911                         {
    912                             RoutineData& rdata =
    913                                     routineMap.find(cit->routineBlock)->second;
    914                             auto rsit = rdata.lastSSAIdMap.find(ssaEntry.first);
    915                             if (rsit == rdata.lastSSAIdMap.end())
    916                                 continue;
    917                             // remove all current last SSAIds from routine data
    918                             for (size_t v: ssaIds)
    919                             {
    920                                 auto sit = std::find(rsit->second.begin(),
    921                                         rsit->second.end(), v);
    922                                 if (sit != rsit->second.end())
    923                                     rsit->second.erase(sit);
    924                             }
    925                             // remove entry if empty
    926                             if (rsit->second.empty())
    927                                 rdata.lastSSAIdMap.erase(rsit->first);
    928                             break;
    929                         }*/
     942                        auto& ssaIds = ssaIdsIt->second.ssaIds;
    930943                       
    931944                        if (ssaIds.size() >= 2)
     
    941954                                        *sit, minSSAId);
    942955                            ssaId = minSSAId+1; // plus one
    943                             // finally remove from container (because obsolete)
    944                             retSSAIdMap.erase(ssaIdsIt);
    945956                        }
    946957                        else if (ssaIds.size() == 1)
    947                         {
    948958                            ssaId = ssaIds.front()+1; // plus one
    949                             retSSAIdMap.erase(ssaIdsIt);
    950                         }
    951959                       
    952                         /*if (cit != callStack.rend())
    953                         {
    954                             // put again reduced ssaId to routine data
    955                             RoutineData& rdata =
    956                                     routineMap.find(cit->routineBlock)->second;
    957                             rdata.lastSSAIdMap[ssaEntry.first].push_back(ssaId);
    958                         }*/
     960                        // replace smallest ssaId in routineMap lastSSAId entry
     961                        // reduce SSAIds replaces
     962                        for (size_t rblock: ssaIdsIt->second.routines)
     963                            routineMap.find(rblock)->second.lastSSAIdMap[ssaEntry.first] =
     964                                    { ssaId-1 };
     965                        // finally remove from container (because obsolete)
     966                        retSSAIdMap.erase(ssaIdsIt);
    959967                    }
    960968                   
     
    10391047        {
    10401048            //std::cout << " ret: " << entry.blockIndex << std::endl;
    1041             /*const RoutineData& prevRdata =
    1042                     routineMap.find(callStack.back().routineBlock)->second;*/
     1049            const RoutineData& prevRdata =
     1050                    routineMap.find(callStack.back().routineBlock)->second;
    10431051            callStack.pop_back(); // just return from call
    1044             /*if (callStack.empty())
    1045                 // put to main (ret SSAId map)
    1046                 joinLastSSAIdMap(retSSAIdMap, prevRdata.lastSSAIdMap);
    1047             else
     1052            if (!callStack.empty())
    10481053                // put to parent routine
    10491054                joinRoutineData(routineMap.find(callStack.back().routineBlock)->second,
    1050                                     prevRdata);*/
     1055                                    prevRdata);
    10511056        }
    10521057       
     
    10771082                        //std::cout << "joincall:"<< next.block << std::endl;
    10781083                        auto it = routineMap.find(next.block); // must find
    1079                         joinLastSSAIdMap(retSSAIdMap, it->second.lastSSAIdMap);
     1084                        joinRetSSAIdMap(retSSAIdMap, it->second.lastSSAIdMap, next.block);
    10801085                    }
    10811086            }
     
    10851090        else // back
    10861091        {
    1087             // revert lastMultiSSAIdMap changes (add removed entries)
    1088             /*if (cblock.haveCalls)
    1089             {
    1090                 //remove all return parallel ssaids
    1091                 for(const NextBlock& next: cblock.nexts)
    1092                     if (next.isCall)
    1093                     {
    1094                         auto it = routineMap.find(next.block); // must find
    1095                         removeLastSSAIdMap(lastMultiSSAIdMap, it->second.lastSSAIdMap);
    1096                     }
    1097             }
    1098             else // normal block (revert changes in lastMultiSSAIdMap)
    1099                 lastMultiSSAIdMap.insert(entry.replacedMultiSSAIds.begin(),
    1100                                 entry.replacedMultiSSAIds.end());*/
    1101            
    11021092            RoutineData* rdata = nullptr;
    11031093            if (!callStack.empty())
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3628 r3643  
    27222722        },
    27232723        {   // SSA replaces
    2724             { { "sa", 2 }, { { 4, 3 }, { 5, 1 }, { 4, 3 }, { 7, 1 }, { 4, 3 } } },
     2724            { { "sa", 2 }, { { 4, 3 }, { 5, 1 }, { 7, 1 } } },
    27252725            { { "sa", 3 }, { { 3, 1 }, { 5, 1 } } }
    27262726        },
Note: See TracChangeset for help on using the changeset viewer.