Changeset 3909 in CLRX


Ignore:
Timestamp:
Mar 19, 2018, 5:56:44 PM (5 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: small optimization (do not add cachedRdata loopEnd to dest, because was added).

File:
1 edited

Legend:

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

    r3908 r3909  
    596596typedef std::unordered_map<AsmSingleVReg, RetSSAEntry> RetSSAIdMap;
    597597
     598struct CLRX_INTERNAL LoopSSAIdMap
     599{
     600    LastSSAIdMap ssaIdMap;
     601    bool passed;
     602};
     603
    598604struct CLRX_INTERNAL RoutineData
    599605{
     
    603609    LastSSAIdMap lastSSAIdMap;
    604610    // key - loop block, value - last ssaId map for loop end
    605     std::unordered_map<size_t, LastSSAIdMap> loopEnds;
     611    std::unordered_map<size_t, LoopSSAIdMap> loopEnds;
    606612    bool notFirstReturn;
    607613    size_t weight_;
     
    614620        weight_ = rbwSSAIdMap.size() + lastSSAIdMap.weight();
    615621        for (const auto& entry: loopEnds)
    616             weight_ += entry.second.weight();
     622            weight_ += entry.second.ssaIdMap.weight();
    617623    }
    618624   
     
    13191325            rdata.lastSSAIdMap.insert({ ssaEntry.first, { prevSSAId } });
    13201326            for (auto& loopEnd: rdata.loopEnds)
    1321                 loopEnd.second.insert({ ssaEntry.first, { prevSSAId } });
     1327                loopEnd.second.ssaIdMap.insert({ ssaEntry.first, { prevSSAId } });
    13221328        }
    13231329    }
     
    14261432    std::cout << std::endl;
    14271433}
    1428 
    1429 struct CLRX_INTERNAL LoopSSAIdMap
    1430 {
    1431     LastSSAIdMap ssaIdMap;
    1432     bool passed;
    1433 };
    14341434
    14351435static void createRoutineData(const std::vector<CodeBlock>& codeBlocks,
     
    14531453    flowStackBlocks[routineBlock] = true;
    14541454   
    1455     std::unordered_map<size_t, LoopSSAIdMap> loopSSAIdMap;
    1456    
    14571455    while (!flowStack.empty())
    14581456    {
     
    14701468                    // handle loops
    14711469                    std::cout << "  join loop ssaids: " << entry.blockIndex << std::endl;
    1472                     auto loopsit = loopSSAIdMap.find(entry.blockIndex);
    1473                     if (loopsit != loopSSAIdMap.end())
    1474                     {
    1475                         if (!loopsit->second.passed)
    1476                             // still in loop join ssaid map
    1477                             joinLastSSAIdMap(loopsit->second.ssaIdMap, rdata.curSSAIdMap);
    1478                     }
    1479                     else // insert new
    1480                         loopsit = loopSSAIdMap.insert({ entry.blockIndex,
    1481                                     { rdata.curSSAIdMap, false } }).first;
    1482                    
    14831470                    // add to routine data loopEnds
    14841471                    auto loopsit2 = rdata.loopEnds.find(entry.blockIndex);
    14851472                    if (loopsit2 != rdata.loopEnds.end())
    14861473                    {
    1487                         if (!loopsit->second.passed)
     1474                        if (!loopsit2->second.passed)
    14881475                            // still in loop join ssaid map
    1489                             joinLastSSAIdMap(loopsit2->second, rdata.curSSAIdMap);
     1476                            joinLastSSAIdMap(loopsit2->second.ssaIdMap, rdata.curSSAIdMap);
    14901477                    }
    14911478                    else
    1492                         rdata.loopEnds.insert({ entry.blockIndex, rdata.curSSAIdMap });
     1479                        rdata.loopEnds.insert({ entry.blockIndex,
     1480                                    { rdata.curSSAIdMap, false } });
    14931481                }
    14941482               
     
    15331521                                    entry.blockIndex << std::endl;
    15341522                            joinLastSSAIdMap(subrData.lastSSAIdMap,
    1535                                     loopsit2->second, subrData, true);
     1523                                    loopsit2->second.ssaIdMap, subrData, true);
    15361524                            std::cout << "   loopssaIdMap2End: " << std::endl;
    15371525                        }
     
    15531541                for (const auto& loopEnd: cachedRdata->loopEnds)
    15541542                {
    1555                     auto res = rdata.loopEnds.insert({ loopEnd.first, { } });
    1556                     joinLastSSAIdMapInt(res.first->second, rdata.curSSAIdMap,
    1557                                 cachedRdata->curSSAIdMap, loopEnd.second, false);
     1543                    auto res = rdata.loopEnds.insert({ loopEnd.first, LoopSSAIdMap() });
     1544                    // true - do not add cached rdata loopend, because it was added
     1545                    joinLastSSAIdMapInt(res.first->second.ssaIdMap, rdata.curSSAIdMap,
     1546                                cachedRdata->curSSAIdMap, loopEnd.second.ssaIdMap, true);
    15581547                }
    15591548                std::cout << "procretend2" << std::endl;
     
    15811570                // handle loops
    15821571                std::cout << "  join loop ssaids: " << entry.blockIndex << std::endl;
    1583                 auto loopsit = loopSSAIdMap.find(entry.blockIndex);
    1584                 if (loopsit != loopSSAIdMap.end())
    1585                 {
    1586                     if (!loopsit->second.passed)
    1587                         // still in loop join ssaid map
    1588                         joinLastSSAIdMap(loopsit->second.ssaIdMap, rdata.curSSAIdMap);
    1589                 }
    1590                 else // insert new
    1591                     loopsit = loopSSAIdMap.insert({ entry.blockIndex,
    1592                                 { rdata.curSSAIdMap, false } }).first;
    1593                
    15941572                // add to routine data loopEnds
    15951573                auto loopsit2 = rdata.loopEnds.find(entry.blockIndex);
    15961574                if (loopsit2 != rdata.loopEnds.end())
    15971575                {
    1598                     if (!loopsit->second.passed)
     1576                    if (!loopsit2->second.passed)
    15991577                        // still in loop join ssaid map
    1600                         joinLastSSAIdMap(loopsit2->second, rdata.curSSAIdMap);
     1578                        joinLastSSAIdMap(loopsit2->second.ssaIdMap, rdata.curSSAIdMap);
    16011579                }
    16021580                else
    1603                     rdata.loopEnds.insert({ entry.blockIndex, rdata.curSSAIdMap });
     1581                    rdata.loopEnds.insert({ entry.blockIndex,
     1582                                { rdata.curSSAIdMap, false } });
    16041583               
    16051584                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
     
    16831662            }
    16841663           
    1685             auto loopsit = loopSSAIdMap.find(entry.blockIndex);
    16861664            auto loopsit2 = rdata.loopEnds.find(entry.blockIndex);
    16871665            if (flowStack.size() > 1 && subroutToCache.count(entry.blockIndex)!=0)
     
    17001678                    {
    17011679                        std::cout << "   loopssaIdMap: " << entry.blockIndex << std::endl;
    1702                         joinLastSSAIdMap(subrData.lastSSAIdMap, loopsit2->second,
     1680                        joinLastSSAIdMap(subrData.lastSSAIdMap, loopsit2->second.ssaIdMap,
    17031681                                         subrData, true);
    17041682                        std::cout << "   loopssaIdMapEnd: " << std::endl;
    17051683                        // for main routine now
    1706                         joinLastSSAIdMap(rdata.lastSSAIdMap, loopsit2->second,
     1684                        joinLastSSAIdMap(rdata.lastSSAIdMap, loopsit2->second.ssaIdMap,
    17071685                                        subrData, true);
    17081686                    }
     
    17131691            if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
    17141692            {
    1715                 if (loopsit != loopSSAIdMap.end())
     1693                if (loopsit2 != rdata.loopEnds.end())
    17161694                {
    17171695                    std::cout << "   mark loopblocks passed: " <<
    17181696                                entry.blockIndex << std::endl;
    17191697                    // mark that loop has passed fully
    1720                     loopsit->second.passed = true;
     1698                    loopsit2->second.passed = true;
    17211699                }
    17221700                else
Note: See TracChangeset for help on using the changeset viewer.