Changeset 3647 in CLRX


Ignore:
Timestamp:
Jan 20, 2018, 5:46:10 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Including retSSAIds while traversing through routine while collecting lastSSAIds and curSSAIds for this routine.
A working testcase with nested routines.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3646 r3647  
    644644    for (const auto& entry: src)
    645645    {
    646         std::cout << "entry2: " << entry.first.regVar << ":" <<
     646        std::cout << "  entry2: " << entry.first.regVar << ":" <<
    647647                cxuint(entry.first.index) << ":";
    648648        for (size_t v: entry.second)
     
    662662                destEntry.push_back(ssaId);
    663663        }
    664         std::cout << "  :";
     664        std::cout << "    :";
    665665        for (size_t v: destEntry)
    666666            std::cout << " " << v;
     
    701701    dest.rbwSSAIdMap.insert(src.rbwSSAIdMap.begin(), src.rbwSSAIdMap.end());
    702702   
    703     joinLastSSAIdMap(dest.curSSAIdMap, src.curSSAIdMap);
     703    //joinLastSSAIdMap(dest.curSSAIdMap, src.lastSSAIdMap);
     704   
     705    for (const auto& entry: src.lastSSAIdMap)
     706    {
     707        std::cout << "  entry3: " << entry.first.regVar << ":" <<
     708                cxuint(entry.first.index) << ":";
     709        for (size_t v: entry.second)
     710            std::cout << " " << v;
     711        std::cout << std::endl;
     712        auto res = dest.curSSAIdMap.insert(entry); // find
     713        std::vector<size_t>& destEntry = res.first->second;
     714        if (!res.second)
     715        {
     716            // add new ways
     717            for (size_t ssaId: entry.second)
     718            {
     719                auto it = std::find(destEntry.begin(), destEntry.end(), ssaId);
     720                if (it == destEntry.end())
     721                    destEntry.push_back(ssaId);
     722            }
     723        }
     724        auto rbwit = src.rbwSSAIdMap.find(entry.first);
     725        if (rbwit != src.rbwSSAIdMap.end())
     726        {
     727            auto deit = std::find(destEntry.begin(), destEntry.end(), rbwit->second);
     728            if (deit != destEntry.end())
     729                destEntry.erase(deit);
     730        }
     731        std::cout << "    :";
     732        for (size_t v: destEntry)
     733            std::cout << " " << v;
     734        std::cout << std::endl;
     735    }
    704736}
    705737
     
    10851117                        //std::cout << "joincall:"<< next.block << std::endl;
    10861118                        auto it = routineMap.find(next.block); // must find
    1087                         for (const auto& v: it->second.curSSAIdMap)
     1119                        for (const auto& v: it->second.lastSSAIdMap)
    10881120                        {
    10891121                            auto res = entry.prevRetSSAIdSets.insert({v.first, {}});
     
    11171149            for (auto v: entry.prevRetSSAIdSets)
    11181150            {
     1151                auto rfit = retSSAIdMap.find(v.first);
     1152                if (rdata!=nullptr)
     1153                {
     1154                    std::vector<size_t>& ssaIds = rdata->curSSAIdMap[v.first];
     1155                    for (size_t ssaId: rfit->second.ssaIds)
     1156                    {
     1157                        auto ssaIdsIt = std::find(ssaIds.begin(), ssaIds.end(), ssaId);
     1158                        if (ssaIdsIt != ssaIds.end())
     1159                            ssaIds.erase(ssaIdsIt);
     1160                    }
     1161                }
     1162               
    11191163                if (!v.second.ssaIds.empty())
    1120                 {
    1121                     auto rfit = retSSAIdMap.find(v.first);
    11221164                    rfit->second = v.second;
    1123                 }
    11241165                else // erase if empty
    11251166                    retSSAIdMap.erase(v.first);
     1167               
     1168                if (rdata!=nullptr)
     1169                {
     1170                    std::vector<size_t>& ssaIds = rdata->curSSAIdMap[v.first];
     1171                    for (size_t ssaId: v.second.ssaIds)
     1172                    {
     1173                        auto ssaIdsIt = std::find(ssaIds.begin(), ssaIds.end(), ssaId);
     1174                        if (ssaIdsIt == ssaIds.end())
     1175                            ssaIds.push_back(ssaId);
     1176                    }
     1177                    if (v.second.ssaIds.empty())
     1178                        ssaIds.push_back(curSSAIdMap[v.first]-1);
     1179                   
     1180                    std::cout << " popentry2 " << entry.blockIndex << ": " <<
     1181                            v.first.regVar << ":" <<
     1182                            v.first.index << ":";
     1183                    for (size_t v: ssaIds)
     1184                            std::cout << " " << v;
     1185                        std::cout << std::endl;
     1186                   
     1187                }
    11261188            }
    11271189            //
     
    12061268            }
    12071269           
    1208             std::cout << "pop" << std::endl;
     1270            std::cout << "pop: " << entry.blockIndex << std::endl;
    12091271            flowStack.pop_back();
    12101272        }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3646 r3647  
    28842884        true, ""
    28852885    },
    2886 #if 0
    28872886    {   // 23 - nested calls
    28882887        R"ffDXD(.regvar sa:s:8, va:v:8
     
    29652964                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
    29662965                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
    2967                     { { "sa", 2 }, SSAInfo(5, 7, 7, 7, 1, true) },
    2968                     { { "sa", 3 }, SSAInfo(4, 5, 5, 5, 1, true) }
     2966                    { { "sa", 2 }, SSAInfo(4, 7, 7, 7, 1, true) },
     2967                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) }
    29692968                }, true, false, false },
    29702969            // block 2
     
    29722971                { },
    29732972                {
    2974                     { { "sa", 2 }, SSAInfo(5, 8, 8, 9, 2, true) },
    2975                     { { "sa", 3 }, SSAInfo(4, 6, 6, 6, 1, true) }
     2973                    { { "sa", 2 }, SSAInfo(4, 8, 8, 9, 2, true) },
     2974                    { { "sa", 3 }, SSAInfo(3, 6, 6, 6, 1, true) }
    29762975                }, false, false, true },
    29772976            // block 3 - routine
     
    30393038        {   // SSA replaces
    30403039            // BUG - wrong replaces from first call
    3041             { { "sa", 2 }, { { 6, 4 }, { 5, 4 }, { 7, 3 } } },
    3042             { { "sa", 3 }, { { 5, 2 } } }
     3040            { { "sa", 2 }, { { 5, 4 }, { 6, 4 }, { 7, 3 }, { 5, 4 } } },
     3041            //{ { "sa", 2 }, { { 6, 3 }, { 7, 3 }, { 5, 4 }, { 0, 0 } } },
     3042            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 5, 2 }, { 4, 3 } } }
    30433043        }, true, ""
    30443044    }
    3045 #endif
    30463045};
    30473046
Note: See TracChangeset for help on using the changeset viewer.