Changeset 3918 in CLRX


Ignore:
Timestamp:
Mar 21, 2018, 9:04:55 PM (5 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed applying calls to stackVarMap (include ssaIds from all calls).

File:
1 edited

Legend:

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

    r3917 r3918  
    914914}
    915915
     916static void applyCallToStackVarMap(const CodeBlock& cblock,
     917        const std::unordered_map<size_t, RoutineData>& routineMap,
     918        LastSSAIdMap& stackVarMap, size_t blockIndex, size_t nextIndex)
     919{
     920    for (const NextBlock& next: cblock.nexts)
     921        if (next.isCall)
     922        {
     923            const LastSSAIdMap& regVarMap =
     924                    routineMap.find(next.block)->second.lastSSAIdMap;
     925            for (const auto& sentry: regVarMap)
     926                stackVarMap[sentry.first] = {}; // clearing
     927        }
     928   
     929    for (const NextBlock& next: cblock.nexts)
     930        if (next.isCall)
     931        {
     932            std::cout << "  applycall: " << blockIndex << ": " <<
     933                    nextIndex << ": " << next.block << std::endl;
     934            const LastSSAIdMap& regVarMap =
     935                    routineMap.find(next.block)->second.lastSSAIdMap;
     936            for (const auto& sentry: regVarMap)
     937                for (size_t s: sentry.second)
     938                    stackVarMap.insertSSAId(sentry.first, s);
     939        }
     940}
     941
    916942
    917943static void resolveSSAConflicts(const std::deque<FlowStackEntry2>& prevFlowStack,
     
    947973                // apply missing calls at end of the cached
    948974                const CodeBlock& cblock = codeBlocks[it->second.first];
    949                 for (const NextBlock& next: cblock.nexts)
    950                     if (next.isCall)
    951                     {
    952                         std::cout << "  applycall (cache): " << it->second.first << ": " <<
    953                                 next.block << std::endl;
    954                         const LastSSAIdMap& regVarMap =
    955                                 routineMap.find(next.block)->second.lastSSAIdMap;
    956                         for (const auto& sentry: regVarMap)
    957                             stackVarMap[sentry.first] = sentry.second;
    958                     }
     975               
     976                applyCallToStackVarMap(cblock, routineMap, stackVarMap, -1, -1);
    959977            }
    960978        }
     
    973991        }
    974992        if (entry.nextIndex > cblock.nexts.size())
    975             for (const NextBlock& next: cblock.nexts)
    976                 if (next.isCall)
    977                 {
    978                     std::cout << "  applycall: " << entry.blockIndex << ": " <<
    979                             entry.nextIndex << ": " << next.block << std::endl;
    980                     const LastSSAIdMap& regVarMap =
    981                             routineMap.find(next.block)->second.lastSSAIdMap;
    982                     for (const auto& sentry: regVarMap)
    983                         stackVarMap[sentry.first] = sentry.second;
    984                 }
     993            applyCallToStackVarMap(cblock, routineMap, stackVarMap,
     994                        entry.blockIndex, entry.nextIndex);
    985995       
    986996        // put to first point cache
Note: See TracChangeset for help on using the changeset viewer.