Changeset 3612 in CLRX


Ignore:
Timestamp:
Jan 11, 2018, 9:57:21 PM (7 days ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Do not add all blocks to routineMap. initialize replacedSSAIdMap while adding new routine ssaIds.
Add new testcase with routine with two branches.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3611 r3612  
    742742    std::unordered_map<size_t, RoutineData> routineMap;
    743743    // initialize routineMap
    744     for (const CodeBlock& cblock: codeBlocks)
     744    /*for (const CodeBlock& cblock: codeBlocks)
    745745        for (const NextBlock& next: cblock.nexts)
    746746            // all forks and calls
    747             routineMap[next.block].processed = false;
     747            routineMap[next.block].processed = false;*/
    748748   
    749749    LastSSAIdMap lastMultiSSAIdMap; // current SSA id from visited calls
     
    799799                if (rit != routineMap.end() && !rit->second.processed)
    800800                    selectedRoutines.insert(entry.blockIndex);
     801               
    801802                // add routine regvar map
    802803                for (const auto& ssaEntry: cblock.ssaInfoMap)
     
    810811                        if (lmsit != lastMultiSSAIdMap.end())
    811812                        {
     813                            /*std::cout << "lmsit:";
     814                            for (size_t r: lmsit->second)
     815                                std::cout << " " << r;
     816                            std::cout << std::endl;*/
    812817                            // update last SSAId inside previously called routines
    813818                            for (size_t routine: selectedRoutines)
     
    825830                                        ssas.erase(ssaIt);
    826831                                    // add new
     832                                    /*std::cout <<
     833                                        "addsass: " << sinfo.ssaIdLast << std::endl;*/
    827834                                    ssas.push_back(sinfo.ssaIdLast);
    828835                                }
     
    840847                                auto ssaIt = std::find(ssas.begin(), ssas.end(),
    841848                                            sinfo.ssaId-1);
     849                                entry.replacedMultiSSAIds.insert({ssaEntry.first, ssas});
    842850                                if (ssaIt != ssas.end()) // update this point
     851                                {
     852                                    /*std::cout <<
     853                                        "chsass2: " << sinfo.ssaIdLast << std::endl;*/
    843854                                    *ssaIt = sinfo.ssaIdLast;
     855                                }
    844856                                else if (std::find(ssas.begin(), ssas.end(),
    845857                                        sinfo.ssaIdLast) == ssas.end())
     858                                {
     859                                    /*std::cout <<
     860                                        "addsass2: " << sinfo.ssaIdLast << std::endl;*/
    846861                                    // otherwise add new way
    847862                                    ssas.push_back(sinfo.ssaIdLast);
     863                                }
    848864                            }
    849865                    }
     
    893909                //std::cout << " call: " << entry.blockIndex << std::endl;
    894910                callStack.push({ entry.blockIndex, entry.nextIndex });
     911                routineMap.insert({ cblock.nexts[entry.nextIndex].block, { false } });
    895912            }
    896913           
     
    923940                //remove all return parallel ssaids
    924941                for(const NextBlock& next: cblock.nexts)
    925                     if (!next.isCall)
     942                    if (next.isCall)
    926943                    {
    927944                        auto it = routineMap.find(next.block); // must find
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3611 r3612  
    19891989        {
    19901990            { 0, 32,
    1991                 { {1, false }, { 2, true } },
     1991                { { 1, false }, { 2, true } },
    19921992                {
    19931993                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     
    20192019            { { "sa", 2 }, { { 3, 1 } } },
    20202020            { { "sa", 3 }, { { 3, 1 } } }
     2021        },
     2022        true, ""
     2023    },
     2024    {   // 14 - simple call, more complex routine
     2025        R"ffDXD(.regvar sa:s:8, va:v:8
     2026        s_mov_b32 sa[2], s4
     2027        s_mov_b32 sa[3], s5
     2028       
     2029        s_getpc_b64 s[2:3]
     2030        s_add_u32 s2, s2, routine-.
     2031        s_add_u32 s3, s3, routine-.+4
     2032        .cf_call routine
     2033        s_swappc_b64 s[0:1], s[2:3]
     2034       
     2035        s_lshl_b32 sa[2], sa[2], 3
     2036        s_lshl_b32 sa[3], sa[3], 4
     2037        s_endpgm
     2038       
     2039routine:
     2040        s_xor_b32 sa[2], sa[2], sa[4]
     2041        s_xor_b32 sa[3], sa[3], sa[4]
     2042        s_cbranch_scc1 bb1
     2043       
     2044        s_min_u32 sa[2], sa[2], sa[4]
     2045        s_min_u32 sa[3], sa[3], sa[4]
     2046        .cf_ret
     2047        s_setpc_b64 s[0:1]
     2048       
     2049bb1:    s_and_b32 sa[2], sa[2], sa[4]
     2050        s_and_b32 sa[3], sa[3], sa[4]
     2051        .cf_ret
     2052        s_setpc_b64 s[0:1]
     2053)ffDXD",
     2054        {
     2055            { 0, 32,
     2056                { {1, false }, { 2, true } },
     2057                {
     2058                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2059                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2060                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2061                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2062                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2063                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2064                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2065                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2066                }, true, false, false },
     2067            // block 1 - after call
     2068            { 32, 44,
     2069                { },
     2070                {
     2071                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2072                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) }
     2073                }, false, false, true },
     2074            // block 2 - routine
     2075            { 44, 56,
     2076                { { 3, false }, { 4, false } },
     2077                {
     2078                    { { "sa", 2 }, SSAInfo(1, 3, 3, 3, 1, true) },
     2079                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) },
     2080                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2081                }, false, false, false },
     2082            // block 3 - first return
     2083            { 56, 68,
     2084                { },
     2085                {
     2086                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2087                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2088                    { { "sa", 2 }, SSAInfo(3, 4, 4, 4, 1, true) },
     2089                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
     2090                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2091                }, false, true, true },
     2092            // block 4 - second return
     2093            { 68, 80,
     2094                { },
     2095                {
     2096                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2097                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2098                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
     2099                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) },
     2100                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2101                }, false, true, true }
     2102        },
     2103        {
     2104            { { "sa", 2 }, { { 4, 1 }, { 5, 1 } } },
     2105            { { "sa", 3 }, { { 4, 1 }, { 5, 1 } } }
    20212106        },
    20222107        true, ""
Note: See TracChangeset for help on using the changeset viewer.