Changeset 4002 in CLRX


Ignore:
Timestamp:
Apr 14, 2018, 10:21:58 PM (8 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed applySSAReplaces: counts parents and visit node if all its parents has been visited.

File:
1 edited

Legend:

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

    r4001 r4002  
    462462        size_t minSSAId;
    463463        bool visited;
    464         bool visited2;
     464        size_t parentsNum;
     465        size_t parentsCount;
    465466        std::unordered_set<size_t> nexts;
    466         MinSSAGraphNode() : minSSAId(SIZE_MAX), visited(false), visited2(false) { }
     467        MinSSAGraphNode() : minSSAId(SIZE_MAX), visited(false),
     468            parentsNum(0), parentsCount(0)
     469        { }
    467470    };
    468471   
     
    516519        // propagate min value
    517520        std::stack<MinSSAGraphStackEntry> minSSAStack;
     521       
     522        // initialize parentsNumber
    518523        for (auto ssaGraphNodeIt = ssaGraphNodes.begin();
    519524                 ssaGraphNodeIt!=ssaGraphNodes.end(); )
     
    529534                if (entry.nextIt == node.nexts.begin())
    530535                {
     536                    node.parentsNum++;
    531537                    if (!node.visited)
    532538                        node.visited = true;
     
    535541                }
    536542                if (!toPop && entry.nextIt != node.nexts.end())
     543                {
     544                    auto nodeIt = ssaGraphNodes.find(*entry.nextIt);
     545                    if (nodeIt != ssaGraphNodes.end())
     546                        minSSAStack.push({ nodeIt, nodeIt->second.nexts.begin(),
     547                                    size_t(0) });
     548                    ++entry.nextIt;
     549                }
     550                else
     551                    minSSAStack.pop();
     552            }
     553           
     554            // skip visited nodes
     555            for(; ssaGraphNodeIt != ssaGraphNodes.end(); ++ssaGraphNodeIt)
     556                if (!ssaGraphNodeIt->second.visited)
     557                    break;
     558        }
     559       
     560        for (auto& entry: ssaGraphNodes)
     561            entry.second.visited = false;
     562       
     563        for (auto ssaGraphNodeIt = ssaGraphNodes.begin();
     564                 ssaGraphNodeIt!=ssaGraphNodes.end(); )
     565        {
     566            ARDOut << "  Start in " << ssaGraphNodeIt->first << "." << "\n";
     567            minSSAStack.push({ ssaGraphNodeIt, ssaGraphNodeIt->second.nexts.begin() });
     568            // traverse with minimalize SSA id
     569            while (!minSSAStack.empty())
     570            {
     571                MinSSAGraphStackEntry& entry = minSSAStack.top();
     572                MinSSAGraphNode& node = entry.nodeIt->second;
     573                if (entry.nextIt == node.nexts.begin())
     574                {
     575                    node.visited = true;
     576                    node.parentsCount++;
     577                }
     578               
     579                // try to children only all parents are visited and if parent has children
     580                if (node.parentsCount == node.parentsNum &&
     581                    entry.nextIt != node.nexts.end())
    537582                {
    538583                    auto nodeIt = ssaGraphNodes.find(*entry.nextIt);
     
    568613        }
    569614       
     615        // reset visited and parentsCount
     616        for (auto& entry: ssaGraphNodes)
     617        {
     618            entry.second.visited = false;
     619            entry.second.parentsCount = 0;
     620        }
     621       
    570622        for (auto ssaGraphNodeIt = ssaGraphNodes.begin();
    571623                 ssaGraphNodeIt!=ssaGraphNodes.end(); )
     
    579631                MinSSAGraphNode& node = entry.nodeIt->second;
    580632                if (entry.nextIt == node.nexts.begin())
    581                     node.visited2 = true;
    582                 if (entry.nextIt != node.nexts.end())
     633                {
     634                    node.visited = true;
     635                    node.parentsCount++;
     636                }
     637               
     638                // try to children only all parents are visited and if parent has children
     639                if (node.parentsCount == node.parentsNum &&
     640                    entry.nextIt != node.nexts.end())
    583641                {
    584642                    auto nodeIt = ssaGraphNodes.find(*entry.nextIt);
     
    612670            // skip visited nodes
    613671            for(; ssaGraphNodeIt != ssaGraphNodes.end(); ++ssaGraphNodeIt)
    614                 if (!ssaGraphNodeIt->second.visited2)
     672                if (!ssaGraphNodeIt->second.visited)
    615673                    break;
    616674        }
Note: See TracChangeset for help on using the changeset viewer.