Changeset 3981 in CLRX


Ignore:
Timestamp:
Apr 10, 2018, 1:46:41 PM (3 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed handling loop ends while collecting a changed regvars in a recursion.

File:
1 edited

Legend:

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

    r3980 r3981  
    20842084            }
    20852085           
    2086             const bool prevHaveReturn = entry.haveReturn;
     2086            const bool curHaveReturn = entry.haveReturn;
    20872087           
    20882088            // revert retSSAIdMap
     
    21372137            if (!flowStack.empty())
    21382138            {
    2139                 flowStack.back().haveReturn |= prevHaveReturn;
     2139                flowStack.back().haveReturn |= curHaveReturn;
    21402140                haveReturnBlocks[flowStack.back().blockIndex] =
    21412141                        flowStack.back().haveReturn;
     
    22942294                    // if already called (then it is recursion)
    22952295                    std::cout << "finding recursions: " << nextBlock << std::endl;
     2296                    // uncomment after tests
    22962297                    recurChangedVarMap.insert({ nextBlock.index, { } });
    22972298                    entry.nextIndex++;
    22982299                    continue;
    22992300                }
     2301                // comment after tests
     2302                //recurChangedVarMap.insert({ nextBlock.index, { } });
    23002303                callStack.push_back({ entry.blockIndex, entry.nextIndex, nextBlock });
    23012304                std::cout << "finding recur: call: " << nextBlock << std::endl;
     
    23212324    for (auto& changedRegVars: recurChangedVarMap)
    23222325    {
     2326        std::cout << " -- ChangedVars for " << changedRegVars.first << std::endl;
    23232327        std::fill(visited.begin(), visited.end(), false);
     2328        std::fill(flowStackBlocks.begin(), flowStackBlocks.end(), false);
    23242329        flowStack.clear();
    23252330        flowStack.push_back({ changedRegVars.first, 0 });
     2331        flowStackBlocks[changedRegVars.first] = true;
     2332        loopBlocks.clear();
     2333       
     2334        std::unordered_map<BlockIndex, std::unordered_set<AsmSingleVReg> > chLoopEnds;
    23262335       
    23272336        while (!flowStack.empty())
     
    23402349                            entry.changedVars.insert(ssaEntry.first);
    23412350                }
     2351                else if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
     2352                {
     2353                    std::cout << "   collect regvars: add loop end: " <<
     2354                            entry.blockIndex << std::endl;
     2355                    // add loop end
     2356                    std::unordered_set<AsmSingleVReg>& chloopEnd =
     2357                            chLoopEnds[entry.blockIndex];
     2358                    size_t i;
     2359                    for (i = flowStack.size()-1; i > 0 && !flowStack[i-1].haveReturn; ++i)
     2360                    {
     2361                        const FlowStackEntry4& entryx = flowStack[i-1];
     2362                        chloopEnd.insert(entryx.changedVars.begin(),
     2363                                entryx.changedVars.end());
     2364                        if (entryx.blockIndex == entry.blockIndex)
     2365                            // if loop block
     2366                            break;
     2367                    }
     2368                   
     2369                    flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
     2370                    flowStack.pop_back();
     2371                    continue;
     2372                }
    23422373                else
    23432374                {
    2344                     // TODO: fix handling loops (fix haveReturn leaks)
    23452375                    const bool prevHaveReturn = haveReturnBlocks[entry.blockIndex];
     2376                    const bool isCall = entry.isCall;
     2377                    flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
    23462378                    flowStack.pop_back();
    23472379                    // set up haveReturn
    23482380                    FlowStackEntry4& prevEntry = flowStack.back();
    2349                     const bool haveReturn = (prevEntry.haveReturn |= prevHaveReturn);
    2350                     haveReturnBlocks[prevEntry.blockIndex] = haveReturn;
     2381                    if (!isCall)
     2382                        // propagate haveReturn only for jumps (no for calls)
     2383                        prevEntry.haveReturn |= prevHaveReturn;
     2384                    haveReturnBlocks[prevEntry.blockIndex] = prevEntry.haveReturn;
    23512385                    continue;
    23522386                }
     
    23582392                BlockIndex nextBlock = cblock.nexts[entry.nextIndex].block;
    23592393                flowStack.push_back({ nextBlock, 0, isCall });
     2394                if (flowStackBlocks[nextBlock])
     2395                {
     2396                    if (!cblock.nexts[entry.nextIndex].isCall)
     2397                    {
     2398                        std::cout << "   collect regvars: " << entry.blockIndex <<
     2399                            ": loop detected 2" << std::endl;
     2400                        loopBlocks.insert(nextBlock);
     2401                    }
     2402                    flowStackBlocks[nextBlock] = false; // keep to inserted in popping
     2403                }
     2404                else
     2405                    flowStackBlocks[nextBlock] = true;
    23602406                entry.nextIndex++;
    23612407            }
     
    23662412            {
    23672413                flowStack.push_back({ entry.blockIndex+1, 0, false });
     2414                if (flowStackBlocks[entry.blockIndex+1])
     2415                {
     2416                    std::cout << "   collect regvars: " << entry.blockIndex <<
     2417                            ": loop detected" << std::endl;
     2418                    loopBlocks.insert(entry.blockIndex+1);
     2419                    // keep to inserted in popping
     2420                    flowStackBlocks[entry.blockIndex+1] = false;
     2421                }
     2422                else
     2423                    flowStackBlocks[entry.blockIndex+1] = true;
    23682424                entry.nextIndex++;
    23692425            }
     
    23712427            {
    23722428                std::unordered_set<AsmSingleVReg> prevChangedVars;
     2429                const bool isCall = entry.isCall;
    23732430                if (cblock.haveReturn)
    23742431                {
     
    23772434                    prevChangedVars = entry.changedVars;
    23782435                }
    2379                 const bool prevHaveReturn = entry.haveReturn;
    2380                 std::cout << "collect regvars: " << entry.blockIndex << ": " <<
    2381                         int(prevHaveReturn) << std::endl;
     2436                const bool curHaveReturn = entry.haveReturn;
     2437                std::cout << "   collect regvars: " << entry.blockIndex << ": " <<
     2438                        int(curHaveReturn) << std::endl;
     2439               
     2440                if (loopBlocks.find(entry.blockIndex) != loopBlocks.end() &&
     2441                    curHaveReturn)
     2442                {
     2443                    auto it = chLoopEnds.find(entry.blockIndex);
     2444                    if (it != chLoopEnds.end())
     2445                    {
     2446                        std::cout << "   collect regvars: add loop ends: " <<
     2447                                entry.blockIndex << std::endl;
     2448                        // add loop ends returns
     2449                        prevChangedVars.insert(it->second.begin(), it->second.end());
     2450                        chLoopEnds.erase(it); // delete it
     2451                    }
     2452                    loopBlocks.erase(entry.blockIndex);
     2453                }
    23822454               
    23832455                flowStack.pop_back();
     2456                flowStackBlocks[entry.blockIndex] = false;
     2457               
    23842458                // set up haveReturn
    23852459                if (!flowStack.empty())
    23862460                {
    23872461                    FlowStackEntry4& prevEntry = flowStack.back();
    2388                     const bool haveReturn = (prevEntry.haveReturn |= prevHaveReturn);
    2389                     haveReturnBlocks[prevEntry.blockIndex] = haveReturn;
    2390                     if (prevHaveReturn)
     2462                    if (!isCall)
     2463                        // propagate haveReturn only for jumps (no for calls)
     2464                        // because, call do not add returns
     2465                        prevEntry.haveReturn |= curHaveReturn;
     2466                    haveReturnBlocks[prevEntry.blockIndex] = prevEntry.haveReturn;
     2467                    if (curHaveReturn)
    23912468                        prevEntry.changedVars.insert(prevChangedVars.begin(),
    23922469                                    prevChangedVars.end());
    23932470                }
    2394                 else if (prevHaveReturn)
     2471                else if (curHaveReturn)
    23952472                    // put to changed reg vars
    23962473                    changedRegVars.second.insert(
     
    23982475            }
    23992476        }
    2400     }
    2401     }
    2402    
     2477        std::cout << " -- ChangedVars end for " << changedRegVars.first << std::endl;
     2478    }
     2479    }
     2480   
     2481    loopBlocks.clear();
     2482    std::fill(flowStackBlocks.begin(), flowStackBlocks.end(), false);
    24032483    callStack.clear();
    24042484    callBlocks.clear();
    24052485    flowStack.clear();
    24062486    flowStack.push_back({ 0, 0 });
     2487    flowStackBlocks[0] = true;
    24072488    std::fill(visited.begin(), visited.end(), false);
    24082489   
Note: See TracChangeset for help on using the changeset viewer.