Changeset 4174 in CLRX


Ignore:
Timestamp:
May 16, 2018, 3:06:22 PM (4 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Register linDeps for read vidxes (not only last) if read and write present in instruction for this same svreg.
Add testcase for testing registering a linearDeps.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r4173 r4174  
    822822            std::unordered_map<AsmSingleVReg, SSAInfo>& ssaInfoMap,
    823823            const VarIndexMap* vregIndexMaps, const SVRegMap& ssaIdIdxMap,
     824            const std::vector<AsmSingleVReg>& writtenSVRegs,
    824825            size_t regTypesNum, const cxuint* regRanges)
    825826{
     
    843844            {
    844845                AsmSingleVReg svreg = {rvu.regVar, k};
    845                 auto sit = ssaIdIdxMap.find(svreg);
     846                auto ssaIdIdx = ssaIdIdxMap.find(svreg)->second;
    846847                const SSAInfo& ssaInfo = ssaInfoMap.find(svreg)->second;
    847848                size_t outVIdx;
    848                 getVIdx(svreg, sit->second, ssaInfo, vregIndexMaps,
     849               
     850                if (rvu.rwFlags == ASMRVU_READ &&
     851                    std::find(writtenSVRegs.begin(), writtenSVRegs.end(),
     852                              svreg) != writtenSVRegs.end())
     853                    ssaIdIdx--; // current ssaIdIdx is for write, decrement
     854               
     855                getVIdx(svreg, ssaIdIdx, ssaInfo, vregIndexMaps,
    849856                                regTypesNum, regRanges, regType, outVIdx);
    850857                // push variable index
     
    866873            if (rvu.regVar == nullptr)
    867874                continue;
    868             std::vector<size_t> vidxes;
     875            std::vector<size_t> vidxes, vidxesPrev;
    869876            cxuint regType = UINT_MAX;
    870877            cxbyte align = rvus[i].align;
     
    872879            {
    873880                AsmSingleVReg svreg = {rvu.regVar, k};
    874                 auto sit = ssaIdIdxMap.find(svreg);
     881                size_t ssaIdIdx = ssaIdIdxMap.find(svreg)->second;
    875882                const SSAInfo& ssaInfo = ssaInfoMap.find(svreg)->second;
    876883                size_t outVIdx;
    877                 getVIdx(svreg, sit->second, ssaInfo, vregIndexMaps,
     884               
     885                if (rvu.rwFlags == ASMRVU_READ &&
     886                    std::find(writtenSVRegs.begin(), writtenSVRegs.end(),
     887                              svreg) != writtenSVRegs.end())
     888                    ssaIdIdx--; // current ssaIdIdx is for write, decrement
     889               
     890                getVIdx(svreg, ssaIdIdx, ssaInfo, vregIndexMaps,
    878891                                regTypesNum, regRanges, regType, outVIdx);
    879892                // push variable index
     
    13181331                        addUsageDeps(lDeps, instrRVUsCount, instrRVUs, linearDepMaps,
    13191332                                cblock.ssaInfoMap, vregIndexMaps, ssaIdIdxMap,
    1320                                 regTypesNum, regRanges);
     1333                                writtenSVRegs, regTypesNum, regRanges);
    13211334                       
    13221335                        readSVRegs.clear();
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4172 r4174  
    28422842            { 7, { { { }, { }, { }, { } } } }
    28432843        },
     2844        true, ""
     2845    },
     2846    {   // 42 - testing linear deps
     2847        R"ffDXD(.regvar sa:s:8, va:v:8
     2848        s_mov_b64 sa[2:3], s[4:5]               # 0
     2849        s_mov_b64 sa[5:6], s[6:7]               # 4
     2850        s_cbranch_scc0 b1                       # 8
     2851       
     2852b0:     s_xor_b32 sa[2], sa[2], sa[7]           # 12
     2853        s_xor_b32 sa[3], sa[3], sa[7]           # 16
     2854        s_xor_b64 sa[2:3], sa[2:3], sa[0:1]     # 20
     2855        s_xor_b32 sa[2], sa[2], sa[7]           # 24
     2856        s_xor_b32 sa[3], sa[3], sa[7]           # 28
     2857        s_xor_b64 sa[2:3], sa[5:6], sa[0:1]     # 32
     2858        s_xor_b64 sa[5:6], sa[2:3], sa[0:1]     # 36
     2859        s_endpgm                                # 40
     2860       
     2861b1:     s_xor_b32 sa[2], sa[2], sa[7]           # 44
     2862        s_xor_b32 sa[3], sa[3], sa[7]           # 48
     2863        s_xor_b64 sa[2:3], sa[2:3], sa[0:1]     # 52
     2864        s_xor_b64 sa[2:3], sa[5:6], sa[0:1]     # 56
     2865        s_xor_b64 sa[5:6], sa[2:3], sa[0:1]     # 60
     2866        s_xor_b32 sa[5], sa[5], sa[7]           # 64
     2867        s_xor_b32 sa[6], sa[6], sa[7]           # 68
     2868        s_xor_b64 sa[5:6], sa[2:3], sa[0:1]     # 72
     2869        s_endpgm                                # 76
     2870)ffDXD",
     2871        {   // livenesses
     2872            {   // for SGPRs
     2873                { { 0, 1 } }, // 0: S4
     2874                { { 0, 1 } }, // 1: S5
     2875                { { 0, 5 } }, // 2: S6
     2876                { { 0, 5 } }, // 3: S7
     2877                { { 0, 37 }, { 44, 73 } }, // 4: sa[0]'0
     2878                { { 0, 37 }, { 44, 73 } }, // 5: sa[1]'0
     2879                { { 1, 13 }, { 44, 45 } }, // 6: sa[2]'0
     2880                { { 13, 21 } }, // 7: sa[2]'1
     2881                { { 21, 25 } }, // 8: sa[2]'2
     2882                { { 25, 26 } }, // 9: sa[2]'3
     2883                { { 33, 37 } }, // 10: sa[2]'4
     2884                { { 45, 53 } }, // 11: sa[2]'5
     2885                { { 53, 54 } }, // 12: sa[2]'6
     2886                { { 57, 73 } }, // 13: sa[2]'7
     2887                { { 1, 17 }, { 44, 49 } }, // 14: sa[3]'0
     2888                { { 17, 21 },}, // 15: sa[3]'1
     2889                { { 21, 29 } }, // 16: sa[3]'2
     2890                { { 29, 30 } }, // 17: sa[3]'3
     2891                { { 33, 37 } }, // 18: sa[3]'4
     2892                { { 49, 53 } }, // 19: sa[3]'5
     2893                { { 53, 54 } }, // 20: sa[3]'6
     2894                { { 57, 73 } }, // 21: sa[3]'7
     2895                { { 5, 33 }, { 44, 57 } }, // 22: sa[5]'0
     2896                { { 37, 38 } }, // 23: sa[5]'1
     2897                { { 61, 65 } }, // 24: sa[5]'2
     2898                { { 65, 66 } }, // 25: sa[5]'3
     2899                { { 73, 74 } }, // 26: sa[5]'4
     2900                { { 5, 33 }, { 44, 57 } }, // 27: sa[6]'0
     2901                { { 37, 38 } }, // 28: sa[6]'1
     2902                { { 61, 69 } }, // 29: sa[6]'2
     2903                { { 69, 70 } }, // 30: sa[6]'3
     2904                { { 73, 74 } }, // 31: sa[6]'4
     2905                { { 0, 29 }, { 44, 69 } }  // 32: sa[7]'0
     2906            }
     2907        },
     2908        {   // linearDeps
     2909            {   // for SGPRs
     2910                { 4, { 2, { }, { 5 } } },
     2911                { 5, { 0, { 4 }, { } } },
     2912                { 6, { 2, { }, { 14 } } },
     2913                { 7, { 2, { }, { 15 } } },
     2914                { 8, { 2, { }, { 16 } } },
     2915                { 10, { 2, { }, { 18 } } },
     2916                { 11, { 2, { }, { 19 } } },
     2917                { 12, { 2, { }, { 20 } } },
     2918                { 13, { 2, { }, { 21 } } },
     2919                { 14, { 0, { 6 }, { } } },
     2920                { 15, { 0, { 7 }, { } } },
     2921                { 16, { 0, { 8 }, { } } },
     2922                { 18, { 0, { 10 }, { } } },
     2923                { 19, { 0, { 11 }, { } } },
     2924                { 20, { 0, { 12 }, { } } },
     2925                { 21, { 0, { 13 }, { } } },
     2926                { 22, { 2, { }, { 27 } } },
     2927                { 23, { 2, { }, { 28 } } },
     2928                { 24, { 2, { }, { 29 } } },
     2929                { 26, { 2, { }, { 31 } } },
     2930                { 27, { 0, { 22 }, { } } },
     2931                { 28, { 0, { 23 }, { } } },
     2932                { 29, { 0, { 24 }, { } } },
     2933                { 31, { 0, { 26 }, { } } }
     2934            },
     2935            { },
     2936            { },
     2937            { }
     2938        },
     2939        { }, // vidxRoutineMap
     2940        { }, // vidxCallMap
    28442941        true, ""
    28452942    }
Note: See TracChangeset for help on using the changeset viewer.