Changeset 4027 in CLRX


Ignore:
Timestamp:
Apr 19, 2018, 5:56:37 PM (3 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Set liveTimeNext to next instruction livetime. Add next simple testcase.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdasm/Assembler.h

    r4024 r4027  
    382382    void createSSAData(ISAUsageHandler& usageHandler);
    383383    void applySSAReplaces();
    384     void createLivenesses(ISAUsageHandler& usageHandler);
     384    void createLivenesses(ISAUsageHandler& usageHandler,
     385            size_t codeSize, const cxbyte* code);
    385386    void createInterferenceGraph();
    386387    void colorInterferenceGraph();
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.cpp

    r4026 r4027  
    953953}
    954954
    955 void AsmRegAllocator::createLivenesses(ISAUsageHandler& usageHandler)
    956 {
     955void AsmRegAllocator::createLivenesses(ISAUsageHandler& usageHandler,
     956            size_t codeSize, const cxbyte* code)
     957{
     958    ISAAssembler* isaAsm = assembler.isaAssembler;
    957959    // construct var index maps
    958960    cxuint regRanges[MAX_REGTYPES_NUM*2];
     
    10721074                {
    10731075                    AsmRegVarUsage rvu = { 0U, nullptr, 0U, 0U };
    1074                     size_t liveTimeNext = curBlockLiveEnd;
     1076                    size_t liveTimeNext = SIZE_MAX;
    10751077                    bool hasNext = false;
    10761078                    if (usageHandler.hasNext())
     
    10781080                        hasNext = true;
    10791081                        rvu = usageHandler.nextUsage();
    1080                         if (rvu.offset < cblock.end)
    1081                         {
    1082                             if (!rvu.useRegMode)
    1083                                 instrRVUs[instrRVUsCount++] = rvu;
    1084                             liveTimeNext = std::min(rvu.offset, cblock.end) -
    1085                                     cblock.start + curLiveTime;
    1086                         }
     1082                        if (rvu.offset < cblock.end && !rvu.useRegMode)
     1083                            instrRVUs[instrRVUsCount++] = rvu;
    10871084                    }
    10881085                    size_t liveTime = oldOffset - cblock.start + curLiveTime;
    10891086                    if (!hasNext || rvu.offset > oldOffset)
    10901087                    {
     1088                        if (!writtenSVRegs.empty())
     1089                            // calculate livetime for next instruction
     1090                            liveTimeNext = liveTime + isaAsm->getInstructionSize(
     1091                                    codeSize - oldOffset, code + oldOffset);
     1092                       
    10911093                        ARDOut << "apply to liveness. offset: " << oldOffset << "\n";
    10921094                        // apply to liveness
     
    14731475    createSSAData(*section.usageHandler);
    14741476    applySSAReplaces();
    1475     createLivenesses(*section.usageHandler);
     1477    createLivenesses(*section.usageHandler, section.content.size(), section.content.data());
    14761478    createInterferenceGraph();
    14771479    colorInterferenceGraph();
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4026 r4027  
    8383            { }
    8484        },
    85         {   // linearDepMaps
     85        { },  // linearDepMaps
     86        { },  // equalToDepMaps
     87        true, ""
     88    },
     89    {   // 1 - simple case 2
     90        R"ffDXD(.regvar sa:s:8, va:v:10
     91        s_mov_b32 sa[4], sa[2]  # 0
     92        s_add_u32 sa[4], sa[4], s3
     93        v_xor_b32 va[4], va[2], v3
     94        s_endpgm
     95)ffDXD",
     96        {   // livenesses
     97            {   // for SGPRs
     98                { { 0, 5 } }, // S3
     99                { { 0, 0 } }, // sa[2]'0
     100                { { 4, 5 } }, // sa[4]'0
     101                { { 8, 9 } }  // sa[4]'1
     102            },
     103            {   // for VGPRs
     104                { { 0, 9 } }, // V3
     105                { { 0, 9 } }, // va[2]'0
     106                { { 12, 13 } } // va[4]'0 : out of range code block
     107            },
     108            { },
     109            { }
    86110        },
    87         {   // equalToDepMaps
    88         }, true, ""
     111        { },  // linearDepMaps
     112        { },  // equalToDepMaps
     113        true, ""
    89114    }
    90115};
     
    125150    regAlloc.createSSAData(*section.usageHandler);
    126151    regAlloc.applySSAReplaces();
    127     regAlloc.createLivenesses(*section.usageHandler);
     152    regAlloc.createLivenesses(*section.usageHandler, section.getSize(),
     153                            section.content.data());
    128154   
    129155    std::ostringstream oss;
Note: See TracChangeset for help on using the changeset viewer.