Changeset 3872 in CLRX


Ignore:
Timestamp:
Mar 5, 2018, 7:07:34 PM (20 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Implement subroutine cache usage. Add new testcase with fork&join inside routine. Disable previous testcase.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3871 r3872  
    11401140}
    11411141
     1142static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src,
     1143                    const LastSSAIdMap& laterSSAIds)
     1144{
     1145    for (const auto& entry: src)
     1146    {
     1147        if (laterSSAIds.find(entry.first) != laterSSAIds.end())
     1148            continue;
     1149        std::cout << "  entry: " << entry.first.regVar << ":" <<
     1150                cxuint(entry.first.index) << ":";
     1151        for (size_t v: entry.second)
     1152            std::cout << " " << v;
     1153        std::cout << std::endl;
     1154        auto res = dest.insert(entry); // find
     1155        if (res.second)
     1156            continue; // added new
     1157        VectorSet<size_t>& destEntry = res.first->second;
     1158        // add new ways
     1159        for (size_t ssaId: entry.second)
     1160            destEntry.insertValue(ssaId);
     1161        std::cout << "    :";
     1162        for (size_t v: destEntry)
     1163            std::cout << " " << v;
     1164        std::cout << std::endl;
     1165    }
     1166    joinLastSSAIdMap(dest, laterSSAIds);
     1167}
     1168
     1169
    11421170static void joinRoutineData(RoutineData& dest, const RoutineData& src)
    11431171{
     
    13391367        {
    13401368            // process current block
    1341             //RoutineData* cachedRdata = subroutinesCache.use(entry.blockIndex);
    13421369            if (/*cachedRdata != nullptr &&*/
    13431370                visited[entry.blockIndex] && flowStack.size() > 1)
    13441371            {
     1372                RoutineData* cachedRdata = subroutinesCache.use(entry.blockIndex);
     1373                if (cachedRdata == nullptr)
     1374                {
     1375                    RoutineData subrData;
     1376                    std::cout << "-- subrcache2 for " << entry.blockIndex << std::endl;
     1377                    createRoutineData(codeBlocks, curSSAIdMap, subroutToCache,
     1378                            subroutinesCache, routineMap, subrData, entry.blockIndex);
     1379                    subroutinesCache.put(entry.blockIndex, subrData);
     1380                   
     1381                    cachedRdata = subroutinesCache.use(entry.blockIndex);
     1382                }
     1383                else
     1384                    std::cout << "use cached subr " << entry.blockIndex << std::endl;
     1385               
     1386               
    13451387                // TODO: correctly join this path with routine data
    13461388                // currently does not include further substitutions in visited path
    13471389                std::cout << "procret2: " << entry.blockIndex << std::endl;
    1348                 joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap);
     1390                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap,
     1391                            cachedRdata->lastSSAIdMap);
    13491392                std::cout << "procretend2" << std::endl;
    13501393                flowStack.pop_back();
     
    13661409                    }
    13671410            }
    1368             else if (subroutToCache.count(entry.blockIndex)!=0)
     1411            else
    13691412            {   // begin caching
    13701413                flowStack.pop_back();
     
    14301473               
    14311474                updateRoutineCurSSAIdMap(&rdata, ssaEntry, entry, curSSAId, nextSSAId);
     1475            }
     1476           
     1477            if (flowStack.size() > 1 && subroutToCache.count(entry.blockIndex)!=0)
     1478            { //put to cache
     1479                RoutineData subrData;
     1480                std::cout << "-- subrcache for " << entry.blockIndex << std::endl;
     1481                createRoutineData(codeBlocks, curSSAIdMap, subroutToCache,
     1482                        subroutinesCache, routineMap, subrData, entry.blockIndex);
     1483                subroutinesCache.put(entry.blockIndex, subrData);
    14321484            }
    14331485           
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3863 r3872  
    38593859        true, ""
    38603860    },
     3861#if 0
    38613862    {   // 30 - routine with loop
    38623863        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
     
    39913992            { { "sa", 2 }, { { 3, 2 }, { 3, 2 }, { 4, 1 } } },
    39923993            { { "sa", 5 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 3, 1 }, { 5, 2 }, { 6, 1 } } }
     3994        },
     3995        true, ""
     3996    }
     3997#endif
     3998    {   // 31 - routine with condition
     3999        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
     4000        s_mov_b32 sa[2], s4
     4001        s_mov_b32 sa[3], s5
     4002        s_mov_b32 sa[4], s6
     4003        s_mov_b32 sa[5], s7
     4004       
     4005        .cf_call routine
     4006        s_swappc_b64 s[0:1], s[2:3]
     4007       
     4008        s_xor_b32 sa[5], sa[5], sa[0]
     4009        s_xor_b32 sa[2], sa[2], sa[0]
     4010       
     4011        .cf_call routine
     4012        s_swappc_b64 s[0:1], s[2:3]
     4013       
     4014        s_endpgm
     4015       
     4016routine:
     4017        s_add_u32 sa[2], sa[2], sa[0]
     4018        s_add_u32 sa[3], sa[3], sa[1]
     4019       
     4020        s_add_u32 sa[4], sa[3], sa[0]
     4021        s_add_u32 sa[5], sa[3], sa[5]
     4022        s_cbranch_scc1 j1
     4023       
     4024j0:     s_add_u32 sa[2], sa[3], sa[0]
     4025        s_add_u32 sa[4], sa[3], sa[1]
     4026        s_branch rend
     4027
     4028j1:     s_add_u32 sa[5], sa[2], sa[0]
     4029        s_add_u32 sa[4], sa[3], sa[1]
     4030
     4031rend:
     4032        s_add_u32 sa[5], sa[5], sa[0]
     4033        s_add_u32 sa[3], sa[3], sa[1]
     4034        .cf_ret
     4035        s_setpc_b64 s[0:1]
     4036)ffDXD",
     4037        {
     4038            {   // block 0 - start
     4039                0, 20,
     4040                { { 3, true } },
     4041                {
     4042                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4043                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4044                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4045                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4046                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4047                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4048                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4049                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4050                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4051                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4052                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4053                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) }
     4054                }, true, false, false },
     4055            {   // block 1 - before second call
     4056                20, 32,
     4057                { { 3, true } },
     4058                {
     4059                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4060                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4061                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4062                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4063                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4064                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
     4065                    { { "sa", 5 }, SSAInfo(3, 5, 5, 5, 1, true) }
     4066                }, true, false, false },
     4067            {   // block 2 - end
     4068                32, 36,
     4069                { },
     4070                { }, false, false, true },
     4071            {   // block 3 - routine
     4072                36, 56,
     4073                { { 4, false }, { 5, false } },
     4074                {
     4075                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4076                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4077                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4078                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4079                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
     4080                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
     4081                }, false, false, false },
     4082            {   // block 4 - j0
     4083                56, 68,
     4084                { { 6, false } },
     4085                {
     4086                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4087                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4088                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, false) },
     4089                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
     4090                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, false) }
     4091                },
     4092                false, false, true },
     4093            {   // block 5 - j1
     4094                68, 76,
     4095                { },
     4096                {
     4097                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4098                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4099                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
     4100                    { { "sa", 3 }, SSAInfo(2, SIZE_MAX, 4, SIZE_MAX, 0, true) },
     4101                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, false) },
     4102                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, false) }
     4103                }, false, false, false },
     4104            {   // block 6 - end
     4105                76, 88,
     4106                { },
     4107                {
     4108                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4109                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4110                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4111                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4112                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4113                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
     4114                }, false, true, true }
     4115        },
     4116        {   // SSA replaces
     4117            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
     4118            { { "sa", 5 }, { { 4, 2 }, { 5, 1 } } }
    39934119        },
    39944120        true, ""
Note: See TracChangeset for help on using the changeset viewer.