Changeset 3622 in CLRX


Ignore:
Timestamp:
Jan 16, 2018, 9:09:18 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Mark that parent SSAIdEntry have children and use this information to remove obsolete ssaIds from routineMap
while traversing by a code flow (remove only if ssaIdEntry have children). Add new testcases.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3620 r3622  
    444444// map of last SSAId for routine, key - varid, value - last SSA ids
    445445typedef std::unordered_map<AsmSingleVReg, std::vector<size_t> > LastSSAIdMap;
     446
     447typedef std::unordered_map<AsmSingleVReg, std::vector<bool> > LastOccurMap;
    446448
    447449struct RoutineData
     
    871873    std::unordered_map<size_t, RoutineData> routineMap;
    872874   
     875    LastOccurMap lastOccurMap;
     876   
    873877    std::vector<bool> visited(codeBlocks.size(), false);
    874878    flowStack.push_back({ 0, 0 });
     
    895899                        continue; // no change for registers
    896900                    }
     901                   
     902                    if (sinfo.ssaIdChange != 0)
     903                        lastOccurMap[ssaEntry.first].push_back(false);
    897904                   
    898905                    size_t& ssaId = curSSAIdMap[ssaEntry.first];
     
    11171124                {
    11181125                    std::vector<size_t>& ssaIds = rdata->lastSSAIdMap[ssaEntry.first];
    1119                     if (!cblock.nexts.empty() || (!cblock.haveEnd && !cblock.haveReturn))
     1126                    if (ssaEntry.second.ssaIdChange != 0 &&
     1127                        lastOccurMap[ssaEntry.first].back())
    11201128                    {   // if cblock with some children
    11211129                        auto nit = std::find(ssaIds.begin(), ssaIds.end(), nextSSAId-1);
    1122                         if (nit != ssaIds.end())
     1130                        if (nit != ssaIds.end() && nextSSAId != curSSAId)
     1131                        {
     1132                            /*std::cout << "erase in blk2: " << ssaEntry.first.regVar <<
     1133                                    ":" << ssaEntry.first.index << ": " <<
     1134                                        entry.blockIndex << "=" << *nit << std::endl;*/
    11231135                            ssaIds.erase(nit);  // just remove
     1136                        }
    11241137                    }
    11251138                    // push previous SSAId to lastSSAIdMap (later will be replaced)
     
    11301143                    {   // just erase if end of traverse in routine
    11311144                        if (fit != ssaIds.end())
     1145                        {
     1146                            /*std::cout << "erase in blk: " << ssaEntry.first.regVar <<
     1147                                    ":" << ssaEntry.first.index << ": " <<
     1148                                    entry.blockIndex << "=" << *fit << std::endl;*/
    11321149                            ssaIds.erase(fit);
     1150                        }
    11331151                    }
    11341152                    else
    11351153                        if (fit == ssaIds.end())
    11361154                            ssaIds.push_back(curSSAId-1);
     1155                }
     1156               
     1157                if (ssaEntry.second.ssaIdChange != 0)
     1158                {
     1159                    std::vector<bool>& lastOccur = lastOccurMap[ssaEntry.first];
     1160                    // erase indicator for last SSAEntry
     1161                    lastOccur.pop_back();
     1162                    if (!lastOccur.empty())
     1163                        // mark that parent have children
     1164                        lastOccur.back() = true;
    11371165                }
    11381166            }
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3621 r3622  
    22432243            { { "sa", 2 }, { { 4, 3 } } },
    22442244            { { "sa", 3 }, { { 4, 3 } } }
     2245        },
     2246        true, ""
     2247    },
     2248    {   // 17 - simple call, more complex routine
     2249        R"ffDXD(.regvar sa:s:8, va:v:8
     2250        s_mov_b32 sa[2], s4
     2251        s_mov_b32 sa[3], s5
     2252       
     2253        s_getpc_b64 s[2:3]
     2254        s_add_u32 s2, s2, routine-.
     2255        s_add_u32 s3, s3, routine-.+4
     2256        .cf_call routine
     2257        s_swappc_b64 s[0:1], s[2:3]
     2258       
     2259        s_lshl_b32 sa[2], sa[2], 3
     2260        s_lshl_b32 sa[3], sa[3], 4
     2261        s_endpgm
     2262       
     2263routine:
     2264        s_xor_b32 sa[2], sa[2], sa[4]
     2265        s_cbranch_scc1 bb1
     2266       
     2267        s_min_u32 sa[2], sa[2], sa[4]
     2268        s_xor_b32 sa[3], sa[3], sa[4]
     2269        .cf_ret
     2270        s_setpc_b64 s[0:1]
     2271       
     2272bb1:    s_and_b32 sa[2], sa[2], sa[4]
     2273        .cf_ret
     2274        s_setpc_b64 s[0:1]
     2275)ffDXD",
     2276        {
     2277            { 0, 32,
     2278                { { 2, true } },
     2279                {
     2280                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2281                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2282                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2283                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2284                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2285                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2286                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2287                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2288                }, true, false, false },
     2289            // block 1 - after call
     2290            { 32, 44,
     2291                { },
     2292                {
     2293                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
     2294                    { { "sa", 3 }, SSAInfo(1, 3, 3, 3, 1, true) }
     2295                }, false, false, true },
     2296            // block 2 - routine
     2297            { 44, 52,
     2298                { { 3, false }, { 4, false } },
     2299                {
     2300                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2301                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2302                }, false, false, false },
     2303            // block 3 - first return
     2304            { 52, 64,
     2305                { },
     2306                {
     2307                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2308                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2309                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2310                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2311                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2312                }, false, true, true },
     2313            // block 4 - second return
     2314            { 64, 72,
     2315                { },
     2316                {
     2317                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2318                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2319                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
     2320                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2321                }, false, true, true }
     2322        },
     2323        {   // SSA replaces
     2324            { { "sa", 2 }, { { 4, 3 } } },
     2325            { { "sa", 3 }, { { 2, 1 } } }
     2326        },
     2327        true, ""
     2328    },
     2329    {   // 18 - simple call, more complex routine
     2330        R"ffDXD(.regvar sa:s:8, va:v:8
     2331        s_mov_b32 sa[2], s4
     2332        s_mov_b32 sa[3], s5
     2333       
     2334        s_getpc_b64 s[2:3]
     2335        s_add_u32 s2, s2, routine-.
     2336        s_add_u32 s3, s3, routine-.+4
     2337        .cf_call routine
     2338        s_swappc_b64 s[0:1], s[2:3]
     2339       
     2340        s_lshl_b32 sa[2], sa[2], 3
     2341        s_lshl_b32 sa[3], sa[3], 4
     2342        s_endpgm
     2343       
     2344routine:
     2345        s_xor_b32 sa[2], sa[2], sa[4]
     2346        s_xor_b32 sa[3], sa[3], sa[4]
     2347        s_cbranch_scc1 bb1
     2348       
     2349        s_min_u32 sa[2], sa[2], sa[4]
     2350        .cf_ret
     2351        s_setpc_b64 s[0:1]
     2352       
     2353bb1:    s_and_b32 sa[2], sa[2], sa[4]
     2354        .cf_ret
     2355        s_setpc_b64 s[0:1]
     2356)ffDXD",
     2357        {
     2358            { 0, 32,
     2359                { { 2, true } },
     2360                {
     2361                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2362                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2363                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2364                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) },
     2365                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2366                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2367                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     2368                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) }
     2369                }, true, false, false },
     2370            // block 1 - after call
     2371            { 32, 44,
     2372                { },
     2373                {
     2374                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
     2375                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) }
     2376                }, false, false, true },
     2377            // block 2 - routine
     2378            { 44, 56,
     2379                { { 3, false }, { 4, false } },
     2380                {
     2381                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2382                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     2383                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2384                }, false, false, false },
     2385            // block 3 - first return
     2386            { 56, 64,
     2387                { },
     2388                {
     2389                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2390                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2391                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     2392                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2393                }, false, true, true },
     2394            // block 4 - second return
     2395            { 64, 72,
     2396                { },
     2397                {
     2398                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2399                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     2400                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
     2401                    { { "sa", 4 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     2402                }, false, true, true }
     2403        },
     2404        {   // SSA replaces
     2405            { { "sa", 2 }, { { 4, 3 } } }
    22452406        },
    22462407        true, ""
Note: See TracChangeset for help on using the changeset viewer.