Changeset 3846 in CLRX


Ignore:
Timestamp:
Feb 24, 2018, 9:25:21 AM (17 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Some stuff with SimpleCache?.

File:
1 edited

Legend:

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

    r3845 r3846  
    629629            const LastSSAIdMap& stackVarMap,
    630630            std::unordered_map<AsmSingleVReg, size_t>& toResolveMap,
    631             FlowStackEntry2& entry, const SSAEntry& sentry)
     631            FlowStackEntry2& entry, const SSAEntry& sentry,
     632            RBWSSAIdMap* cacheSecPoints)
    632633{
    633634    const SSAInfo& sinfo = sentry.second;
     
    636637    if (res.second && sinfo.readBeforeWrite)
    637638    {
     639        if (cacheSecPoints != nullptr)
     640            cacheSecPoints->insert({ sentry.first, sinfo.ssaIdBefore });
     641       
    638642        // resolve conflict for this variable ssaId>.
    639643        // only if in previous block previous SSAID is
     
    673677        const std::unordered_map<size_t, RoutineData>& routineMap,
    674678        const std::vector<CodeBlock>& codeBlocks,
     679        std::vector<bool>& cblocksToCache,
     680        SimpleCache<size_t, RBWSSAIdMap>& resSecondPointsCache,
    675681        SSAReplacesMap& replacesMap)
    676682{
     
    704710    }
    705711   
     712    RBWSSAIdMap* resSecondPoints = resSecondPointsCache.use(nextBlock);
     713    if (resSecondPoints != nullptr)
     714    {
     715        std::cout << "use resSecPointCache for " << nextBlock << std::endl;
     716        for (const auto& sentry: *resSecondPoints)
     717        {
     718            auto it = stackVarMap.find(sentry.first);
     719       
     720            if (it != stackVarMap.end())
     721            {
     722                // found, resolve by set ssaIdLast
     723                for (size_t ssaId: it->second)
     724                {
     725                    if (ssaId > sentry.second)
     726                    {
     727                        std::cout << "  insertreplace: " << sentry.first.regVar << ":" <<
     728                            sentry.first.index  << ": " <<
     729                            ssaId << ", " << sentry.second << std::endl;
     730                        insertReplace(replacesMap, sentry.first, ssaId,
     731                                    sentry.second);
     732                    }
     733                    else if (ssaId < sentry.second)
     734                    {
     735                        std::cout << "  insertreplace2: " << sentry.first.regVar << ":" <<
     736                            sentry.first.index  << ": " <<
     737                            ssaId << ", " << sentry.second << std::endl;
     738                        insertReplace(replacesMap, sentry.first,
     739                                        sentry.second, ssaId);
     740                    }
     741                    /*else
     742                        std::cout << "  noinsertreplace: " <<
     743                            ssaId << "," << sinfo.ssaIdBefore << std::endl;*/
     744                }
     745            }
     746        }
     747    }
     748   
     749   
     750    RBWSSAIdMap cacheSecPoints;
     751    const bool toCache = (resSecondPoints == nullptr) && cblocksToCache[nextBlock];
     752   
    706753    //std::stack<CallStackEntry> callStack = prevCallStack;
    707754    // traverse by graph from next block
     
    728775                for (auto& sentry: cblock.ssaInfoMap)
    729776                    handleSSAEntryWhileResolving(replacesMap, stackVarMap, toResolveMap,
    730                                     entry, sentry);
     777                                    entry, sentry, toCache ? &cacheSecPoints : nullptr);
    731778            }
    732779            else
    733780            {
     781                cblocksToCache[entry.blockIndex] = true;
    734782                // back, already visited
    735783                std::cout << "resolv already: " << entry.blockIndex << std::endl;
     
    806854        }
    807855    }
     856   
     857    /*if (toCache)
     858        resSecondPointsCache.put(nextBlock, cacheSecPoints);*/
    808859}
    809860
     
    13121363    flowStack.push_back({ 0, 0 });
    13131364   
    1314     SimpleCache<size_t, RBWSSAIdMap> toReplaceCache(rbwCount<<1);
     1365    SimpleCache<size_t, RBWSSAIdMap> resSecondPointsCache(rbwCount<<1);
    13151366   
    13161367    while (!flowStack.empty())
     
    13261377            else
    13271378            {
    1328                 resolveSSAConflicts(flowStack, routineMap, codeBlocks, ssaReplacesMap);
     1379                resolveSSAConflicts(flowStack, routineMap, codeBlocks, cblocksToCache,
     1380                            resSecondPointsCache, ssaReplacesMap);
    13291381               
    13301382                // join routine data
Note: See TracChangeset for help on using the changeset viewer.