Changeset 3620 in CLRX


Ignore:
Timestamp:
Jan 16, 2018, 3:43:45 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixing call handling. First the working testcase with calls.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3619 r3620  
    447447struct RoutineData
    448448{
    449     bool processed;
    450449    // rbwSSAIdMap - read before write SSAId's map
    451450    std::unordered_map<AsmSingleVReg, size_t> rbwSSAIdMap;
     
    550549                        if (it != stackVarMap.end())
    551550                        {
    552                            
    553                            
    554551                            // found, resolve by set ssaIdLast
    555552                            for (size_t ssaId: it->second)
     
    628625    for (const auto& entry: src)
    629626    {
     627        /*std::cout << "entry: " << entry.first.regVar << ":" <<
     628                cxuint(entry.first.index) << ":";
     629        for (size_t v: entry.second)
     630            std::cout << " " << v;
     631        std::cout << std::endl;*/
    630632        auto res = dest.insert(entry); // find
    631633        if (res.second)
     
    639641                destEntry.push_back(ssaId);
    640642        }
     643        /*std::cout << "  :";
     644        for (size_t v: destEntry)
     645            std::cout << " " << v;
     646        std::cout << std::endl;*/
    641647    }
    642648}
     
    672678        const std::vector<CodeBlock>& codeBlocks)
    673679{
    674     std::deque<FlowStackEntry2> flowStack;
     680    std::deque<FlowStackEntry> flowStack;
    675681    // total SSA count
    676682    std::unordered_map<AsmSingleVReg, size_t> totalSSACountMap;
     
    687693    while (!flowStack.empty())
    688694    {
    689         FlowStackEntry2& entry = flowStack.back();
     695        FlowStackEntry& entry = flowStack.back();
    690696        const CodeBlock& cblock = codeBlocks[entry.blockIndex];
    691697       
     
    724730                }
    725731            }
     732            else
     733            {
     734                // join routine data
     735                auto rit = routineMap.find(entry.blockIndex);
     736                if (rit != routineMap.end())
     737                    // just join with current routine data
     738                    joinRoutineData(rdata, rit->second);
     739               
     740                collectSSAIdsForCall(flowStack, prevCallStack, visited,
     741                            routineMap, codeBlocks);
     742                // back, already visited
     743                flowStack.pop_back();
     744                continue;
     745            }
    726746        }
    727747       
     
    881901                    {
    882902                        auto& ssaIds = ssaIdsIt->second;
     903                        /*std::cout << "rssaidtr: " << ssaEntry.first.regVar << ":" <<
     904                                    ssaEntry.first.index << std::endl;*/
    883905                        // remove ssaIds from constructed routine datas (before reduction)
    884906                        // SSAId can reduced in nested call, thus this loop
     
    962984                        // put first SSAId before write
    963985                        if (sinfo.readBeforeWrite)
     986                        {
     987                            //std::cout << "PutCRBW: " << sinfo.ssaIdBefore << std::endl;
    964988                            rdata.rbwSSAIdMap.insert({ ssaEntry.first, sinfo.ssaIdBefore });
     989                        }
    965990                       
    966991                        if (sinfo.ssaIdChange != 0)
    967992                        {
    968993                            // put last SSAId
     994                            //std::cout << "PutC: " << sinfo.ssaIdLast << std::endl;
    969995                            auto res = rdata.lastSSAIdMap.insert({ ssaEntry.first,
    970996                                    { sinfo.ssaIdLast } });
     
    9891015            {
    9901016                // join routine data
    991                 /*auto rit = routineMap.find(entry.blockIndex);
    992                 if (rit != routineMap.end() && rit->second.processed)
    993                 {
    994                     // just join with selected routines
    995                     // if this ways to return are visited before
    996                     auto fcit = flowStack.end();
    997                     --fcit;
    998                     --fcit; // before this codeblock
    999                     const std::unordered_map<AsmSingleVReg, SSAInfo>& prevSSAInfoMap =
    1000                             codeBlocks[fcit->blockIndex].ssaInfoMap;
    1001                     for (size_t routine: selectedRoutines)
    1002                         joinRoutineData(routineMap.find(routine)->second.lastSSAIdMap,
    1003                                 rit->second.lastSSAIdMap, prevSSAInfoMap);
    1004                 }
    1005                 else if (rit != routineMap.end())
    1006                     // if not already processed, just mark it
    1007                     rit->second.processed = true;*/
     1017                auto rit = routineMap.find(entry.blockIndex);
     1018                if (rit != routineMap.end())
     1019                    // just join with current routine data
     1020                    joinRoutineData(routineMap.find(
     1021                            callStack.back().routineBlock)->second, rit->second);
    10081022               
    10091023                resolveSSAConflicts(flowStack, callStack, visited, routineMap, codeBlocks,
     
    10231037        {
    10241038            //std::cout << " ret: " << entry.blockIndex << std::endl;
    1025             const RoutineData& prevRdata =
    1026                     routineMap.find(callStack.back().routineBlock)->second;
     1039            /*const RoutineData& prevRdata =
     1040                    routineMap.find(callStack.back().routineBlock)->second;*/
    10271041            callStack.pop_back(); // just return from call
    1028             if (callStack.empty())
     1042            /*if (callStack.empty())
    10291043                // put to main (ret SSAId map)
    10301044                joinLastSSAIdMap(retSSAIdMap, prevRdata.lastSSAIdMap);
     
    10321046                // put to parent routine
    10331047                joinRoutineData(routineMap.find(callStack.back().routineBlock)->second,
    1034                                     prevRdata);
     1048                                    prevRdata);*/
    10351049        }
    10361050       
     
    10421056                callStack.push_back({ entry.blockIndex, entry.nextIndex,
    10431057                            cblock.nexts[entry.nextIndex].block });
    1044                 routineMap.insert({ cblock.nexts[entry.nextIndex].block, { false } });
     1058                routineMap.insert({ cblock.nexts[entry.nextIndex].block, { } });
    10451059            }
    10461060           
     
    10591073                    if (next.isCall)
    10601074                    {
     1075                        //std::cout << "joincall:"<< next.block << std::endl;
    10611076                        auto it = routineMap.find(next.block); // must find
    10621077                        joinLastSSAIdMap(retSSAIdMap, it->second.lastSSAIdMap);
     
    10891104            for (const auto& ssaEntry: cblock.ssaInfoMap)
    10901105            {
     1106                if (ssaEntry.first.regVar == nullptr)
     1107                    continue;
     1108               
    10911109                auto it = entry.prevSSAIds.find(ssaEntry.first);
    10921110                size_t& curSSAId = curSSAIdMap[ssaEntry.first];
     
    10981116                if (rdata!=nullptr)
    10991117                {
    1100                     std::vector<size_t>& ssaIds = rdata->lastSSAIdMap
    1101                             .find(ssaEntry.first)->second;
     1118                    std::vector<size_t>& ssaIds = rdata->lastSSAIdMap[ssaEntry.first];
    11021119                    if (!cblock.nexts.empty() || (!cblock.haveEnd && !cblock.haveReturn))
    11031120                    {   // if cblock with some children
     
    11071124                    }
    11081125                    // push previous SSAId to lastSSAIdMap (later will be replaced)
    1109                     if (std::find(ssaIds.begin(), ssaIds.end(), curSSAId-1) == ssaIds.end())
    1110                         ssaIds.push_back(curSSAId-1);
     1126                    /*std::cout << "call back: " << nextSSAId << "," <<
     1127                            (curSSAId) << std::endl;*/
     1128                    auto fit = std::find(ssaIds.begin(), ssaIds.end(), curSSAId-1);
     1129                    if (entry.blockIndex == callStack.back().routineBlock)
     1130                    {   // just erase if end of traverse in routine
     1131                        if (fit != ssaIds.end())
     1132                            ssaIds.erase(fit);
     1133                    }
     1134                    else
     1135                        if (fit == ssaIds.end())
     1136                            ssaIds.push_back(curSSAId-1);
    11111137                }
    11121138            }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3617 r3620  
    21072107        },
    21082108        true, ""
    2109     }
    2110 #if 0
    2111     ,
     2109    },
    21122110    {   // 15 - simple call
    21132111        R"ffDXD(.regvar sa:s:8, va:v:8
     
    21332131        {
    21342132            { 0, 32,
    2135                 { { 1, false }, { 2, true } },
     2133                { { 2, true } },
    21362134                {
    21372135                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     
    21472145                { },
    21482146                {
    2149                     { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
    2150                     { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
     2147                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2148                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
    21512149                }, false, false, true },
    21522150            { 44, 56,
     
    21552153                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
    21562154                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
    2157                     { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, true) },
    2158                     { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
     2155                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2156                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
    21592157                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
    21602158                }, false, true, true }
    21612159        },
    2162         {
    2163             { { "sa", 2 }, { { 3, 1 } } },
    2164             { { "sa", 3 }, { { 3, 1 } } }
    2165         },
    2166         true, ""
    2167     },
     2160        { },
     2161        true, ""
     2162    }
     2163#if 0
     2164    ,
    21682165    {   // 16 - simple call, more complex routine
    21692166        R"ffDXD(.regvar sa:s:8, va:v:8
Note: See TracChangeset for help on using the changeset viewer.