Changeset 3905 in CLRX


Ignore:
Timestamp:
Mar 18, 2018, 2:43:09 PM (4 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Add loopEnds to RoutineData? and stuff collecting lastSSAIds in loop ends.

File:
1 edited

Legend:

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

    r3904 r3905  
    602602    LastSSAIdMap curSSAIdMap;
    603603    LastSSAIdMap lastSSAIdMap;
     604    // key - loop block, value - last ssaId map for loop end
     605    std::unordered_map<size_t, LastSSAIdMap> loopEnds;
    604606    bool notFirstReturn;
    605    
    606     RoutineData() : notFirstReturn(false)
     607    size_t weight_;
     608   
     609    RoutineData() : notFirstReturn(false), weight_(0)
    607610    { }
    608611   
     612    void calculateWeight()
     613    {
     614        weight_ = rbwSSAIdMap.size() + lastSSAIdMap.weight();
     615        for (const auto& entry: loopEnds)
     616            weight_ += entry.second.weight();
     617    }
     618   
    609619    size_t weight() const
    610     { return rbwSSAIdMap.size() + lastSSAIdMap.weight(); }
     620    { return weight_; }
    611621};
    612622
     
    11451155}
    11461156
    1147 static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src,
    1148                     const RoutineData& laterRdata, bool loop = false)
     1157static void joinLastSSAIdMapInt(LastSSAIdMap& dest, const LastSSAIdMap& src,
     1158                    const LastSSAIdMap& laterRdataCurSSAIdMap,
     1159                    const LastSSAIdMap& laterRdataLastSSAIdMap, bool loop)
    11491160{
    11501161    for (const auto& entry: src)
    11511162    {
    1152         auto lsit = laterRdata.lastSSAIdMap.find(entry.first);
    1153         if (lsit != laterRdata.lastSSAIdMap.end())
    1154         {
    1155             auto csit = laterRdata.curSSAIdMap.find(entry.first);
    1156             if (csit != laterRdata.curSSAIdMap.end() && !csit->second.empty())
     1163        auto lsit = laterRdataLastSSAIdMap.find(entry.first);
     1164        if (lsit != laterRdataLastSSAIdMap.end())
     1165        {
     1166            auto csit = laterRdataCurSSAIdMap.find(entry.first);
     1167            if (csit != laterRdataCurSSAIdMap.end() && !csit->second.empty())
    11571168            {
    11581169                // if found in last ssa ID map,
     
    11831194    }
    11841195    if (!loop) // do not if loop
    1185         joinLastSSAIdMap(dest, laterRdata.lastSSAIdMap);
     1196        joinLastSSAIdMap(dest, laterRdataLastSSAIdMap);
     1197}
     1198
     1199static void joinLastSSAIdMap(LastSSAIdMap& dest, const LastSSAIdMap& src,
     1200                    const RoutineData& laterRdata, bool loop = false)
     1201{
     1202    joinLastSSAIdMapInt(dest, src, laterRdata.curSSAIdMap, laterRdata.lastSSAIdMap, loop);
    11861203}
    11871204
     
    13001317        // add readbefore if in previous returns if not added yet
    13011318        if (rdata.notFirstReturn && beforeFirstAccess)
     1319        {
    13021320            rdata.lastSSAIdMap.insert({ ssaEntry.first, { prevSSAId } });
     1321            for (auto& loopEnd: rdata.loopEnds)
     1322                loopEnd.second.insert({ ssaEntry.first, { prevSSAId } });
     1323        }
    13031324    }
    13041325    else
     
    14891510                        }
    14901511                    }
     1512                    subrData.calculateWeight();
    14911513                    subroutinesCache.put(entry.blockIndex, subrData);
    14921514                   
     
    15001522                std::cout << "procret2: " << entry.blockIndex << std::endl;
    15011523                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap, *cachedRdata);
     1524               
     1525                // join loopEnds
     1526                for (const auto& loopEnd: cachedRdata->loopEnds)
     1527                {
     1528                    auto res = rdata.loopEnds.insert({ loopEnd.first, { } });
     1529                    joinLastSSAIdMapInt(res.first->second, rdata.curSSAIdMap,
     1530                                cachedRdata->curSSAIdMap, loopEnd.second, false);
     1531                }
    15021532                std::cout << "procretend2" << std::endl;
    15031533                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
     
    15321562                }
    15331563                else // insert new
    1534                     loopSSAIdMap.insert({ entry.blockIndex,
    1535                                 { rdata.curSSAIdMap, false } });
     1564                    loopsit = loopSSAIdMap.insert({ entry.blockIndex,
     1565                                { rdata.curSSAIdMap, false } }).first;
     1566               
     1567                // add to routine data loopEnds
     1568                auto loopsit2 = rdata.loopEnds.find(entry.blockIndex);
     1569                if (loopsit2 != rdata.loopEnds.end())
     1570                {
     1571                    if (!loopsit->second.passed)
     1572                        // still in loop join ssaid map
     1573                        joinLastSSAIdMap(loopsit2->second, rdata.curSSAIdMap);
     1574                }
     1575                else
     1576                    rdata.loopEnds.insert({ entry.blockIndex, rdata.curSSAIdMap });
    15361577               
    15371578                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
     
    16391680                    }
    16401681                }
     1682                subrData.calculateWeight();
    16411683                subroutinesCache.put(entry.blockIndex, subrData);
    16421684            }
     
    20062048                            resFirstPointsCache, resSecondPointsCache, ssaReplacesMap);
    20072049               
    2008                 // join routine data
    2009                 /*auto rit = routineMap.find(entry.blockIndex);
    2010                 if (rit != routineMap.end())
    2011                     // just join with current routine data
    2012                     joinRoutineData(routineMap.find(
    2013                             callStack.back().routineBlock)->second, rit->second);*/
    2014                 /*if (!callStack.empty())
    2015                     collectSSAIdsForCall(flowStack2, callStack, visited,
    2016                             routineMap, codeBlocks);*/
    20172050                // back, already visited
    20182051                flowStack2.pop_back();
Note: See TracChangeset for help on using the changeset viewer.