Changeset 3655 in CLRX


Ignore:
Timestamp:
Jan 22, 2018, 7:51:45 PM (2 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Include used SSAIds from called routines while resolving SSA conflicts.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r3654 r3655  
    550550                visited[entry.blockIndex] = true;
    551551                std::cout << "  resolv: " << entry.blockIndex << std::endl;
     552               
    552553                for (auto& sentry: cblock.ssaInfoMap)
    553554                {
    554555                    const SSAInfo& sinfo = sentry.second;
    555                     auto res = toResolveMap.insert({ sentry.first, entry.blockIndex, });
     556                    auto res = toResolveMap.insert({ sentry.first, entry.blockIndex });
    556557                   
    557558                    if (res.second && sinfo.readBeforeWrite)
     
    620621                 !cblock.haveReturn && !cblock.haveEnd)
    621622        {
     623            // add toResolveMap ssaIds inside called routines
     624            for (const auto& next: cblock.nexts)
     625                if (next.isCall)
     626                {
     627                    const RoutineData& rdata = routineMap.find(next.block)->second;
     628                    for (const auto& v: rdata.rbwSSAIdMap)
     629                        toResolveMap.insert({v.first, entry.blockIndex });
     630                    for (const auto& v: rdata.lastSSAIdMap)
     631                        toResolveMap.insert({v.first, entry.blockIndex });
     632                }
     633           
    622634            flowStack.push_back({ entry.blockIndex+1, 0 });
    623635            entry.nextIndex++;
     
    625637        else // back
    626638        {
     639            // mark resolved variables as not handled for further processing
     640            for (const auto& next: cblock.nexts)
     641                if (next.isCall)
     642                {
     643                    const RoutineData& rdata = routineMap.find(next.block)->second;
     644                    for (const auto& v: rdata.rbwSSAIdMap)
     645                    {
     646                        auto it = toResolveMap.find(v.first);
     647                        if (it != toResolveMap.end() && it->second == entry.blockIndex)
     648                            // remove if not handled yet
     649                            toResolveMap.erase(it);
     650                    }
     651                    for (const auto& v: rdata.lastSSAIdMap)
     652                    {
     653                        auto it = toResolveMap.find(v.first);
     654                        if (it != toResolveMap.end() && it->second == entry.blockIndex)
     655                            // remove if not handled yet
     656                            toResolveMap.erase(it);
     657                    }
     658                }
     659           
    627660            for (const auto& sentry: cblock.ssaInfoMap)
    628661            {
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc.cpp

    r3653 r3655  
    31533153            { { "sa", 2 }, { { 5, 4 }, { 6, 4 }, { 5, 4 }, { 7, 3 } } },
    31543154            { { "sa", 3 }, { { 3, 2 }, { 4, 2 }, { 4, 3 }, { 5, 2 } } }
    3155         }, true, ""
     3155        },
     3156        true, ""
    31563157    },
    31573158    {   // 26 - many routines in single calls
     
    33483349            { { "sa", 4 }, { { 3, 1 } } },
    33493350            { { "sa", 5 }, { { 4, 3 } } }
    3350         }, true, ""
     3351        },
     3352        true, ""
     3353    },
     3354    {   // 27 - conflicts inside routines
     3355        R"ffDXD(.regvar sa:s:8, va:v:8
     3356        s_mov_b32 sa[2], s4
     3357        s_mov_b32 sa[3], s5
     3358        s_mov_b32 sa[4], s6
     3359        s_cbranch_scc1 aa0
     3360       
     3361        s_getpc_b64 s[2:3]
     3362        s_add_u32 s2, s2, routine1-.
     3363        s_add_u32 s3, s3, routine1-.+4
     3364        .cf_call routine1
     3365        s_swappc_b64 s[0:1], s[2:3]
     3366       
     3367        s_and_b32 sa[5], sa[5], s0
     3368       
     3369aa0:    s_getpc_b64 s[2:3]
     3370        s_add_u32 s2, s2, routine2-.
     3371        s_add_u32 s3, s3, routine2-.+4
     3372        .cf_call routine2
     3373        s_swappc_b64 s[0:1], s[2:3]
     3374       
     3375        s_lshr_b32 sa[2], sa[2], 2
     3376        s_min_u32 sa[2], sa[2], sa[3]
     3377        s_lshr_b32 sa[3], sa[3], 2
     3378        s_endpgm
     3379       
     3380routine1:
     3381        s_xor_b32 sa[2], sa[2], sa[6]
     3382        s_xor_b32 sa[3], sa[3], sa[6]
     3383        s_cbranch_scc1 bb1
     3384       
     3385        s_min_u32 sa[2], sa[2], sa[6]
     3386        s_and_b32 sa[4], sa[4], sa[6]
     3387        .cf_ret
     3388        s_setpc_b64 s[0:1]
     3389       
     3390bb1:    s_and_b32 sa[2], sa[2], sa[6]
     3391        s_and_b32 sa[4], sa[4], sa[6]
     3392        .cf_ret
     3393        s_setpc_b64 s[0:1]
     3394       
     3395routine2:
     3396        s_xor_b32 sa[2], sa[2], sa[6]
     3397        s_xor_b32 sa[3], sa[3], sa[6]
     3398        s_cbranch_scc1 bb2
     3399       
     3400        s_min_u32 sa[2], sa[2], sa[6]
     3401        s_max_u32 sa[4], sa[4], sa[6]
     3402        .cf_ret
     3403        s_setpc_b64 s[0:1]
     3404       
     3405bb2:    s_and_b32 sa[3], sa[3], sa[6]
     3406        .cf_ret
     3407        s_setpc_b64 s[0:1]
     3408)ffDXD",
     3409        {
     3410            // block 0 - start
     3411            { 0, 16,
     3412                { { 1, false }, { 3, false } },
     3413                {
     3414                    { { "", 4 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3415                    { { "", 5 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3416                    { { "", 6 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3417                    { { "sa", 2 }, SSAInfo(0, 1, 1, 1, 1, false) },
     3418                    { { "sa", 3 }, SSAInfo(0, 1, 1, 1, 1, false) },
     3419                    { { "sa", 4 }, SSAInfo(0, 1, 1, 1, 1, false) }
     3420                }, false, false, false },
     3421            // block 1 - call routine1
     3422            { 16, 40,
     3423                { { 5, true } },
     3424                {
     3425                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     3426                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     3427                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     3428                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) }
     3429                }, true, false, false },
     3430            // block 2 - before aa0
     3431            { 40, 44,
     3432                { },
     3433                {
     3434                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3435                    { { "sa", 5 }, SSAInfo(0, 1, 1, 1, 1, true) }
     3436                }, false, false, false },
     3437            // block 3 - aa0
     3438            { 44, 68,
     3439                { { 8, true } },
     3440                {
     3441                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, false) },
     3442                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, false) },
     3443                    { { "", 2 }, SSAInfo(0, 0, 0, 0, 0, false) },
     3444                    { { "", 3 }, SSAInfo(0, 0, 0, 0, 0, false) }
     3445                }, true, false, false },
     3446            // block 4 - end
     3447            { 68, 84,
     3448                { },
     3449                {
     3450                    { { "sa", 2 }, SSAInfo(5, 7, 7, 8, 2, true) },
     3451                    { { "sa", 3 }, SSAInfo(3, 5, 5, 5, 1, true) }
     3452                }, false, false, true },
     3453            // block 5 - routine1
     3454            { 84, 96,
     3455                { { 6, false }, { 7, false } },
     3456                {
     3457                    { { "sa", 2 }, SSAInfo(1, 2, 2, 2, 1, true) },
     3458                    { { "sa", 3 }, SSAInfo(1, 2, 2, 2, 1, true) },
     3459                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     3460                }, false, false, false },
     3461            // block 6 - routine1 way 1
     3462            { 96, 108,
     3463                { },
     3464                {
     3465                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3466                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3467                    { { "sa", 2 }, SSAInfo(2, 3, 3, 3, 1, true) },
     3468                    { { "sa", 4 }, SSAInfo(1, 2, 2, 2, 1, true) },
     3469                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     3470                }, false, true, true },
     3471            // block 7 - routine1 way 2
     3472            { 108, 120,
     3473                { },
     3474                {
     3475                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3476                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3477                    { { "sa", 2 }, SSAInfo(2, 4, 4, 4, 1, true) },
     3478                    { { "sa", 4 }, SSAInfo(1, 3, 3, 3, 1, true) },
     3479                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     3480                }, false, true, true },
     3481            // block 8 - routine 2
     3482            { 120, 132,
     3483                { { 9, false }, { 10, false } },
     3484                {
     3485                    { { "sa", 2 }, SSAInfo(3, 5, 5, 5, 1, true) },
     3486                    { { "sa", 3 }, SSAInfo(2, 3, 3, 3, 1, true) },
     3487                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     3488                }, false, false, false },
     3489            // block 9 - routine 2 way 0
     3490            { 132, 144,
     3491                { },
     3492                {
     3493                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3494                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3495                    { { "sa", 2 }, SSAInfo(5, 6, 6, 6, 1, true) },
     3496                    { { "sa", 4 }, SSAInfo(2, 4, 4, 4, 1, true) },
     3497                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     3498                }, false, true, true },
     3499            // block 10 - routine 2 way 1
     3500            { 144, 152,
     3501                { },
     3502                {
     3503                    { { "", 0 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3504                    { { "", 1 }, SSAInfo(0, 0, 0, 0, 0, true) },
     3505                    { { "sa", 3 }, SSAInfo(3, 4, 4, 4, 1, true) },
     3506                    { { "sa", 6 }, SSAInfo(0, SIZE_MAX, 1, SIZE_MAX, 0, true) }
     3507                }, false, true, true }
     3508        },
     3509        {   // SSA replaces
     3510            { { "sa", 2 }, { { 4, 3 }, { 6, 5 }, { 3, 1 } } },
     3511            { { "sa", 3 }, { { 4, 3 }, { 2, 1 } } },
     3512            { { "sa", 4 }, { { 3, 2 }, { 2, 1 } } }
     3513        },
     3514        true, ""
    33513515    }
    33523516};
Note: See TracChangeset for help on using the changeset viewer.