Changeset 4004 in CLRX


Ignore:
Timestamp:
Apr 15, 2018, 9:32:36 AM (8 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed applySSAReplaces: more testcase with more complex path sharing.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r4002 r4004  
    462462        size_t minSSAId;
    463463        bool visited;
    464         size_t parentsNum;
    465         size_t parentsCount;
    466464        std::unordered_set<size_t> nexts;
    467         MinSSAGraphNode() : minSSAId(SIZE_MAX), visited(false),
    468             parentsNum(0), parentsCount(0)
     465        MinSSAGraphNode() : minSSAId(SIZE_MAX), visited(false)
    469466        { }
    470467    };
     
    520517        std::stack<MinSSAGraphStackEntry> minSSAStack;
    521518       
    522         // initialize parentsNumber
     519        // initialize parents and new nexts
    523520        for (auto ssaGraphNodeIt = ssaGraphNodes.begin();
    524521                 ssaGraphNodeIt!=ssaGraphNodes.end(); )
     
    534531                if (entry.nextIt == node.nexts.begin())
    535532                {
    536                     node.parentsNum++;
    537                     if (!node.visited)
    538                         node.visited = true;
    539                     else
    540                         toPop = true;
     533                    toPop = node.visited;
     534                    node.visited = true;
    541535                }
    542536                if (!toPop && entry.nextIt != node.nexts.end())
     
    549543                }
    550544                else
     545                {
    551546                    minSSAStack.pop();
     547                    if (!minSSAStack.empty())
     548                        node.nexts.insert(minSSAStack.top().nodeIt->first);
     549                }
    552550            }
    553551           
     
    558556        }
    559557       
     558        /*for (const auto& v: ssaGraphNodes)
     559        {
     560            ARDOut << "  Nexts: " << v.first << ":" << &v.second << " nexts:";
     561            for (size_t p: v.second.nexts)
     562                ARDOut << " " << p;
     563            ARDOut << "\n";
     564        }*/
     565       
    560566        for (auto& entry: ssaGraphNodes)
    561567            entry.second.visited = false;
     
    571577                MinSSAGraphStackEntry& entry = minSSAStack.top();
    572578                MinSSAGraphNode& node = entry.nodeIt->second;
     579                bool toPop = false;
    573580                if (entry.nextIt == node.nexts.begin())
    574581                {
     582                    toPop = node.visited;
    575583                    node.visited = true;
    576                     node.parentsCount++;
    577584                }
    578585               
    579586                // 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())
     587                if (!toPop && entry.nextIt != node.nexts.end())
    582588                {
    583589                    auto nodeIt = ssaGraphNodes.find(*entry.nextIt);
    584590                    if (nodeIt != ssaGraphNodes.end())
    585591                    {
    586                         ARDOut << "  Node: " << &node << " minSSAId: " <<
     592                        ARDOut << "  Node: " <<
     593                                entry.nodeIt->first << ":" << &node << " minSSAId: " <<
    587594                                node.minSSAId << " to " <<
    588                                 nodeIt->first << ": " << &(nodeIt->second) <<
     595                                nodeIt->first << ":" << &(nodeIt->second) <<
    589596                                " minSSAId: " << nodeIt->second.minSSAId << "\n";
    590597                        minSSAStack.push({ nodeIt, nodeIt->second.nexts.begin(),
     
    596603                {
    597604                    node.minSSAId = std::min(node.minSSAId, entry.minSSAId);
    598                     ARDOut << "    Node: " << &node << " minSSAId: " <<
     605                    ARDOut << "    Node: " <<
     606                                entry.nodeIt->first << ":" << &node << " minSSAId: " <<
    599607                                node.minSSAId << "\n";
    600608                    minSSAStack.pop();
     
    611619                if (!ssaGraphNodeIt->second.visited)
    612620                    break;
    613         }
    614        
    615         // reset visited and parentsCount
    616         for (auto& entry: ssaGraphNodes)
    617         {
    618             entry.second.visited = false;
    619             entry.second.parentsCount = 0;
    620         }
    621        
     621            // zeroing visited
     622            for (auto& entry: ssaGraphNodes)
     623                entry.second.visited = false;
     624        }
     625       
     626        // final fill up
    622627        for (auto ssaGraphNodeIt = ssaGraphNodes.begin();
    623628                 ssaGraphNodeIt!=ssaGraphNodes.end(); )
     
    630635                MinSSAGraphStackEntry& entry = minSSAStack.top();
    631636                MinSSAGraphNode& node = entry.nodeIt->second;
     637                bool toPop = false;
    632638                if (entry.nextIt == node.nexts.begin())
    633639                {
     640                    toPop = node.visited;
    634641                    node.visited = true;
    635                     node.parentsCount++;
    636642                }
    637643               
    638644                // 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())
     645                if (!toPop && entry.nextIt != node.nexts.end())
    641646                {
    642647                    auto nodeIt = ssaGraphNodes.find(*entry.nextIt);
    643648                    if (nodeIt != ssaGraphNodes.end())
    644649                    {
    645                         ARDOut << "  Node2: " << &node << " minSSAId: " <<
     650                        ARDOut << "  Node2: " <<
     651                                entry.nodeIt->first << ":" << &node << " minSSAId: " <<
    646652                                node.minSSAId << " to " <<
    647                                 nodeIt->first << ": " << &(nodeIt->second) <<
     653                                nodeIt->first << ":" << &(nodeIt->second) <<
    648654                                " minSSAId: " << nodeIt->second.minSSAId << "\n";
    649655                        nodeIt->second.minSSAId =
     
    657663                {
    658664                    node.minSSAId = std::min(node.minSSAId, entry.minSSAId);
    659                     ARDOut << "    Node2: " << &node << " minSSAId: " <<
     665                    ARDOut << "    Node2: " <<
     666                                entry.nodeIt->first << ":" << &node << " minSSAId: " <<
    660667                                node.minSSAId << "\n";
    661668                    minSSAStack.pop();
     
    672679                if (!ssaGraphNodeIt->second.visited)
    673680                    break;
     681           
     682            // zeroing visited
     683            for (auto& entry: ssaGraphNodes)
     684                entry.second.visited = false;
    674685        }
    675686       
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc2.cpp

    r4003 r4004  
    420420        }
    421421    },
    422     {   // 3 - visited updating
     422    {   // 3 - paths
    423423        {
    424424            { 0, 4,
     
    618618                {
    619619                    { { "sa", 2 }, SSAInfo(1, 19, 19, 19, 1, true) }
     620                }, false, false, false }
     621        }
     622    },
     623    {   // 4 - paths
     624        {
     625            { 0, 4,
     626                { },
     627                {
     628                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, true) }
     629                }, false, false, false },
     630            { 4, 8,
     631                { },
     632                {
     633                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) }
     634                }, false, false, false },
     635            { 8, 12,
     636                { },
     637                {
     638                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
     639                }, false, false, false },
     640            { 12, 16,
     641                { },
     642                {
     643                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
     644                }, false, false, false },
     645            { 16, 20,
     646                { },
     647                {
     648                    { { "sa", 2 }, SSAInfo(4, 5, 5, 5, 1, true) }
     649                }, false, false, false },
     650            { 20, 24,
     651                { },
     652                {
     653                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) }
     654                }, false, false, false },
     655            { 24, 28,
     656                { },
     657                {
     658                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) }
     659                }, false, false, false },
     660            { 28, 32,
     661                { },
     662                {
     663                    { { "sa", 2 }, SSAInfo(7, 8, 8, 8, 1, true) }
     664                }, false, false, false },
     665            { 32, 36,
     666                { },
     667                {
     668                    { { "sa", 2 }, SSAInfo(8, 9, 9, 9, 1, true) }
     669                }, false, false, false },
     670            { 36, 40,
     671                { },
     672                {
     673                    { { "sa", 2 }, SSAInfo(9, 10, 10, 10, 1, true) }
     674                }, false, false, false },
     675            { 40, 44,
     676                { },
     677                {
     678                    { { "sa", 2 }, SSAInfo(10, 11, 11, 11, 1, true) }
     679                }, false, false, false },
     680            { 44, 48,
     681                { },
     682                {
     683                    { { "sa", 2 }, SSAInfo(11, 12, 12, 12, 1, true) }
     684                }, false, false, false },
     685            { 48, 52,
     686                { },
     687                {
     688                    { { "sa", 2 }, SSAInfo(12, 13, 13, 13, 1, true) }
     689                }, false, false, false },
     690            { 52, 56,
     691                { },
     692                {
     693                    { { "sa", 2 }, SSAInfo(13, 14, 14, 14, 1, true) }
     694                }, false, false, false },
     695            { 56, 60,
     696                { },
     697                {
     698                    { { "sa", 2 }, SSAInfo(14, 15, 15, 15, 1, true) }
     699                }, false, false, false },
     700            { 60, 64,
     701                { },
     702                {
     703                    { { "sa", 2 }, SSAInfo(15, 16, 16, 16, 1, true) }
     704                }, false, false, false },
     705            { 64, 68,
     706                { },
     707                {
     708                    { { "sa", 2 }, SSAInfo(16, 17, 17, 17, 1, true) }
     709                }, false, false, false },
     710            { 68, 72,
     711                { },
     712                {
     713                    { { "sa", 2 }, SSAInfo(17, 18, 18, 18, 1, true) }
     714                }, false, false, false },
     715            { 72, 76,
     716                { },
     717                {
     718                    { { "sa", 2 }, SSAInfo(18, 19, 19, 19, 1, true) }
     719                }, false, false, false }
     720        },
     721        {
     722            { { "sa", 2 }, { { 19, 9 }, { 17, 9 }, { 17, 7 }, { 15, 7 }, { 15, 5 },
     723                        { 13, 5 }, { 13, 3 }, { 11, 3 }, { 11, 1 },
     724                        { 9, 8 }, { 7, 6 }, { 5, 4 }, { 3, 2 } } }
     725        },
     726        // expected blocks
     727        {
     728            { 0, 4,
     729                { },
     730                {
     731                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, true) }
     732                }, false, false, false },
     733            { 4, 8,
     734                { },
     735                {
     736                    { { "sa", 2 }, SSAInfo(1, 1, 2, 1, 1, true) }
     737                }, false, false, false },
     738            { 8, 12,
     739                { },
     740                {
     741                    { { "sa", 2 }, SSAInfo(1, 1, 3, 1, 1, true) }
     742                }, false, false, false },
     743            { 12, 16,
     744                { },
     745                {
     746                    { { "sa", 2 }, SSAInfo(1, 1, 4, 1, 1, true) }
     747                }, false, false, false },
     748            { 16, 20,
     749                { },
     750                {
     751                    { { "sa", 2 }, SSAInfo(1, 1, 5, 1, 1, true) }
     752                }, false, false, false },
     753            { 20, 24,
     754                { },
     755                {
     756                    { { "sa", 2 }, SSAInfo(1, 1, 6, 1, 1, true) }
     757                }, false, false, false },
     758            { 24, 28,
     759                { },
     760                {
     761                    { { "sa", 2 }, SSAInfo(1, 1, 7, 1, 1, true) }
     762                }, false, false, false },
     763            { 28, 32,
     764                { },
     765                {
     766                    { { "sa", 2 }, SSAInfo(1, 1, 8, 1, 1, true) }
     767                }, false, false, false },
     768            { 32, 36,
     769                { },
     770                {
     771                    { { "sa", 2 }, SSAInfo(1, 1, 9, 1, 1, true) }
     772                }, false, false, false },
     773            { 36, 40,
     774                { },
     775                {
     776                    { { "sa", 2 }, SSAInfo(1, 10, 10, 10, 1, true) }
     777                }, false, false, false },
     778            { 40, 44,
     779                { },
     780                {
     781                    { { "sa", 2 }, SSAInfo(10, 1, 11, 1, 1, true) }
     782                }, false, false, false },
     783            { 44, 48,
     784                { },
     785                {
     786                    { { "sa", 2 }, SSAInfo(1, 12, 12, 12, 1, true) }
     787                }, false, false, false },
     788            { 48, 52,
     789                { },
     790                {
     791                    { { "sa", 2 }, SSAInfo(12, 1, 13, 1, 1, true) }
     792                }, false, false, false },
     793            { 52, 56,
     794                { },
     795                {
     796                    { { "sa", 2 }, SSAInfo(1, 14, 14, 14, 1, true) }
     797                }, false, false, false },
     798            { 56, 60,
     799                { },
     800                {
     801                    { { "sa", 2 }, SSAInfo(14, 1, 15, 1, 1, true) }
     802                }, false, false, false },
     803            { 60, 64,
     804                { },
     805                {
     806                    { { "sa", 2 }, SSAInfo(1, 16, 16, 16, 1, true) }
     807                }, false, false, false },
     808            { 64, 68,
     809                { },
     810                {
     811                    { { "sa", 2 }, SSAInfo(16, 1, 17, 1, 1, true) }
     812                }, false, false, false },
     813            { 68, 72,
     814                { },
     815                {
     816                    { { "sa", 2 }, SSAInfo(1, 18, 18, 18, 1, true) }
     817                }, false, false, false },
     818            { 72, 76,
     819                { },
     820                {
     821                    { { "sa", 2 }, SSAInfo(18, 1, 19, 1, 1, true) }
    620822                }, false, false, false }
    621823        }
Note: See TracChangeset for help on using the changeset viewer.