Changeset 3982 in CLRX


Ignore:
Timestamp:
Apr 10, 2018, 4:18:18 PM (3 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Use blockIndex as size_t in finding recursion and collecting changed regvars.

File:
1 edited

Legend:

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

    r3981 r3982  
    716716struct CLRX_INTERNAL FlowStackEntry4
    717717{
    718     BlockIndex blockIndex;
     718    size_t blockIndex;
    719719    size_t nextIndex;
    720720    bool isCall;
     
    21462146}
    21472147
    2148 typedef std::unordered_map<BlockIndex, std::unordered_set<AsmSingleVReg> >
     2148typedef std::unordered_map<size_t, std::unordered_set<AsmSingleVReg> >
    21492149                RecurChangedVarMap;
    21502150
     
    22592259    {
    22602260        FlowStackEntry4& entry = flowStack.back();
    2261         CodeBlock& cblock = codeBlocks[entry.blockIndex.index];
     2261        CodeBlock& cblock = codeBlocks[entry.blockIndex];
    22622262       
    22632263        if (entry.nextIndex == 0)
     
    22742274       
    22752275        if (!callStack.empty() &&
    2276             entry.blockIndex == callStack.back().callBlock &&
     2276            entry.blockIndex == callStack.back().callBlock.index &&
    22772277            entry.nextIndex-1 == callStack.back().callNextIndex)
    22782278        {
     
    22862286        {
    22872287            bool isCall = false;
    2288             BlockIndex nextBlock = cblock.nexts[entry.nextIndex].block;
     2288            size_t nextBlock = cblock.nexts[entry.nextIndex].block;
    22892289           
    22902290            if (cblock.nexts[entry.nextIndex].isCall)
     
    22952295                    std::cout << "finding recursions: " << nextBlock << std::endl;
    22962296                    // uncomment after tests
    2297                     recurChangedVarMap.insert({ nextBlock.index, { } });
     2297                    recurChangedVarMap.insert({ nextBlock, { } });
    22982298                    entry.nextIndex++;
    22992299                    continue;
    23002300                }
    23012301                // comment after tests
    2302                 //recurChangedVarMap.insert({ nextBlock.index, { } });
     2302                //recurChangedVarMap.insert({ nextBlock, { } });
    23032303                callStack.push_back({ entry.blockIndex, entry.nextIndex, nextBlock });
    23042304                std::cout << "finding recur: call: " << nextBlock << std::endl;
     
    23322332        loopBlocks.clear();
    23332333       
    2334         std::unordered_map<BlockIndex, std::unordered_set<AsmSingleVReg> > chLoopEnds;
     2334        std::unordered_map<size_t, std::unordered_set<AsmSingleVReg> > chLoopEnds;
    23352335       
    23362336        while (!flowStack.empty())
    23372337        {
    23382338            FlowStackEntry4& entry = flowStack.back();
    2339             CodeBlock& cblock = codeBlocks[entry.blockIndex.index];
     2339            CodeBlock& cblock = codeBlocks[entry.blockIndex];
    23402340           
    23412341            if (entry.nextIndex == 0)
     
    23902390            {
    23912391                bool isCall = false;
    2392                 BlockIndex nextBlock = cblock.nexts[entry.nextIndex].block;
     2392                size_t nextBlock = cblock.nexts[entry.nextIndex].block;
    23932393                flowStack.push_back({ nextBlock, 0, isCall });
    23942394                if (flowStackBlocks[nextBlock])
     
    26232623            if (cblock.nexts[entry.nextIndex].isCall)
    26242624            {
    2625                 bool nextRecursion = false;
     2625                bool nextRecursion = true;
    26262626                if (!callBlocks.insert(nextBlock).second)
    26272627                {
    26282628                    // if already called (then it is recursion)
    2629                     nextRecursion = recurseBlocks.insert(nextBlock.index).second;
    2630                     if (nextRecursion)
     2629                    if (recurseBlocks.insert(nextBlock.index).second)
    26312630                    {
    26322631                        std::cout << "   -- recursion: " << nextBlock << std::endl;
     
    26372636                    else if (entry.blockIndex.pass==1)
    26382637                    {
     2638                        nextRecursion = false;
    26392639                        entry.nextIndex++;
    26402640                        std::cout << " NO call (rec): " << entry.blockIndex << std::endl;
    2641                         continue;
     2641                        //continue;
    26422642                    }
    26432643                }
     
    26452645                    recurseBlocks.find(nextBlock.index) != recurseBlocks.end())
    26462646                {
     2647                    nextRecursion = false;
    26472648                    entry.nextIndex++;
    26482649                    std::cout << " NO call (rec)2: " << entry.blockIndex << std::endl;
     2650                    //continue;
     2651                }
     2652               
     2653                if (!nextRecursion)
    26492654                    continue;
    2650                 }
     2655               
    26512656                std::cout << " call: " << entry.blockIndex << std::endl;
    26522657                               
Note: See TracChangeset for help on using the changeset viewer.