Changeset 3646 in CLRX


Ignore:
Timestamp:
Jan 20, 2018, 1:10:27 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed collecting lastSSAIdMap for routines.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3645 r3646  
    459459    // rbwSSAIdMap - read before write SSAId's map
    460460    std::unordered_map<AsmSingleVReg, size_t> rbwSSAIdMap;
     461    LastSSAIdMap curSSAIdMap;
    461462    LastSSAIdMap lastSSAIdMap;
    462463};
     
    521522                    break; // if call to this next routine (stop)
    522523                const LastSSAIdMap& regVarMap =
    523                         routineMap.find(next.block)->second.lastSSAIdMap;
     524                        routineMap.find(next.block)->second.curSSAIdMap;
    524525                for (const auto& sentry: regVarMap)
    525526                    stackVarMap[sentry.first] = sentry.second;
     
    672673    for (const auto& entry: src)
    673674    {
    674         std::cout << "entry: " << entry.first.regVar << ":" <<
     675        std::cout << "  entry: " << entry.first.regVar << ":" <<
    675676                cxuint(entry.first.index) << ":";
    676677        for (size_t v: entry.second)
     
    688689                destEntry.push_back(ssaId);
    689690        }
    690         std::cout << "  :";
     691        std::cout << "    :";
    691692        for (size_t v: destEntry)
    692693            std::cout << " " << v;
     
    700701    dest.rbwSSAIdMap.insert(src.rbwSSAIdMap.begin(), src.rbwSSAIdMap.end());
    701702   
    702     joinLastSSAIdMap(dest.lastSSAIdMap, src.lastSSAIdMap);
     703    joinLastSSAIdMap(dest.curSSAIdMap, src.curSSAIdMap);
    703704}
    704705
     
    743744                    {
    744745                        // put last SSAId
    745                         auto res = rdata.lastSSAIdMap.insert({ ssaEntry.first,
     746                        auto res = rdata.curSSAIdMap.insert({ ssaEntry.first,
    746747                                { sinfo.ssaIdLast } });
    747748                        if (!res.second)
     
    809810                    curSSAId = psit->second.ssaIdLast;
    810811               
    811                 std::vector<size_t>& ssaIds = rdata.lastSSAIdMap
     812                std::vector<size_t>& ssaIds = rdata.curSSAIdMap
    812813                        .find(ssaEntry.first)->second;
    813814               
     
    10061007                            // put last SSAId
    10071008                            //std::cout << "PutC: " << sinfo.ssaIdLast << std::endl;
    1008                             auto res = rdata.lastSSAIdMap.insert({ ssaEntry.first,
     1009                            auto res = rdata.curSSAIdMap.insert({ ssaEntry.first,
    10091010                                    { sinfo.ssaIdLast } });
    10101011                            if (!res.second)
     
    10841085                        //std::cout << "joincall:"<< next.block << std::endl;
    10851086                        auto it = routineMap.find(next.block); // must find
    1086                         for (const auto& v: it->second.lastSSAIdMap)
     1087                        for (const auto& v: it->second.curSSAIdMap)
    10871088                        {
    10881089                            auto res = entry.prevRetSSAIdSets.insert({v.first, {}});
     
    11021103        else // back
    11031104        {
     1105            RoutineData* rdata = nullptr;
     1106            if (!callStack.empty())
     1107                rdata = &(routineMap.find(callStack.back().routineBlock)->second);
     1108           
     1109            if (cblock.haveReturn && rdata != nullptr)
     1110            {
     1111                std::cout << "procret: " << entry.blockIndex << std::endl;
     1112                joinLastSSAIdMap(rdata->lastSSAIdMap, rdata->curSSAIdMap);
     1113                std::cout << "procretend" << std::endl;
     1114            }
     1115           
    11041116            // revert retSSAIdMap
    11051117            for (auto v: entry.prevRetSSAIdSets)
     
    11141126            }
    11151127            //
    1116             RoutineData* rdata = nullptr;
    1117             if (!callStack.empty())
    1118                 rdata = &(routineMap.find(callStack.back().routineBlock)->second);
    11191128           
    11201129            for (const auto& ssaEntry: cblock.ssaInfoMap)
     
    11371146                if (rdata!=nullptr)
    11381147                {
    1139                     std::vector<size_t>& ssaIds = rdata->lastSSAIdMap[ssaEntry.first];
    1140                     if (ssaEntry.second.ssaIdChange != 0 &&
    1141                         lastOccurMap[ssaEntry.first].back())
     1148                    std::vector<size_t>& ssaIds = rdata->curSSAIdMap[ssaEntry.first];
     1149                   
     1150                    std::cout << " pushentry " << entry.blockIndex << ": " <<
     1151                                ssaEntry.first.regVar << ":" <<
     1152                                ssaEntry.first.index << ":";
     1153                    for (size_t v: ssaIds)
     1154                        std::cout << " " << v;
     1155                    std::cout << std::endl;
     1156                   
     1157                    /*if (ssaEntry.second.ssaIdChange != 0 &&
     1158                        lastOccurMap[ssaEntry.first].back())*/
    11421159                    {   // if cblock with some children
    11431160                        auto nit = std::find(ssaIds.begin(), ssaIds.end(), nextSSAId-1);
     
    11541171                            (curSSAId) << std::endl;*/
    11551172                    auto fit = std::find(ssaIds.begin(), ssaIds.end(), curSSAId-1);
    1156                     if (entry.blockIndex == callStack.back().routineBlock)
     1173                    /*if (entry.blockIndex == callStack.back().routineBlock)
    11571174                    {   // just erase if end of traverse in routine
    11581175                        if (fit != ssaIds.end())
     
    11641181                        }
    11651182                    }
    1166                     else if (fit == ssaIds.end())
     1183                    else*/ if (fit == ssaIds.end())
    11671184                        ssaIds.push_back(curSSAId-1);
     1185                   
     1186                    std::cout << " popentry " << entry.blockIndex << ": " <<
     1187                                ssaEntry.first.regVar << ":" <<
     1188                                ssaEntry.first.index << ":";
     1189                    for (size_t v: ssaIds)
     1190                        std::cout << " " << v;
     1191                    std::cout << std::endl;
    11681192                }
    11691193               
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3645 r3646  
    28032803        true, ""
    28042804    },
    2805     {   // 22 - nested calls
     2805    {   // 22 - simple call, more complex routine
     2806        R"ffDXD(.regvar sa:s:8, va:v:8
     2807        s_mov_b32 sa[2], s4
     2808        s_mov_b32 sa[3], s5
     2809       
     2810        s_getpc_b64 s[2:3]
     2811        s_add_u32 s2, s2, routine-.
     2812        s_add_u32 s3, s3, routine-.+4
     2813        .cf_call routine
     2814        s_swappc_b64 s[0:1], s[2:3]
     2815       
     2816        s_lshl_b32 sa[2], sa[2], 3
     2817        s_lshl_b32 sa[3], sa[3], 4
     2818        s_endpgm
     2819       
     2820routine:
     2821        s_xor_b32 sa[2], sa[2], sa[4]
     2822        s_xor_b32 sa[3], sa[3], sa[4]
     2823        s_cbranch_scc1 bb2
     2824
     2825        s_min_u32 sa[3], sa[3], sa[4]
     2826        .cf_ret
     2827        s_setpc_b64 s[0:1]
     2828       
     2829bb2:    s_min_u32 sa[2], sa[2], sa[4]
     2830        .cf_ret
     2831        s_setpc_b64 s[0:1]
     2832)ffDXD",
     2833        {
     2834            { 0, 32,
     2835                { { 2, true } },
     2836                {
     2837                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2838                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2839                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2840                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2841                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2842                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2843                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2844                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2845                }, true, false, false },
     2846            // block 1 - after call
     2847            { 32, 44,
     2848                { },
     2849                {
     2850                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
     2851                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) }
     2852                }, false, false, true },
     2853            // block 2 - routine
     2854            { 44, 56,
     2855                { { 3, false }, { 4, false } },
     2856                {
     2857                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2858                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2859                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2860                }, false, false, false },
     2861            // block 3 - first return
     2862            { 56, 64,
     2863                { },
     2864                {
     2865                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2866                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2867                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2868                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2869                }, false, true, true },
     2870            // block 4 - second return
     2871            { 64, 72,
     2872                { },
     2873                {
     2874                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2875                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2876                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2877                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2878                }, false, true, true }
     2879        },
     2880        {   // SSA replaces
     2881            { { "sa", 2 }, { { 3, 2 } } },
     2882            { { "sa", 3 }, { { 3, 2 } } }
     2883        },
     2884        true, ""
     2885    },
     2886#if 0
     2887    {   // 23 - nested calls
    28062888        R"ffDXD(.regvar sa:s:8, va:v:8
    28072889        s_mov_b32 sa[2], s4
     
    29613043        }, true, ""
    29623044    }
     3045#endif
    29633046};
    29643047
Note: See TracChangeset for help on using the changeset viewer.