Changeset 3856 in CLRX


Ignore:
Timestamp:
Feb 27, 2018, 1:43:33 PM (16 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: reuse res sec cache entries while creating ressec cache entry.

File:
1 edited

Legend:

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

    r3855 r3856  
    723723typedef std::unordered_map<size_t, std::pair<size_t, size_t> > PrevWaysIndexMap;
    724724
     725static void useResSecPointCache(SSAReplacesMap& replacesMap,
     726        const LastSSAIdMap& stackVarMap,
     727        const std::unordered_map<AsmSingleVReg, size_t>& alreadyReadMap,
     728        const RBWSSAIdMap* resSecondPoints, size_t nextBlock,
     729        RBWSSAIdMap* destCacheSecPoints)
     730{
     731    std::cout << "use resSecPointCache for " << nextBlock << std::endl;
     732    for (const auto& sentry: *resSecondPoints)
     733    {
     734        const bool alreadyRead = alreadyReadMap.find(sentry.first) != alreadyReadMap.end();
     735        if (destCacheSecPoints != nullptr && !alreadyRead)
     736        {
     737            auto res = destCacheSecPoints->insert(sentry);
     738            if (!res.second)
     739                for (size_t srcSSAId: sentry.second)
     740                    res.first->second.insertValue(srcSSAId);
     741        }
     742        auto it = stackVarMap.find(sentry.first);
     743       
     744        if (it != stackVarMap.end() && !alreadyRead)
     745        {
     746            // found, resolve by set ssaIdLast
     747            for (size_t ssaId: it->second)
     748            {
     749                for (size_t secSSAId: sentry.second)
     750                {
     751                    if (ssaId > secSSAId)
     752                    {
     753                        std::cout << "  insertreplace: " <<
     754                            sentry.first.regVar << ":" <<
     755                            sentry.first.index  << ": " <<
     756                            ssaId << ", " << secSSAId << std::endl;
     757                        insertReplace(replacesMap, sentry.first, ssaId,
     758                                    secSSAId);
     759                    }
     760                    else if (ssaId < secSSAId)
     761                    {
     762                        std::cout << "  insertreplace2: " <<
     763                            sentry.first.regVar << ":" <<
     764                            sentry.first.index  << ": " <<
     765                            ssaId << ", " << secSSAId << std::endl;
     766                        insertReplace(replacesMap, sentry.first,
     767                                        secSSAId, ssaId);
     768                    }
     769                    /*else
     770                        std::cout << "  noinsertreplace: " <<
     771                            ssaId << "," << sinfo.ssaIdBefore << std::endl;*/
     772                }
     773            }
     774        }
     775    }
     776}
     777
    725778static void resolveSSAConflicts(const std::deque<FlowStackEntry2>& prevFlowStack,
    726779        const std::unordered_map<size_t, RoutineData>& routineMap,
     
    788841   
    789842    RBWSSAIdMap* resSecondPoints = resSecondPointsCache.use(nextBlock);
    790     if (resSecondPoints != nullptr)
    791     {
    792         std::cout << "use resSecPointCache for " << nextBlock << std::endl;
    793         for (const auto& sentry: *resSecondPoints)
    794         {
    795             auto it = stackVarMap.find(sentry.first);
    796        
    797             if (it != stackVarMap.end())
    798             {
    799                 // found, resolve by set ssaIdLast
    800                 for (size_t ssaId: it->second)
    801                 {
    802                     for (size_t secSSAId: sentry.second)
    803                     {
    804                         if (ssaId > secSSAId)
    805                         {
    806                             std::cout << "  insertreplace: " <<
    807                                 sentry.first.regVar << ":" <<
    808                                 sentry.first.index  << ": " <<
    809                                 ssaId << ", " << secSSAId << std::endl;
    810                             insertReplace(replacesMap, sentry.first, ssaId,
    811                                         secSSAId);
    812                         }
    813                         else if (ssaId < secSSAId)
    814                         {
    815                             std::cout << "  insertreplace2: " <<
    816                                 sentry.first.regVar << ":" <<
    817                                 sentry.first.index  << ": " <<
    818                                 ssaId << ", " << secSSAId << std::endl;
    819                             insertReplace(replacesMap, sentry.first,
    820                                             secSSAId, ssaId);
    821                         }
    822                         /*else
    823                             std::cout << "  noinsertreplace: " <<
    824                                 ssaId << "," << sinfo.ssaIdBefore << std::endl;*/
    825                     }
    826                 }
    827             }
    828         }
    829         return;
    830     }
    831    
    832843   
    833844    RBWSSAIdMap cacheSecPoints;
     
    861872                std::cout << "  resolv: " << entry.blockIndex << std::endl;
    862873               
    863                 for (auto& sentry: cblock.ssaInfoMap)
    864                     handleSSAEntryWhileResolving(replacesMap, stackVarMap, alreadyReadMap,
    865                                     entry, sentry, toCache ? &cacheSecPoints : nullptr);
     874                const RBWSSAIdMap* resSecondPoints = resSecondPointsCache.use(nextBlock);
     875                if (resSecondPoints == nullptr)
     876                    for (auto& sentry: cblock.ssaInfoMap)
     877                        handleSSAEntryWhileResolving(replacesMap, stackVarMap,
     878                                alreadyReadMap, entry, sentry,
     879                                toCache ? &cacheSecPoints : nullptr);
     880                else // to use cache
     881                {
     882                    useResSecPointCache(replacesMap, stackVarMap, alreadyReadMap,
     883                            resSecondPoints, entry.blockIndex,
     884                            toCache ? &cacheSecPoints : nullptr);
     885                    flowStack.pop_back();
     886                    continue;
     887                }
    866888            }
    867889            else
Note: See TracChangeset for help on using the changeset viewer.