Changeset 3957 in CLRX


Ignore:
Timestamp:
Apr 1, 2018, 3:11:56 PM (3 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Correct passing by filled block in second recursion pass. Correct reducing SSAIds in second recursion pass.
Other fixes for recursion support.

File:
1 edited

Legend:

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

    r3956 r3957  
    14471447        auto& ssaIds = ssaIdsIt->second.ssaIds;
    14481448       
    1449         if (ssaIds.size() >= 2)
     1449        if (sinfo.ssaId != SIZE_MAX)
     1450        {
     1451            std::vector<size_t> outSSAIds = ssaIds;
     1452            outSSAIds.push_back(sinfo.ssaIdBefore); // ???
     1453            // already set
     1454            if (outSSAIds.size() >= 1)
     1455            {
     1456                // reduce to minimal ssaId from all calls
     1457                std::sort(outSSAIds.begin(), outSSAIds.end());
     1458                outSSAIds.resize(std::unique(outSSAIds.begin(), outSSAIds.end()) -
     1459                            outSSAIds.begin());
     1460                // insert SSA replaces
     1461                size_t minSSAId = outSSAIds.front();
     1462                for (auto sit = outSSAIds.begin()+1; sit != outSSAIds.end(); ++sit)
     1463                    insertReplace(ssaReplacesMap, ssaEntry.first, *sit, minSSAId);
     1464            }
     1465        }
     1466        else if (ssaIds.size() >= 2)
    14501467        {
    14511468            // reduce to minimal ssaId from all calls
     
    16491666
    16501667
     1668// TODO: fix curSSAIdMap between recursive call returns
    16511669static void createRoutineData(const std::vector<CodeBlock>& codeBlocks,
    16521670        std::unordered_map<AsmSingleVReg, size_t>& curSSAIdMap,
     
    20812099    std::unordered_set<size_t> recurseBlocks;
    20822100   
     2101    std::unordered_map<size_t, std::unordered_map<AsmSingleVReg, size_t> >
     2102            curSSAIdMapStateMap;
     2103   
    20832104    while (!flowStack.empty())
    20842105    {
     
    21032124                        sinfo.ssaIdChange = 0; // zeroing SSA changes
    21042125                        continue; // no change for registers
     2126                    }
     2127                   
     2128                    if (sinfo.ssaId != SIZE_MAX)
     2129                    {
     2130                        // already initialized
     2131                        reduceSSAIds(curSSAIdMap, retSSAIdMap,
     2132                                routineMap, ssaReplacesMap, entry, ssaEntry);
     2133                        if (sinfo.ssaIdChange!=0)
     2134                            curSSAIdMap[ssaEntry.first] = sinfo.ssaIdLast+1;
     2135                       
     2136                        // count read before writes (for cache weight)
     2137                        if (sinfo.readBeforeWrite)
     2138                            rbwCount++;
     2139                        if (sinfo.ssaIdChange!=0)
     2140                            wrCount++;
     2141                        continue;
    21052142                    }
    21062143                   
     
    21972234                        std::cout << "   -- recursion: " << nextBlock << std::endl;
    21982235                        nextBlock.pass = 1;
     2236                       
     2237                        curSSAIdMapStateMap.insert({ nextBlock.index,  curSSAIdMap });
    21992238                    }
    22002239                    else
     
    22132252                }
    22142253                std::cout << " call: " << entry.blockIndex << std::endl;
    2215                
     2254                               
    22162255                callStack.push_back({ entry.blockIndex, entry.nextIndex, nextBlock });
    22172256                routineMap.insert({ nextBlock, { } });
     
    22442283                    {
    22452284                        //std::cout << "joincall:"<< next.block << std::endl;
    2246                         auto it = routineMap.find(next.block); // must find
     2285                        size_t pass = 0;
     2286                        if (callBlocks.find(next.block) != callBlocks.end())
     2287                        {
     2288                            std::cout << " is secpass: " << entry.blockIndex << " : " <<
     2289                                    next.block << std::endl;
     2290                            pass = 1; // it ways second pass
     2291                        }
     2292                       
     2293                        auto it = routineMap.find({ next.block, pass }); // must find
    22472294                        initializePrevRetSSAIds(cblock, curSSAIdMap, retSSAIdMap,
    22482295                                    it->second, entry);
     
    22872334            std::cout << "pop: " << entry.blockIndex << std::endl;
    22882335            flowStackBlocks[entry.blockIndex] = false;
     2336           
     2337            if (!flowStack.empty() && flowStack.back().isCall)
     2338            {
     2339                auto csimsmit = curSSAIdMapStateMap.find(entry.blockIndex.index);
     2340                if (csimsmit != curSSAIdMapStateMap.end())
     2341                {
     2342                    std::cout << " get curSSAIdMap from back recur" << std::endl;
     2343                    curSSAIdMap = csimsmit->second;
     2344                }
     2345            }
    22892346            flowStack.pop_back();
     2347           
    22902348            if (!flowStack.empty() && lastCommonCacheWayPoint.first != SIZE_MAX &&
    22912349                    lastCommonCacheWayPoint.second >= flowStack.size())
     
    22952353                std::cout << "POPlastCcwP: " << lastCommonCacheWayPoint.first << std::endl;
    22962354            }
    2297            
    22982355        }
    22992356    }
Note: See TracChangeset for help on using the changeset viewer.