Changeset 3902 in CLRX


Ignore:
Timestamp:
Mar 15, 2018, 8:17:32 PM (9 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixing controlling flowStackBlocks (keep state after popping from already block in flowStack).
Get use prevFlowBlocks as current (keep state of flow blocks in stack).

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3901 r3902  
    14261426    std::deque<FlowStackEntry> flowStack;
    14271427    std::vector<bool> flowStackBlocks(codeBlocks.size(), false);
     1428    if (!prevFlowStackBlocks.empty())
     1429        flowStackBlocks = prevFlowStackBlocks;
    14281430    // last SSA ids map from returns
    14291431    RetSSAIdMap retSSAIdMap;
     
    14421444            if (!prevFlowStackBlocks.empty() && prevFlowStackBlocks[entry.blockIndex])
    14431445            {
    1444                 flowStackBlocks[entry.blockIndex] = false;
    14451446                flowStack.pop_back();
    14461447                continue;
     
    14681469                    RoutineData subrData;
    14691470                    std::cout << "-- subrcache2 for " << entry.blockIndex << std::endl;
    1470                     flowStackBlocks[entry.blockIndex] = false;
     1471                    const bool oldFB = flowStackBlocks[entry.blockIndex];
     1472                    flowStackBlocks[entry.blockIndex] = !oldFB;
    14711473                    createRoutineData(codeBlocks, curSSAIdMap, loopBlocks, subroutToCache,
    14721474                        subroutinesCache, routineMap, subrData, entry.blockIndex, true,
    14731475                        flowStackBlocks);
    1474                     flowStackBlocks[entry.blockIndex] = true;
     1476                    flowStackBlocks[entry.blockIndex] = oldFB;
    14751477                    if (loopBlocks.find(entry.blockIndex) != loopBlocks.end())
    14761478                    {   // leave from loop point
     
    14981500                joinLastSSAIdMap(rdata.lastSSAIdMap, rdata.curSSAIdMap, *cachedRdata);
    14991501                std::cout << "procretend2" << std::endl;
    1500                 flowStackBlocks[entry.blockIndex] = false;
     1502                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
    15011503                flowStack.pop_back();
    15021504                continue;
     
    15321534                                { rdata.curSSAIdMap, false } });
    15331535               
    1534                 flowStackBlocks[entry.blockIndex] = false;
     1536                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
    15351537                flowStack.pop_back();
    15361538                continue;
     
    15381540            else
    15391541            {
    1540                 flowStackBlocks[entry.blockIndex] = false;
     1542                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
    15411543                flowStack.pop_back();
    15421544                continue;
     
    15521554        if (entry.nextIndex < cblock.nexts.size())
    15531555        {
    1554             flowStack.push_back({ cblock.nexts[entry.nextIndex].block, 0 });
    1555             flowStackBlocks[cblock.nexts[entry.nextIndex].block] = true;
     1556            const size_t nextBlock = cblock.nexts[entry.nextIndex].block;
     1557            flowStack.push_back({ nextBlock, 0 });
     1558            // negate - if true (already in flowstack, then popping keep this state)
     1559            flowStackBlocks[nextBlock] = !flowStackBlocks[nextBlock];
    15561560            entry.nextIndex++;
    15571561        }
     
    15731577                    }
    15741578            }
    1575             flowStack.push_back({ entry.blockIndex+1, 0 });
    1576             flowStackBlocks[entry.blockIndex+1] = true;
     1579            const size_t nextBlock = entry.blockIndex+1;
     1580            flowStack.push_back({ nextBlock, 0 });
     1581            // negate - if true (already in flowstack, then popping keep this state)
     1582            flowStackBlocks[nextBlock] = !flowStackBlocks[nextBlock];
    15771583            entry.nextIndex++;
    15781584        }
    15791585        else
    15801586        {
     1587            std::cout << "popstart: " << entry.blockIndex << std::endl;
    15811588            if (cblock.haveReturn)
    15821589            {
     
    16481655           
    16491656            flowStackBlocks[entry.blockIndex] = false;
     1657            std::cout << "pop: " << entry.blockIndex << std::endl;
    16501658            flowStack.pop_back();
    16511659        }
     
    18281836                            cblocksToCache.count(entry.blockIndex) << std::endl;
    18291837                // back, already visited
    1830                 flowStackBlocks[entry.blockIndex] = false;
     1838                flowStackBlocks[entry.blockIndex] = !flowStackBlocks[entry.blockIndex];
    18311839                flowStack.pop_back();
    18321840               
     
    18841892            flowStack.push_back({ nextBlock, 0, isCall });
    18851893            if (flowStackBlocks[nextBlock])
     1894            {
    18861895                loopBlocks.insert(nextBlock);
    1887             flowStackBlocks[nextBlock] = true;
     1896                flowStackBlocks[nextBlock] = false; // keep to inserted in popping
     1897            }
     1898            else
     1899                flowStackBlocks[nextBlock] = true;
    18881900            entry.nextIndex++;
    18891901        }
     
    19071919            flowStack.push_back({ entry.blockIndex+1, 0, false });
    19081920            if (flowStackBlocks[entry.blockIndex+1])
     1921            {
    19091922                loopBlocks.insert(entry.blockIndex+1);
    1910             flowStackBlocks[entry.blockIndex+1] = true;
     1923                 // keep to inserted in popping
     1924                flowStackBlocks[entry.blockIndex+1] = false;
     1925            }
     1926            else
     1927                flowStackBlocks[entry.blockIndex+1] = true;
    19111928            entry.nextIndex++;
    19121929        }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAllocCase2.cpp

    r3901 r3902  
    25242524            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 5, 1 }, { 6, 1 }, { 4, 1 } } },
    25252525            { { "sa", 5 }, { { 3, 2 }, { 5, 2 }, { 6, 2 }, { 3, 1 }, { 4, 1 } } },
    2526             { { "sa", 6 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 3, 1 } } },
     2526            //{ { "sa", 6 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 3, 1 } } },
     2527            { { "sa", 6 }, { { 4, 1 }, { 5, 1 }, { 2, 1 }, { 3, 1 } } },
     2528            { { "sa", 7 }, { { 3, 1 }, { 4, 1 }, { 2, 1 } } }
     2529        },
     2530        true, ""
     2531    },
     2532    {   // 15 - routine with double complex loop used four times
     2533        R"ffDXD(.regvar sa:s:10, va:v:8
     2534        s_mov_b32 sa[2], s4
     2535        s_mov_b32 sa[3], s5
     2536        s_mov_b32 sa[4], s6
     2537        s_mov_b32 sa[5], s7
     2538        s_mov_b32 sa[6], s8
     2539        s_mov_b32 sa[7], s8
     2540        .cf_call routine
     2541        s_swappc_b64 s[0:1], s[2:3]
     2542       
     2543        s_xor_b32 sa[2], sa[2], sa[0]
     2544        s_xor_b32 sa[3], sa[3], sa[0]
     2545        s_xor_b32 sa[4], sa[4], sa[1]
     2546        s_xor_b32 sa[5], sa[5], sa[1]
     2547        s_xor_b32 sa[6], sa[6], sa[0]
     2548        s_xor_b32 sa[7], sa[7], sa[0]
     2549        s_endpgm
     2550       
     2551routine:
     2552        s_nop 7
     2553loop0:
     2554        s_xor_b32 sa[2], sa[2], sa[0]
     2555        s_xor_b32 sa[3], sa[3], sa[0]
     2556        s_xor_b32 sa[5], sa[5], sa[0]
     2557        s_cbranch_vccz  subr1
     2558       
     2559loop1:  s_xor_b32 sa[2], sa[2], sa[0]
     2560        s_cbranch_scc0 end1
     2561       
     2562        s_xor_b32 sa[3], sa[3], sa[0]
     2563        s_cbranch_scc0 end2
     2564       
     2565        s_xor_b32 sa[4], sa[4], sa[1]
     2566        s_cbranch_scc0 end3
     2567       
     2568        s_xor_b32 sa[5], sa[5], sa[1]
     2569        s_cbranch_vccnz loop1
     2570       
     2571        s_xor_b32 sa[6], sa[6], sa[1]
     2572        s_branch loop0
     2573       
     2574end1:   s_xor_b32 sa[2], sa[2], sa[0]
     2575        .cf_ret
     2576        s_setpc_b64 s[0:1]
     2577       
     2578end2:   s_xor_b32 sa[3], sa[3], sa[0]
     2579        .cf_ret
     2580        s_setpc_b64 s[0:1]
     2581       
     2582end3:   s_xor_b32 sa[4], sa[4], sa[0]
     2583        .cf_ret
     2584        s_setpc_b64 s[0:1]
     2585       
     2586subr1:
     2587        s_xor_b32 sa[2], sa[2], sa[0]
     2588        s_xor_b32 sa[3], sa[3], sa[0]
     2589        s_xor_b32 sa[4], sa[4], sa[0]
     2590        s_xor_b32 sa[5], sa[5], sa[1]
     2591        s_xor_b32 sa[6], sa[6], sa[0]
     2592        s_xor_b32 sa[7], sa[7], sa[0]
     2593        s_cbranch_execnz loop0
     2594       
     2595subr2:
     2596        s_xor_b32 sa[2], sa[2], sa[0]
     2597        s_xor_b32 sa[3], sa[3], sa[0]
     2598        s_xor_b32 sa[4], sa[4], sa[1]
     2599        s_xor_b32 sa[5], sa[5], sa[1]
     2600        s_xor_b32 sa[6], sa[6], sa[0]
     2601        s_xor_b32 sa[7], sa[7], sa[0]
     2602        s_cbranch_execnz loop1
     2603       
     2604subr3:
     2605        s_xor_b32 sa[2], sa[2], sa[0]
     2606        s_xor_b32 sa[3], sa[3], sa[0]
     2607        s_xor_b32 sa[4], sa[4], sa[1]
     2608        s_xor_b32 sa[5], sa[5], sa[1]
     2609        s_xor_b32 sa[6], sa[6], sa[0]
     2610        s_xor_b32 sa[7], sa[7], sa[0]
     2611        .cf_ret
     2612        s_setpc_b64 s[0:1]
     2613)ffDXD",
     2614        {
     2615            {   // block 0 - start
     2616                0, 28,
     2617                { { 2, true } },
     2618                {
     2619                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2620                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2621                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2622                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2623                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2624                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2625                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2626                    { { "", 7 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2627                    { { "", 8 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2628                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2629                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2630                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2631                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2632                    { { "sa", 6 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2633                    { { "sa", 7 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2634                }, true, false, false },
     2635            {   // block 1 - end
     2636                28, 56,
     2637                { },
     2638                {
     2639                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2640                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2641                    { { "sa", 2 }, SSAInfo(3, 8, 8, 8, 1, true) },
     2642                    { { "sa", 3 }, SSAInfo(2, 8, 8, 8, 1, true) },
     2643                    { { "sa", 4 }, SSAInfo(1, 7, 7, 7, 1, true) },
     2644                    { { "sa", 5 }, SSAInfo(2, 7, 7, 7, 1, true) },
     2645                    { { "sa", 6 }, SSAInfo(1, 6, 6, 6, 1, true) },
     2646                    { { "sa", 7 }, SSAInfo(1, 5, 5, 5, 1, true) }
     2647                }, false, false, true },
     2648            {   // block 2 - s_nop
     2649                56, 60,
     2650                { },
     2651                { }, false, false, false },
     2652            {   // block 3 - routine/loop0
     2653                60, 76,
     2654                { { 4, false }, { 12, false } },
     2655                {
     2656                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2657                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2658                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2659                    { { "sa", 5 }, SSAInfo(1, 2, 2, 2, 1, true) }
     2660                }, false, false, false },
     2661            {   // block 4 - routine loop1
     2662                76, 84,
     2663                { { 5, false }, { 9, false } },
     2664                {
     2665                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2666                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) }
     2667                }, false, false, false },
     2668            {   // block 5 - to end2
     2669                84, 92,
     2670                { { 6, false }, { 10, false } },
     2671                {
     2672                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2673                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
     2674                }, false, false, false },
     2675            {   // block 6 - to end3
     2676                92, 100,
     2677                { { 7, false }, { 11, false } },
     2678                {
     2679                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2680                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) }
     2681                }, false, false, false },
     2682            {   // block 7 - loop1 end
     2683                100, 108,
     2684                { { 4, false }, { 8, false } },
     2685                {
     2686                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2687                    { { "sa", 5 }, SSAInfo(2, 3, 3, 3, 1, true) }
     2688                }, false, false, false },
     2689            {   // block 8 - loop0 end
     2690                108, 116,
     2691                { { 3, false } },
     2692                {
     2693                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2694                    { { "sa", 6 }, SSAInfo(1, 2, 2, 2, 1, true) }
     2695                }, false, false, true },
     2696            {   // block 9 - end1
     2697                116, 124,
     2698                { },
     2699                {
     2700                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2701                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2702                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2703                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) }
     2704                }, false, true, true },
     2705            {   // block 10 - end2
     2706                124, 132,
     2707                { },
     2708                {
     2709                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2710                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2711                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2712                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) }
     2713                }, false, true, true },
     2714            {   // block 11 - end3
     2715                132, 140,
     2716                { },
     2717                {
     2718                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2719                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2720                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2721                    { { "sa", 4 }, SSAInfo(2, 3, 3, 3, 1, true) }
     2722                }, false, true, true },
     2723            {   // block 12 - subr1
     2724                140, 168,
     2725                { { 3, false }, { 13, false } },
     2726                {
     2727                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2728                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2729                    { { "sa", 2 }, SSAInfo(2, 5, 5, 5, 1, true) },
     2730                    { { "sa", 3 }, SSAInfo(2, 5, 5, 5, 1, true) },
     2731                    { { "sa", 4 }, SSAInfo(1, 4, 4, 4, 1, true) },
     2732                    { { "sa", 5 }, SSAInfo(2, 4, 4, 4, 1, true) },
     2733                    { { "sa", 6 }, SSAInfo(1, 3, 3, 3, 1, true) },
     2734                    { { "sa", 7 }, SSAInfo(1, 2, 2, 2, 1, true) }
     2735                }, false, false, false },
     2736            {   // block 13 - subr2
     2737                168, 196,
     2738                { { 4, false }, { 14, false } },
     2739                {
     2740                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2741                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2742                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
     2743                    { { "sa", 3 }, SSAInfo(5, 6, 6, 6, 1, true) },
     2744                    { { "sa", 4 }, SSAInfo(4, 5, 5, 5, 1, true) },
     2745                    { { "sa", 5 }, SSAInfo(4, 5, 5, 5, 1, true) },
     2746                    { { "sa", 6 }, SSAInfo(3, 4, 4, 4, 1, true) },
     2747                    { { "sa", 7 }, SSAInfo(2, 3, 3, 3, 1, true) }
     2748                }, false, false, false },
     2749            {   // block 13 - subr3
     2750                196, 224,
     2751                { },
     2752                {
     2753                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2754                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2755                    { { "sa", 0 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2756                    { { "sa", 1 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) },
     2757                    { { "sa", 2 }, SSAInfo(6, 7, 7, 7, 1, true) },
     2758                    { { "sa", 3 }, SSAInfo(6, 7, 7, 7, 1, true) },
     2759                    { { "sa", 4 }, SSAInfo(5, 6, 6, 6, 1, true) },
     2760                    { { "sa", 5 }, SSAInfo(5, 6, 6, 6, 1, true) },
     2761                    { { "sa", 6 }, SSAInfo(4, 5, 5, 5, 1, true) },
     2762                    { { "sa", 7 }, SSAInfo(3, 4, 4, 4, 1, true) }
     2763                }, false, true, true }
     2764        },
     2765        {   // SSA replaces
     2766            { { "sa", 2 }, { { 4, 3 }, { 7, 3 }, { 3, 2 }, { 3, 1 }, { 5, 1 }, { 6, 2 } } },
     2767            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 6, 2 }, { 7, 2 }, { 3, 1 }, { 5, 1 } } },
     2768            //{ { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 5, 1 }, { 6, 1 }, { 4, 1 } } },
     2769            { { "sa", 4 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 }, { 6, 1 } } },
     2770            { { "sa", 5 }, { { 3, 2 }, { 5, 2 }, { 6, 2 }, { 3, 1 }, { 4, 1 } } },
     2771            //{ { "sa", 6 }, { { 2, 1 }, { 4, 1 }, { 5, 1 }, { 3, 1 } } },
     2772            { { "sa", 6 }, { { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 } } },
    25272773            { { "sa", 7 }, { { 3, 1 }, { 4, 1 }, { 2, 1 } } }
    25282774        },
Note: See TracChangeset for help on using the changeset viewer.