Changeset 3873 in CLRX


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

CLRadeonExtender: AsmRegAlloc?: Fixes in handling forks/joins inside routines. Add new testcase with common code for two routines.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3872 r3873  
    11411141
    11421142static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src,
    1143                     const LastSSAIdMap& laterSSAIds)
     1143                    const RoutineData& laterRdata)
    11441144{
    11451145    for (const auto& entry: src)
    11461146    {
    1147         if (laterSSAIds.find(entry.first) != laterSSAIds.end())
     1147        if (laterRdata.lastSSAIdMap.find(entry.first) != laterRdata.lastSSAIdMap.end() ||
     1148            laterRdata.rbwSSAIdMap.find(entry.first) != laterRdata.rbwSSAIdMap.end())
    11481149            continue;
    11491150        std::cout << "  entry: " << entry.first.regVar << ":" <<
     
    11641165        std::cout << std::endl;
    11651166    }
    1166     joinLastSSAIdMap(dest, laterSSAIds);
     1167    joinLastSSAIdMap(dest, laterRdata.lastSSAIdMap);
    11671168}
    11681169
     
    12401241}
    12411242
    1242 static void updateRoutineData(RoutineData& rdata, const SSAEntry& ssaEntry)
     1243static void updateRoutineData(RoutineData& rdata, const SSAEntry& ssaEntry,
     1244                size_t prevSSAId)
    12431245{
    12441246    const SSAInfo& sinfo = ssaEntry.second;
     
    12601262            VectorSet<size_t>& ssaIds = res.first->second;
    12611263            if (sinfo.readBeforeWrite)
    1262                 ssaIds.eraseValue(sinfo.ssaIdBefore);
     1264                ssaIds.eraseValue(prevSSAId);
    12631265            ssaIds.insertValue(sinfo.ssaIdLast);
    12641266        }
     
    13701372                visited[entry.blockIndex] && flowStack.size() > 1)
    13711373            {
    1372                 RoutineData* cachedRdata = subroutinesCache.use(entry.blockIndex);
     1374                const RoutineData* cachedRdata = subroutinesCache.use(entry.blockIndex);
     1375                if (cachedRdata == nullptr)
     1376                {
     1377                    // try in routine map
     1378                    auto rit = routineMap.find(entry.blockIndex);
     1379                    cachedRdata = &rit->second;
     1380                }
    13731381                if (cachedRdata == nullptr)
    13741382                {
     
    13841392                    std::cout << "use cached subr " << entry.blockIndex << std::endl;
    13851393               
    1386                
    13871394                // TODO: correctly join this path with routine data
    13881395                // currently does not include further substitutions in visited path
    13891396                std::cout << "procret2: " << entry.blockIndex << std::endl;
    1390                 joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap,
    1391                             cachedRdata->lastSSAIdMap);
     1397                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap, *cachedRdata);
    13921398                std::cout << "procretend2" << std::endl;
    13931399                flowStack.pop_back();
     
    14031409                    {
    14041410                        // put data to routine data
    1405                         updateRoutineData(rdata, ssaEntry);
     1411                        updateRoutineData(rdata, ssaEntry, curSSAIdMap[ssaEntry.first]-1);
    14061412                       
    14071413                        if (ssaEntry.second.ssaIdChange!=0)
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3872 r3873  
    41174117            { { "sa", 2 }, { { 3, 2 }, { 4, 1 } } },
    41184118            { { "sa", 5 }, { { 4, 2 }, { 5, 1 } } }
     4119        },
     4120        true, ""
     4121    },
     4122    {   // 32 - two routines with common code
     4123        R"ffDXD(.regvar sa:s:8, va:v:8, xa:s:8
     4124        s_mov_b32 sa[2], s4
     4125        s_mov_b32 sa[3], s5
     4126        s_mov_b32 sa[4], s6
     4127        s_mov_b32 sa[5], s7
     4128        s_mov_b32 sa[6], s8
     4129        s_mov_b32 xa[0], s9
     4130        s_mov_b32 xa[1], s10
     4131       
     4132        .cf_call routine1
     4133        s_swappc_b64 s[0:1], s[2:3]
     4134       
     4135        s_xor_b32 sa[5], sa[5], sa[0]
     4136        s_xor_b32 sa[2], sa[2], sa[0]
     4137       
     4138        .cf_call routine2
     4139        s_swappc_b64 s[0:1], s[2:3]
     4140       
     4141        s_xor_b32 sa[5], sa[5], sa[0]
     4142        s_xor_b32 sa[2], sa[2], sa[0]
     4143        s_xor_b32 sa[6], sa[6], sa[0]
     4144        s_xor_b32 xa[0], xa[0], sa[0]
     4145        s_xor_b32 xa[1], xa[1], sa[0]
     4146        s_endpgm
     4147       
     4148routine1:
     4149        s_add_u32 sa[2], sa[2], sa[0]
     4150        s_add_u32 sa[3], sa[3], sa[1]
     4151       
     4152        s_add_u32 sa[4], sa[3], sa[0]
     4153        s_add_u32 sa[5], sa[3], sa[5]
     4154        s_add_u32 sa[6], sa[6], sa[1]
     4155       
     4156        s_xor_b32 xa[1], xa[1], sa[0]
     4157       
     4158common:
     4159        s_add_u32 sa[5], sa[5], sa[0]
     4160        s_add_u32 sa[3], sa[3], sa[1]
     4161        s_xor_b32 sa[4], sa[4], sa[2]
     4162        .cf_ret
     4163        s_setpc_b64 s[0:1]
     4164
     4165routine2:
     4166        s_add_u32 sa[2], sa[2], sa[0]
     4167        s_add_u32 sa[3], sa[3], sa[1]
     4168       
     4169        s_add_u32 sa[4], sa[1], sa[2]
     4170        s_add_u32 sa[5], sa[3], sa[5]
     4171       
     4172        s_xor_b32 xa[0], xa[0], sa[0]
     4173        s_branch common
     4174)ffDXD",
     4175        {
     4176            {   // block 0 - start
     4177                0, 32,
     4178                { { 3, true } },
     4179                {
     4180                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4181                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4182                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4183                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4184                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4185                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4186                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4187                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4188                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4189                    { { "", 9 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4190                    { { "", 10 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4191                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4192                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4193                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4194                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4195                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4196                    { { "xa", 0 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4197                    { { "xa", 1 }, SSAInfo(0, 1, 1, 1, 1, false) }
     4198                }, true, false, false },
     4199            {   // block 1 - after routine1 call
     4200                32, 44,
     4201                { { 5, true } },
     4202                {
     4203                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4204                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4205                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4206                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4207                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4208                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4209                    { { "sa", 5 }, SSAInfo(3, 4, 4, 4, 1, true) }
     4210                }, true, false, false },
     4211            {   // block 2 - after routine2 call
     4212                44, 68,
     4213                { },
     4214                {
     4215                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4216                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) },
     4217                    { { "sa", 5 }, SSAInfo(3, 6, 6, 6, 1, true) },
     4218                    { { "sa", 6 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4219                    { { "xa", 0 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4220                    { { "xa", 1 }, SSAInfo(2, 3, 3, 3, 1, true) }
     4221                }, false, false, true },
     4222            {   // block 3 - routine1
     4223                68, 92,
     4224                { },
     4225                {
     4226                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4227                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4228                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4229                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4230                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, false) },
     4231                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4232                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4233                    { { "xa", 1 }, SSAInfo(1, 2, 2, 2, 1, true) }
     4234                }, false, false, false },
     4235            {   // block 4 - common part
     4236                92, 108,
     4237                { },
     4238                {
     4239                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4240                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4241                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4242                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4243                    { { "sa", 2 }, SSAInfo(2, SIZE_MAX, 3, SIZE_MAX, 0, true) },
     4244                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4245                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4246                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
     4247                }, false, true, true },
     4248            {   // block 5 - routine2
     4249                108, 132,
     4250                { { 4, false } },
     4251                {
     4252                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4253                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4254                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
     4255                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
     4256                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, false) },
     4257                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
     4258                    { { "xa", 0 }, SSAInfo(1, 2, 2, 2, 1, true) }
     4259                }, false, false, true }
     4260        },
     4261        {   // SSA replaces
     4262            { { "sa", 2 }, { { 4, 2 } } },
     4263            { { "sa", 3 }, { { 4, 2 } } },
     4264            { { "sa", 4 }, { { 4, 2 } } },
     4265            { { "sa", 5 }, { { 5, 2 } } }
    41194266        },
    41204267        true, ""
Note: See TracChangeset for help on using the changeset viewer.