Changeset 3619 in CLRX


Ignore:
Timestamp:
Jan 15, 2018, 8:07:22 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Add collectSSAIdsForCall and update createSSAData code.

File:
1 edited

Legend:

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

    r3618 r3619  
    489489        const std::unordered_map<size_t, RoutineData>& routineMap,
    490490        const std::vector<CodeBlock>& codeBlocks,
    491         SSAReplacesMap& replacesMap,
    492         std::unordered_set<AsmSingleVReg>* joinedRegs = nullptr)
     491        SSAReplacesMap& replacesMap)
    493492{
    494493    size_t nextBlock = prevFlowStack.back().blockIndex;
     
    539538                for (auto& sentry: cblock.ssaInfoMap)
    540539                {
    541                     if (joinedRegs != nullptr)
    542                         joinedRegs->insert(sentry.first);
    543                    
    544540                    const SSAInfo& sinfo = sentry.second;
    545541                    auto res = toResolveMap.insert({ sentry.first, entry.blockIndex, });
     
    666662            if (it != destEntry.end())
    667663                destEntry.erase(it);
     664        }
     665    }
     666}
     667
     668static void collectSSAIdsForCall(const std::deque<FlowStackEntry>& prevFlowStack,
     669        const std::deque<CallStackEntry>& prevCallStack,
     670        const std::vector<bool>& prevVisited,
     671        std::unordered_map<size_t, RoutineData>& routineMap,
     672        const std::vector<CodeBlock>& codeBlocks)
     673{
     674    std::deque<FlowStackEntry2> flowStack;
     675    // total SSA count
     676    std::unordered_map<AsmSingleVReg, size_t> totalSSACountMap;
     677    // last SSA ids map from returns
     678    LastSSAIdMap retSSAIdMap;
     679    // last SSA ids in current way in code flow
     680    std::unordered_map<AsmSingleVReg, size_t> curSSAIdMap;
     681   
     682    std::vector<bool> visited(codeBlocks.size(), false);
     683    flowStack.push_back({ 0, 0 });
     684   
     685    RoutineData& rdata = routineMap.find(prevCallStack.back().routineBlock)->second;
     686   
     687    while (!flowStack.empty())
     688    {
     689        FlowStackEntry2& entry = flowStack.back();
     690        const CodeBlock& cblock = codeBlocks[entry.blockIndex];
     691       
     692        if (entry.nextIndex == 0)
     693        {
     694            // process current block
     695            if (!visited[entry.blockIndex])
     696            {
     697                visited[entry.blockIndex] = true;
     698               
     699                for (const auto& ssaEntry: cblock.ssaInfoMap)
     700                {
     701                    const SSAInfo& sinfo = ssaEntry.second;
     702                    curSSAIdMap[ssaEntry.first] = sinfo.ssaIdLast != SIZE_MAX ?
     703                        sinfo.ssaIdLast : sinfo.ssaIdBefore+1;
     704                   
     705                    if (sinfo.ssaIdChange != 0)
     706                    {
     707                        // put last SSAId
     708                        auto res = rdata.lastSSAIdMap.insert({ ssaEntry.first,
     709                                { sinfo.ssaIdLast } });
     710                        if (!res.second)
     711                        {
     712                            // if not inserted
     713                            std::vector<size_t>& ssaIds = res.first->second;
     714                            auto ssaIdIt = ssaIds.end();
     715                            if (sinfo.readBeforeWrite)
     716                                ssaIdIt = std::find(ssaIds.begin(), ssaIds.end(),
     717                                        sinfo.ssaIdBefore);
     718                            if (ssaIdIt == ssaIds.end())
     719                                ssaIds.push_back(sinfo.ssaIdLast);
     720                            else
     721                                *ssaIdIt = sinfo.ssaIdLast;
     722                        }
     723                    }
     724                }
     725            }
     726        }
     727       
     728        if (entry.nextIndex < cblock.nexts.size() &&
     729            prevVisited[cblock.nexts[entry.nextIndex].block])
     730        {
     731            flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
     732            entry.nextIndex++;
     733        }
     734        else if (((entry.nextIndex==0 && cblock.nexts.empty()) ||
     735                // if have any call then go to next block
     736                (cblock.haveCalls && entry.nextIndex==cblock.nexts.size())) &&
     737                 !cblock.haveReturn && !cblock.haveEnd &&
     738                 prevVisited[entry.blockIndex+1])
     739        {
     740            flowStack.push_back({ entry.blockIndex+1, 0 });
     741            entry.nextIndex++;
     742        }
     743        else // back
     744        {
     745            flowStack.pop_back();
     746            // previous code block
     747            const CodeBlock& pcblock = codeBlocks[((!flowStack.empty()) ?
     748                    flowStack.back().blockIndex : prevFlowStack.back().blockIndex)];
     749           
     750            //std::cout << "  popresolv" << std::endl;
     751            for (const auto& ssaEntry: cblock.ssaInfoMap)
     752            {
     753                size_t& curSSAId = curSSAIdMap[ssaEntry.first];
     754                const size_t nextSSAId = curSSAId;
     755                curSSAId = ssaEntry.second.ssaIdBefore+1;
     756                auto psit = pcblock.ssaInfoMap.find(ssaEntry.first);
     757                if (psit != pcblock.ssaInfoMap.end())
     758                    curSSAId = psit->second.ssaIdLast;
     759               
     760                std::vector<size_t>& ssaIds = rdata.lastSSAIdMap
     761                        .find(ssaEntry.first)->second;
     762               
     763                if (!cblock.nexts.empty() || (!cblock.haveEnd && !cblock.haveReturn))
     764                {   // if cblock with some children
     765                    auto nit = std::find(ssaIds.begin(), ssaIds.end(), nextSSAId-1);
     766                    if (nit != ssaIds.end())
     767                        ssaIds.erase(nit);  // just remove
     768                }
     769                // push previous SSAId to lastSSAIdMap (later will be replaced)
     770                if (std::find(ssaIds.begin(), ssaIds.end(), curSSAId-1) == ssaIds.end())
     771                    ssaIds.push_back(curSSAId-1);
     772            }
    668773        }
    669774    }
     
    9021007                    rit->second.processed = true;*/
    9031008               
    904                 std::unordered_set<AsmSingleVReg> joinedRegs;
    9051009                resolveSSAConflicts(flowStack, callStack, visited, routineMap, codeBlocks,
    906                                     ssaReplacesMap, &joinedRegs);
     1010                                    ssaReplacesMap);
    9071011                if (!callStack.empty())
    908                 {
    909                     RoutineData& rdata =
    910                         (routineMap.find(callStack.back().routineBlock)->second);
    911                     for (const AsmSingleVReg& vreg: joinedRegs)
    912                     {
    913                         auto cssaIdIt = curSSAIdMap.find(vreg);
    914                         if (cssaIdIt == curSSAIdMap.end())
    915                             continue;
    916                         auto rlit = rdata.lastSSAIdMap.find(vreg);
    917                         if (rlit == rdata.lastSSAIdMap.end())
    918                             continue;
    919                         // remove old SSAId from list (if used in this way)
    920                         // TODO: compare first SSAId in this way and current last SSAId
    921                         auto rllit = std::find(rlit->second.begin(),
    922                                     rlit->second.end(), cssaIdIt->second-1);
    923                         if (rllit != rlit->second.end())
    924                             rlit->second.erase(rllit);
    925                     }
    926                 }
     1012                    collectSSAIdsForCall(flowStack, callStack, visited,
     1013                            routineMap, codeBlocks);
    9271014                // back, already visited
    9281015                flowStack.pop_back();
Note: See TracChangeset for help on using the changeset viewer.