Changeset 3645 in CLRX


Ignore:
Timestamp:
Jan 20, 2018, 7:14:12 AM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Update.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3643 r3645  
    467467    size_t nextIndex;
    468468    std::unordered_map<AsmSingleVReg, size_t> prevSSAIds;
     469    RetSSAIdMap prevRetSSAIdSets;
    469470};
    470471
     
    546547            {
    547548                visited[entry.blockIndex] = true;
    548                 //std::cout << "  resolv: " << entry.blockIndex << std::endl;
     549                std::cout << "  resolv: " << entry.blockIndex << std::endl;
    549550                for (auto& sentry: cblock.ssaInfoMap)
    550551                {
     
    566567                                if (ssaId > sinfo.ssaIdBefore)
    567568                                {
    568                                     /*std::cout << "  insertreplace: " <<
     569                                    std::cout << "  insertreplace: " <<
    569570                                        sentry.first.regVar << ":" <<
    570571                                        sentry.first.index  << ": " <<
    571                                         ssaId << ", " << sinfo.ssaIdBefore << std::endl;*/
     572                                        ssaId << ", " << sinfo.ssaIdBefore << std::endl;
    572573                                    insertReplace(replacesMap, sentry.first, ssaId,
    573574                                                sinfo.ssaIdBefore);
     
    575576                                else if (ssaId < sinfo.ssaIdBefore)
    576577                                {
    577                                     /*std::cout << "  insertreplace2: " <<
     578                                    std::cout << "  insertreplace2: " <<
    578579                                        sentry.first.regVar << ":" <<
    579580                                        sentry.first.index  << ": " <<
    580                                         ssaId << ", " << sinfo.ssaIdBefore << std::endl;*/
     581                                        ssaId << ", " << sinfo.ssaIdBefore << std::endl;
    581582                                    insertReplace(replacesMap, sentry.first,
    582583                                                  sinfo.ssaIdBefore, ssaId);
     
    631632                    toResolveMap.erase(it);
    632633            }
    633             //std::cout << "  popresolv" << std::endl;
     634            std::cout << "  popresolv" << std::endl;
    634635            flowStack.pop_back();
    635636        }
     
    642643    for (const auto& entry: src)
    643644    {
    644         /*std::cout << "entry: " << entry.first.regVar << ":" <<
     645        std::cout << "entry2: " << entry.first.regVar << ":" <<
    645646                cxuint(entry.first.index) << ":";
    646647        for (size_t v: entry.second)
    647648            std::cout << " " << v;
    648         std::cout << std::endl;*/
     649        std::cout << std::endl;
    649650        // insert if not inserted
    650651        auto res = dest.insert({entry.first, { { routineBlock }, entry.second } });
     
    660661                destEntry.push_back(ssaId);
    661662        }
    662         /*std::cout << "  :";
     663        std::cout << "  :";
    663664        for (size_t v: destEntry)
    664665            std::cout << " " << v;
    665         std::cout << std::endl;*/
     666        std::cout << std::endl;
    666667    }
    667668}
     
    671672    for (const auto& entry: src)
    672673    {
    673         /*std::cout << "entry: " << entry.first.regVar << ":" <<
     674        std::cout << "entry: " << entry.first.regVar << ":" <<
    674675                cxuint(entry.first.index) << ":";
    675676        for (size_t v: entry.second)
    676677            std::cout << " " << v;
    677         std::cout << std::endl;*/
     678        std::cout << std::endl;
    678679        auto res = dest.insert(entry); // find
    679680        if (res.second)
     
    687688                destEntry.push_back(ssaId);
    688689        }
    689         /*std::cout << "  :";
     690        std::cout << "  :";
    690691        for (size_t v: destEntry)
    691692            std::cout << " " << v;
    692         std::cout << std::endl;*/
     693        std::cout << std::endl;
    693694    }
    694695}
     
    916917            if (!visited[entry.blockIndex])
    917918            {
    918                 //std::cout << "proc: " << entry.blockIndex << std::endl;
     919                std::cout << "proc: " << entry.blockIndex << std::endl;
    919920                visited[entry.blockIndex] = true;
    920921               
     
    958959                            ssaId = ssaIds.front()+1; // plus one
    959960                       
     961                        std::cout << "retssa ssaid: " << ssaEntry.first.regVar << ":" <<
     962                                ssaEntry.first.index << ": " << ssaId << std::endl;
    960963                        // replace smallest ssaId in routineMap lastSSAId entry
    961964                        // reduce SSAIds replaces
     
    10461049            entry.nextIndex-1 == callStack.back().callNextIndex)
    10471050        {
    1048             //std::cout << " ret: " << entry.blockIndex << std::endl;
     1051            std::cout << " ret: " << entry.blockIndex << std::endl;
    10491052            const RoutineData& prevRdata =
    10501053                    routineMap.find(callStack.back().routineBlock)->second;
     
    10601063            if (cblock.nexts[entry.nextIndex].isCall)
    10611064            {
    1062                 //std::cout << " call: " << entry.blockIndex << std::endl;
     1065                std::cout << " call: " << entry.blockIndex << std::endl;
    10631066                callStack.push_back({ entry.blockIndex, entry.nextIndex,
    10641067                            cblock.nexts[entry.nextIndex].block });
     
    10761079            if (entry.nextIndex!=0) // if back from calls (just return from calls)
    10771080            {
    1078                 // expand lastMultiSSAIdMap from all calls
    10791081                for (const NextBlock& next: cblock.nexts)
    10801082                    if (next.isCall)
     
    10821084                        //std::cout << "joincall:"<< next.block << std::endl;
    10831085                        auto it = routineMap.find(next.block); // must find
     1086                        for (const auto& v: it->second.lastSSAIdMap)
     1087                        {
     1088                            auto res = entry.prevRetSSAIdSets.insert({v.first, {}});
     1089                            if (!res.second)
     1090                                continue; // already added, do not change
     1091                            auto rfit = retSSAIdMap.find(v.first);
     1092                            if (rfit != retSSAIdMap.end())
     1093                                res.first->second = rfit->second;
     1094                        }
     1095                       
    10841096                        joinRetSSAIdMap(retSSAIdMap, it->second.lastSSAIdMap, next.block);
    10851097                    }
     
    10901102        else // back
    10911103        {
     1104            // revert retSSAIdMap
     1105            for (auto v: entry.prevRetSSAIdSets)
     1106            {
     1107                if (!v.second.ssaIds.empty())
     1108                {
     1109                    auto rfit = retSSAIdMap.find(v.first);
     1110                    rfit->second = v.second;
     1111                }
     1112                else // erase if empty
     1113                    retSSAIdMap.erase(v.first);
     1114            }
     1115            //
    10921116            RoutineData* rdata = nullptr;
    10931117            if (!callStack.empty())
     
    11061130                else // if found
    11071131                    curSSAId = it->second;
     1132               
     1133                std::cout << "popcurnext: " << ssaEntry.first.regVar <<
     1134                            ":" << ssaEntry.first.index << ": " <<
     1135                            nextSSAId << ", " << curSSAId << std::endl;
     1136               
    11081137                if (rdata!=nullptr)
    11091138                {
     
    11151144                        if (nit != ssaIds.end() && nextSSAId != curSSAId)
    11161145                        {
    1117                             /*std::cout << "erase in blk2: " << ssaEntry.first.regVar <<
     1146                            std::cout << "erase in blk2: " << ssaEntry.first.regVar <<
    11181147                                    ":" << ssaEntry.first.index << ": " <<
    1119                                     entry.blockIndex << " ssaId=" << *nit << std::endl;*/
     1148                                    entry.blockIndex << " ssaId=" << *nit << std::endl;
    11201149                            ssaIds.erase(nit);  // just remove
    11211150                        }
     
    11291158                        if (fit != ssaIds.end())
    11301159                        {
    1131                             /*std::cout << "erase in blk: " << ssaEntry.first.regVar <<
     1160                            std::cout << "erase in blk: " << ssaEntry.first.regVar <<
    11321161                                    ":" << ssaEntry.first.index << ": " <<
    1133                                     entry.blockIndex << " ssaId=" << *fit << std::endl;*/
     1162                                    entry.blockIndex << " ssaId=" << *fit << std::endl;
    11341163                            ssaIds.erase(fit);
    11351164                        }
     
    11531182            }
    11541183           
    1155             //std::cout << "pop" << std::endl;
     1184            std::cout << "pop" << std::endl;
    11561185            flowStack.pop_back();
    11571186        }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3644 r3645  
    28022802        { },
    28032803        true, ""
     2804    },
     2805    {   // 22 - nested calls
     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], 4
     2817        s_lshl_b32 sa[3], sa[3], 4
     2818       
     2819        s_getpc_b64 s[2:3]
     2820        s_add_u32 s2, s2, routine2-.
     2821        s_add_u32 s3, s3, routine2-.+4
     2822        .cf_call routine2
     2823        s_swappc_b64 s[0:1], s[2:3]
     2824       
     2825        s_lshr_b32 sa[2], sa[2], 2
     2826        s_min_u32 sa[2], sa[2], sa[3]
     2827        s_lshr_b32 sa[3], sa[3], 2
     2828        s_endpgm
     2829       
     2830routine:
     2831        s_xor_b32 sa[2], sa[2], sa[4]
     2832        s_xor_b32 sa[3], sa[3], sa[4]
     2833        s_cbranch_scc1 bb1
     2834       
     2835        s_min_u32 sa[2], sa[2], sa[4]
     2836       
     2837        s_getpc_b64 s[2:3]
     2838        s_add_u32 s2, s2, routine2-.
     2839        s_add_u32 s3, s3, routine2-.+4
     2840        .cf_call routine2
     2841        s_swappc_b64 s[0:1], s[2:3]
     2842       
     2843        .cf_ret
     2844        s_setpc_b64 s[0:1]
     2845       
     2846bb1:    s_and_b32 sa[2], sa[2], sa[4]
     2847        .cf_ret
     2848        s_setpc_b64 s[0:1]
     2849
     2850routine2:
     2851        s_xor_b32 sa[2], sa[2], sa[4]
     2852        s_xor_b32 sa[3], sa[3], sa[4]
     2853        s_cbranch_scc1 bb2
     2854
     2855        s_min_u32 sa[3], sa[3], sa[4]
     2856        .cf_ret
     2857        s_setpc_b64 s[0:1]
     2858       
     2859bb2:    s_min_u32 sa[2], sa[2], sa[4]
     2860        .cf_ret
     2861        s_setpc_b64 s[0:1]
     2862)ffDXD",
     2863        {
     2864            // block 0 - start
     2865            { 0, 32,
     2866                { { 3, true } },
     2867                {
     2868                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2869                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2870                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2871                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2872                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2873                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2874                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2875                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2876                }, true, false, false },
     2877            // block 1
     2878            { 32, 64,
     2879                { { 7, true } },
     2880                {
     2881                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2882                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2883                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2884                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2885                    { { "sa", 2 }, SSAInfo(5, 7, 7, 7, 1, true) },
     2886                    { { "sa", 3 }, SSAInfo(4, 5, 5, 5, 1, true) }
     2887                }, true, false, false },
     2888            // block 2
     2889            { 64, 80,
     2890                { },
     2891                {
     2892                    { { "sa", 2 }, SSAInfo(5, 8, 8, 9, 2, true) },
     2893                    { { "sa", 3 }, SSAInfo(4, 6, 6, 6, 1, true) }
     2894                }, false, false, true },
     2895            // block 3 - routine
     2896            { 80, 92,
     2897                { { 4, false }, { 6, false } },
     2898                {
     2899                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2900                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2901                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2902                }, false, false, false },
     2903            // block 4 - routine - first way bb0
     2904            { 92, 120,
     2905                { { 7, true } },
     2906                {
     2907                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2908                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2909                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2910                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2911                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2912                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2913                }, true, false, false },
     2914            // block 5 - routine - return 0
     2915            { 120, 124,
     2916                { },
     2917                {
     2918                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2919                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) }
     2920                }, false, true, true },
     2921            // block 6 - routine - bb1
     2922            { 124, 132,
     2923                { },
     2924                {
     2925                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2926                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2927                    { { "sa", 2 }, SSAInfo(2, 6, 6, 6, 1, true) },
     2928                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2929                }, false, true, true },
     2930            // block 7
     2931            { 132, 144,
     2932                { { 8, false }, { 9, false } },
     2933                {
     2934                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
     2935                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2936                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2937                }, false, false, false },
     2938            // block 8
     2939            { 144, 152,
     2940                { },
     2941                {
     2942                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2943                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2944                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
     2945                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2946                }, false, true, true },
     2947            // block 9
     2948            { 152, 160,
     2949                { },
     2950                {
     2951                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2952                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2953                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
     2954                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2955                }, false, true, true }
     2956        },
     2957        {   // SSA replaces
     2958            // BUG - wrong replaces from first call
     2959            { { "sa", 2 }, { { 6, 4 }, { 5, 4 }, { 7, 3 } } },
     2960            { { "sa", 3 }, { { 5, 2 } } }
     2961        }, true, ""
    28042962    }
    28052963};
Note: See TracChangeset for help on using the changeset viewer.