Changeset 3976 in CLRX


Ignore:
Timestamp:
Apr 9, 2018, 4:08:10 PM (6 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Prepping code to collect changed regvars within recursions (untested).

File:
1 edited

Legend:

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

    r3975 r3976  
    713713};
    714714
     715// for recursion finding collecting regvars changed in recursions
     716struct CLRX_INTERNAL FlowStackEntry4
     717{
     718    BlockIndex blockIndex;
     719    size_t nextIndex;
     720    bool isCall;
     721    bool haveReturn;
     722    std::unordered_set<AsmSingleVReg> changedVars;
     723};
     724
    715725
    716726struct CLRX_INTERNAL CallStackEntry
     
    21332143}
    21342144
     2145typedef std::unordered_map<BlockIndex, std::unordered_set<AsmSingleVReg> >
     2146                RecurChangedVarMap;
     2147
    21352148
    21362149void AsmRegAllocator::createSSAData(ISAUsageHandler& usageHandler)
     
    22312244    std::unordered_set<size_t> recurseBlocks;
    22322245   
     2246    RecurChangedVarMap recurChangedVarMap;
     2247   
     2248    {
     2249    CBlockBitPool haveReturnBlocks(codeBlocks.size(), false);
     2250    std::deque<FlowStackEntry4> flowStack;
    22332251    /*
    22342252     * find recursions
     
    22362254    while (!flowStack.empty())
    22372255    {
    2238         FlowStackEntry& entry = flowStack.back();
     2256        FlowStackEntry4& entry = flowStack.back();
    22392257        CodeBlock& cblock = codeBlocks[entry.blockIndex.index];
    22402258       
     
    22432261            // process current block
    22442262            if (!visited[entry.blockIndex])
    2245             {
    22462263                visited[entry.blockIndex] = true;
    2247             }
    22482264            else
    22492265            {
     
    22742290                    // if already called (then it is recursion)
    22752291                    std::cout << "finding recursions: " << nextBlock << std::endl;
    2276                     recurseBlocks.insert(nextBlock.index).second;
     2292                    recurChangedVarMap.insert({ nextBlock.index, { } });
    22772293                    entry.nextIndex++;
    22782294                    continue;
     
    22982314    }
    22992315   
    2300     recurseBlocks.clear();
     2316    // collecting changed regvars
     2317    for (auto& changedRegVars: recurChangedVarMap)
     2318    {
     2319        std::fill(visited.begin(), visited.end(), false);
     2320        flowStack.clear();
     2321        flowStack.push_back({ changedRegVars.first, 0 });
     2322       
     2323        while (!flowStack.empty())
     2324        {
     2325            FlowStackEntry4& entry = flowStack.back();
     2326            CodeBlock& cblock = codeBlocks[entry.blockIndex.index];
     2327           
     2328            if (entry.nextIndex == 0)
     2329            {
     2330                // process current block
     2331                if (!visited[entry.blockIndex])
     2332                {
     2333                    visited[entry.blockIndex] = true;
     2334                    for (auto& ssaEntry: cblock.ssaInfoMap)
     2335                        if (ssaEntry.second.ssaIdChange!=0)
     2336                            entry.changedVars.insert(ssaEntry.first);
     2337                }
     2338                else
     2339                {
     2340                    flowStack.pop_back();
     2341                    continue;
     2342                }
     2343            }
     2344           
     2345            if (entry.nextIndex < cblock.nexts.size())
     2346            {
     2347                bool isCall = false;
     2348                BlockIndex nextBlock = cblock.nexts[entry.nextIndex].block;
     2349                flowStack.push_back({ nextBlock, 0, isCall });
     2350                entry.nextIndex++;
     2351            }
     2352            else if (((entry.nextIndex==0 && cblock.nexts.empty()) ||
     2353                    // if have any call then go to next block
     2354                    (cblock.haveCalls && entry.nextIndex==cblock.nexts.size())) &&
     2355                    !cblock.haveReturn && !cblock.haveEnd)
     2356            {
     2357                flowStack.push_back({ entry.blockIndex+1, 0, false });
     2358                entry.nextIndex++;
     2359            }
     2360            else // back
     2361            {
     2362                std::unordered_set<AsmSingleVReg> prevChangedVars;
     2363                if (cblock.haveReturn)
     2364                {
     2365                    entry.haveReturn = true;
     2366                    haveReturnBlocks[entry.blockIndex] = true;
     2367                    prevChangedVars = entry.changedVars;
     2368                }
     2369                const bool prevHaveReturn = entry.haveReturn;
     2370               
     2371                flowStack.pop_back();
     2372                // set up haveReturn
     2373                if (!flowStack.empty())
     2374                {
     2375                    FlowStackEntry4& prevEntry = flowStack.back();
     2376                    const bool haveReturn = (prevEntry.haveReturn |= prevHaveReturn);
     2377                    haveReturnBlocks[prevEntry.blockIndex] = haveReturn;
     2378                    if (haveReturn)
     2379                        prevEntry.changedVars.insert(prevChangedVars.begin(),
     2380                                    prevChangedVars.end());
     2381                    else
     2382                        // if no return in preb block
     2383                        prevEntry.changedVars.clear();
     2384                }
     2385                else if (prevHaveReturn)
     2386                    // put to changed reg vars
     2387                    changedRegVars.second.insert(
     2388                            prevChangedVars.begin(), prevChangedVars.end());
     2389            }
     2390        }
     2391    }
     2392    }
     2393   
    23012394    callStack.clear();
    23022395    callBlocks.clear();
Note: See TracChangeset for help on using the changeset viewer.