Changeset 4129 in CLRX


Ignore:
Timestamp:
May 9, 2018, 8:45:18 PM (11 days ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: include svregs (readBeforeWrite) not in all returns in routine for rest of paths.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r4128 r4129  
    783783    flowStack.push_back({ startBlock, 0 });
    784784   
    785     if (lv.contain(codeBlocks[startBlock].end-1))
     785    //if (lv.contain(codeBlocks[startBlock].end-1))
    786786        // already filled, then do nothing
    787         return;
     787        //return;
    788788   
    789789    while (!flowStack.empty())
     
    14751475    // key - vreg, value - source block where vreg of conflict found
    14761476    SVRegMap alreadyReadMap;
    1477    
     1477    std::unordered_set<AsmSingleVReg> vregsNotInAllRets;
     1478    std::unordered_set<AsmSingleVReg> vregsInFirstReturn;
     1479   
     1480    bool notFirstReturn = false;
    14781481    flowStack.push_back({ routineBlock, 0 });
    14791482    RoutineCurAccessMap curSVRegMap; // key - svreg, value - block index
     
    14941497                        if (alreadyReadMap.insert(
    14951498                                    { sentry.first, entry.blockIndex }).second)
    1496                             rdata.rbwSSAIdMap.insert({ sentry.first,
     1499                        {
     1500                            auto res = rdata.rbwSSAIdMap.insert({ sentry.first,
    14971501                                        sentry.second.ssaIdBefore });
     1502                            if (res.second && notFirstReturn)
     1503                                // first readBeforeWrite and notFirstReturn
     1504                                vregsNotInAllRets.insert(sentry.first);
     1505                        }
    14981506                   
    14991507                    auto res = curSVRegMap.insert({ sentry.first,
     
    15471555           
    15481556            for (size_t srcRoutBlock: calledRoutines)
     1557            {
     1558                // update svregs 'not in all returns'
     1559                const RoutineDataLv& srcRdata = routineMap.find(srcRoutBlock)->second;
     1560                if (notFirstReturn)
     1561                    for (const auto& vrentry: srcRdata.rbwSSAIdMap)
     1562                        if (rdata.rbwSSAIdMap.find(vrentry.first)==rdata.rbwSSAIdMap.end())
     1563                            vregsNotInAllRets.insert(vrentry.first);
     1564               
    15491565                joinRoutineDataLv(rdata, routineVIdxes, curSVRegMap, entry,
    1550                         routineMap.find(srcRoutBlock)->second,
    1551                         vidxRoutineMap.find(srcRoutBlock)->second);
     1566                        srcRdata, vidxRoutineMap.find(srcRoutBlock)->second);
     1567            }
    15521568        }
    15531569       
     
    15771593                    if (!res.second)
    15781594                        res.first->second.insertValue(entry.second);
    1579                 }
     1595                    if (!notFirstReturn)
     1596                        // fill up vregs for first return
     1597                        vregsInFirstReturn.insert(entry.first);
     1598                }
     1599                if (notFirstReturn)
     1600                    for (const AsmSingleVReg& vreg: vregsInFirstReturn)
     1601                        if (curSVRegMap.find(vreg) == curSVRegMap.end())
     1602                            // not found in this path then add to 'not in all paths'
     1603                            vregsNotInAllRets.insert(vreg);
     1604               
     1605                notFirstReturn = true;
    15801606            }
    15811607            // revert curSVRegMap
     
    15971623            flowStack.pop_back();
    15981624        }
     1625    }
     1626   
     1627    // handle unused svregs in this path (from routine start) and
     1628    // used other paths and have this same ssaId as at routine start.
     1629    // just add to lastAccessMap svreg for start to join through all routine
     1630    for (const AsmSingleVReg& svreg: vregsNotInAllRets)
     1631    {
     1632        auto res = rdata.lastAccessMap.insert({ svreg, { { routineBlock, false } } });
     1633        if (!res.second)
     1634            res.first->second.insertValue({ routineBlock, false });
    15991635    }
    16001636}
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4128 r4129  
    11281128                { { 36, 37 }, { 57, 68 }, { 69, 76 } }, // 8: sa[2]'2
    11291129                { { 37, 38 } }, // 9: sa[2]'3
    1130                 { { 5, 41 }, { 48, 68 } }, // 10: sa[3]'0
     1130                { { 5, 41 }, { 48, 76 } }, // 10: sa[3]'0
    11311131                { { 41, 42 } }, // 11: sa[3]'1
    11321132                { { 0, 36 }, { 48, 61 }, { 68, 69 } }, // 12: sa[4]'0
     
    12261226        { }, // vidxCallMap
    12271227        true, ""
    1228     }
     1228    },
    12291229#if 0
    1230     ,
    12311230    {   // 21 - many nested routines - path penetration
    12321231        R"ffDXD(.regvar sa:s:8, va:v:8
     
    12941293        {   // livenesses
    12951294            {   // for SGPRs
    1296                 { { 1, 2 }, { 61, 69 }, { 77, 85 }, { 88, 104 },
    1297                     { }, { }, { }, { } }, // 0: S0
    1298                 { }, // 1: S1
    1299                 { }, // 2: S2
    1300                 { }, // 3: S3
    1301                 { }, // 4: sa:0
    1302                 { }, // 5: sa:1
    1303                 { }, // 6: sa:2
    1304                 { }, // 7: sa:2
    1305                 { }, // 8: sa:3
    1306                 { }, // 9: sa:4
    1307                 { }, // 10: sa:5
    1308                 { }, // 11: sa:6
    1309                 { }, // 12: sa:7
    1310                 { }, // 13: sa:7
    1311                 { }, // 14: sa:7
    1312                 { }, // 15: sa:7
    1313                 { }, // 16: sa:7
    1314                 { }, // 17: sa:7
    1315                 { }  // 18: sa:7
     1295                { { 1, 2 }, { 61, 69 }, { 77, 85 }, { 88, 152 } }, // 0: S0
     1296                { { 1, 2 }, { 61, 69 }, { 77, 85 }, { 88, 152 } }, // 1: S1
     1297                { { 0, 4 }, { 48, 61 }, { 72, 77 } }, // 2: S2
     1298                { { 0, 4 }, { 48, 61 }, { 72, 77 } }, // 3: S3
     1299                { { 0, 4 }, { 48, 64 }, { 72, 80 }, { 88, 97 },
     1300                    { 104, 105 }, { 112, 121 }, { 128, 129 } }, // 4: sa[0]'0
     1301                { { 0, 5 } }, // 5: sa[1]'0
     1302                { { 0, 9 }, { 48, 88 }, { 89, 152 } }, // 6: sa[2]'0
     1303                { }, // 7: sa[2]'1
     1304                { }, // 8: sa[3]'0
     1305                { }, // 9: sa[4]'0
     1306                { }, // 10: sa[5]'0
     1307                { }, // 11: sa[6]'0
     1308                { }, // 12: sa[7]'0
     1309                { }, // 13: sa[7]'1
     1310                { }, // 14: sa[7]'2
     1311                { }, // 15: sa[7]'3
     1312                { }, // 16: sa[7]'4
     1313                { }, // 17: sa[7]'5
     1314                { }  // 18: sa[7]'6
    13161315            },
    13171316            {   // for VGPs
Note: See TracChangeset for help on using the changeset viewer.