Changeset 3879 in CLRX


Ignore:
Timestamp:
Mar 7, 2018, 8:03:01 PM (4 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Add to routine lastSSAIds prevSSAId for previous ways before first regvar access.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3878 r3879  
    601601    LastSSAIdMap curSSAIdMap;
    602602    LastSSAIdMap lastSSAIdMap;
     603    int notFirstReturn;
     604   
     605    RoutineData() : notFirstReturn(0)
     606    { }
    603607   
    604608    size_t weight() const
     
    12581262{
    12591263    const SSAInfo& sinfo = ssaEntry.second;
     1264    bool beforeFirstAccess = true;
    12601265    // put first SSAId before write
    12611266    if (sinfo.readBeforeWrite)
    12621267    {
    12631268        //std::cout << "PutCRBW: " << sinfo.ssaIdBefore << std::endl;
    1264         rdata.rbwSSAIdMap.insert({ ssaEntry.first, prevSSAId });
     1269        if (!rdata.rbwSSAIdMap.insert({ ssaEntry.first, prevSSAId }).second)
     1270            // if already added
     1271            beforeFirstAccess = false;
    12651272    }
    12661273   
    12671274    if (sinfo.ssaIdChange != 0)
    12681275    {
    1269         // put last SSAId
    12701276        //std::cout << "PutC: " << sinfo.ssaIdLast << std::endl;
    12711277        auto res = rdata.curSSAIdMap.insert({ ssaEntry.first, { sinfo.ssaIdLast } });
     1278        // put last SSAId
    12721279        if (!res.second)
    12731280        {
     1281            beforeFirstAccess = false;
    12741282            // if not inserted
    12751283            VectorSet<size_t>& ssaIds = res.first->second;
     
    12781286            ssaIds.insertValue(sinfo.ssaIdLast);
    12791287        }
     1288        // add readbefore if in previous returns if not added yet
     1289        if (rdata.notFirstReturn==2 && beforeFirstAccess)
     1290            rdata.lastSSAIdMap.insert({ ssaEntry.first, { prevSSAId } });
    12801291    }
    12811292    else
     
    14931504        {
    14941505            flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
     1506            if (rdata.notFirstReturn!=0)
     1507                rdata.notFirstReturn = 2;
    14951508            entry.nextIndex++;
    14961509        }
     
    15131526            flowStack.push_back({ entry.blockIndex+1, 0 });
    15141527            entry.nextIndex++;
     1528            if (rdata.notFirstReturn!=0)
     1529                rdata.notFirstReturn = 2;
    15151530        }
    15161531        else
     
    15211536                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap);
    15221537                std::cout << "procretend" << std::endl;
     1538                rdata.notFirstReturn = 1;
    15231539            }
    15241540           
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3873 r3879  
    42664266        },
    42674267        true, ""
     4268    },
     4269    {   // 33 - simple call, more complex routine (reduce with reads)
     4270        R"ffDXD(.regvar sa:s:8, va:v:8
     4271        s_mov_b32 sa[2], s4
     4272        s_mov_b32 sa[3], s5
     4273        s_mov_b32 sa[5], s6
     4274        s_mov_b32 sa[6], s7
     4275       
     4276        s_getpc_b64 s[2:3]
     4277        s_add_u32 s2, s2, routine-.
     4278        s_add_u32 s3, s3, routine-.+4
     4279        .cf_call routine
     4280        s_swappc_b64 s[0:1], s[2:3]
     4281       
     4282        s_lshl_b32 sa[2], sa[2], 3
     4283        s_lshl_b32 sa[3], sa[3], 4
     4284        s_lshl_b32 sa[5], sa[5], 4
     4285        s_lshl_b32 sa[6], sa[6], 4
     4286        s_endpgm
     4287       
     4288routine:
     4289        s_xor_b32 sa[2], sa[2], sa[4]
     4290        s_xor_b32 sa[3], sa[3], sa[4]
     4291        s_cbranch_scc1 bb1
     4292       
     4293        s_min_u32 sa[2], sa[2], sa[4]
     4294        s_min_u32 sa[3], sa[3], sa[4]
     4295        s_xor_b32 sa[5], sa[5], sa[4]
     4296        .cf_ret
     4297        s_setpc_b64 s[0:1]
     4298       
     4299bb1:    s_and_b32 sa[2], sa[2], sa[4]
     4300        s_and_b32 sa[3], sa[3], sa[4]
     4301        s_xor_b32 sa[6], sa[6], sa[4]
     4302        .cf_ret
     4303        s_setpc_b64 s[0:1]
     4304)ffDXD",
     4305        {
     4306            { 0, 40,
     4307                { { 2, true } },
     4308                {
     4309                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4310                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4311                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4312                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     4313                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4314                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4315                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4316                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4317                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4318                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4319                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
     4320                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) }
     4321                }, true, false, false },
     4322            // block 1 - after call
     4323            { 40, 60,
     4324                { },
     4325                {
     4326                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
     4327                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
     4328                    { { "sa", 5 }, SSAInfo(1, 3, 3, 3, 1, true) },
     4329                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) }
     4330                }, false, false, true },
     4331            // block 2 - routine
     4332            { 60, 72,
     4333                { { 3, false }, { 4, false } },
     4334                {
     4335                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4336                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     4337                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     4338                }, false, false, false },
     4339            // block 3 - first return
     4340            { 72, 88,
     4341                { },
     4342                {
     4343                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4344                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4345                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4346                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
     4347                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4348                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
     4349                }, false, true, true },
     4350            // block 4 - second return
     4351            { 88, 104,
     4352                { },
     4353                {
     4354                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4355                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     4356                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
     4357                    { { "sa", 3 }, SSAInfo(2, 4, 4, 4, 1, true) },
     4358                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     4359                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
     4360                }, false, true, true }
     4361        },
     4362        {   // SSA replaces
     4363            { { "sa", 2 }, { { 4, 3 } } },
     4364            { { "sa", 3 }, { { 4, 3 } } },
     4365            { { "sa", 5 }, { { 2, 1 } } },
     4366            { { "sa", 6 }, { { 2, 1 } } }
     4367        },
     4368        true, ""
    42684369    }
    42694370};
Note: See TracChangeset for help on using the changeset viewer.