Changeset 4039 in CLRX


Ignore:
Timestamp:
Apr 21, 2018, 12:08:08 PM (5 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Fixed expand in Liveness (expand first region if k is in this region). Insert region (k+1,k+2) for variable write.
Remove codeSize and code from createLivenesses arguments. Fixed testcases.

Location:
CLRadeonExtender/trunk
Files:
4 edited

Legend:

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

    r4032 r4039  
    374374    void createSSAData(ISAUsageHandler& usageHandler);
    375375    void applySSAReplaces();
    376     void createLivenesses(ISAUsageHandler& usageHandler,
    377             size_t codeSize, const cxbyte* code);
     376    void createLivenesses(ISAUsageHandler& usageHandler);
    378377    void createInterferenceGraph();
    379378    void colorInterferenceGraph();
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.cpp

    r4036 r4039  
    920920}
    921921
    922 void AsmRegAllocator::createLivenesses(ISAUsageHandler& usageHandler,
    923             size_t codeSize, const cxbyte* code)
    924 {
    925     ISAAssembler* isaAsm = assembler.isaAssembler;
     922void AsmRegAllocator::createLivenesses(ISAUsageHandler& usageHandler)
     923{
    926924    // construct var index maps
    927925    cxuint regRanges[MAX_REGTYPES_NUM*2];
     
    1000998                flowStack.pop_back();
    1001999                continue;
    1002             }
    1003            
    1004             if (flowStack.size() > 1)
    1005             {
    1006                 auto fcit = flowStack.end();
    1007                 --fcit;
    1008                 --fcit; // previous entry
    1009                 // add liveregion into liveness after previous block
    1010                 for(Liveness* lv: fcit->lastInstrWrites)
    1011                     lv->insert(curLiveTime, curLiveTime+1);
    10121000            }
    10131001           
     
    10331021            }
    10341022           
    1035             size_t curBlockLiveEnd = cblock.end;
    10361023            if (!visited[entry.blockIndex])
    10371024            {
     
    10501037                {
    10511038                    AsmRegVarUsage rvu = { 0U, nullptr, 0U, 0U };
    1052                     size_t liveTimeNext = SIZE_MAX;
    10531039                    bool hasNext = false;
    10541040                    if (usageHandler.hasNext())
     
    10601046                    if (!hasNext || rvu.offset > oldOffset)
    10611047                    {
    1062                         if (!writtenSVRegs.empty())
    1063                             // calculate livetime for next instruction
    1064                             liveTimeNext = liveTime + isaAsm->getInstructionSize(
    1065                                     codeSize - oldOffset, code + oldOffset);
    1066                        
    10671048                        ARDOut << "apply to liveness. offset: " << oldOffset << "\n";
    10681049                        // apply to liveness
     
    10851066                            Liveness& lv = getLiveness(svreg, ssaIdIdx, sinfo,
    10861067                                    livenesses, vregIndexMaps, regTypesNum, regRanges);
    1087                             if (liveTimeNext != curBlockLiveEnd)
    1088                                 // because live after this instr
    1089                                 lv.insert(liveTimeNext, liveTimeNext+1);
    1090                             else
    1091                                 entry.lastInstrWrites.push_back(&lv);
    1092                                
    1093                             sinfo.lastPos = liveTimeNext;
     1068                            lv.insert(liveTime+1, liveTime+2);
    10941069                        }
    10951070                        // get linear deps and equal to
     
    11441119        else // back
    11451120        {
    1146             if (cblock.nexts.empty() && cblock.haveEnd)
    1147                 // add special liveregion for end for last writes
    1148                 for(Liveness* lv: entry.lastInstrWrites)
    1149                     lv->insert(SIZE_MAX-1, SIZE_MAX);
    1150            
    11511121            // revert lastSSAIdMap
    11521122            blockInWay.erase(entry.blockIndex);
     
    13671337    createSSAData(*section.usageHandler);
    13681338    applySSAReplaces();
    1369     createLivenesses(*section.usageHandler, section.content.size(), section.content.data());
     1339    createLivenesses(*section.usageHandler);
    13701340    createInterferenceGraph();
    13711341    colorInterferenceGraph();
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.h

    r4036 r4039  
    193193    size_t blockIndex;
    194194    size_t nextIndex;
     195};
     196
     197struct CLRX_INTERNAL FlowStackEntry3
     198{
     199    size_t blockIndex;
     200    size_t nextIndex;
     201    bool isCall;
    195202};
    196203
     
    286293        if (it != l.begin())
    287294            --it;
    288         else // do nothing
     295        else if (it->first > k) // do nothing
    289296            return;
    290297        if (it->first <= k && it->second > k)
     
    315322};
    316323
    317 struct CLRX_INTERNAL FlowStackEntry3
    318 {
    319     size_t blockIndex;
    320     size_t nextIndex;
    321     bool isCall;
    322     std::vector<Liveness*> lastInstrWrites;
    323 };
    324 
    325324typedef AsmRegAllocator::VarIndexMap VarIndexMap;
    326325
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4038 r4039  
    6464            {   // for SGPRs
    6565                { { 0, 5 } }, // S3
    66                 { { 0, 0 } }, // sa[2]'0
    67                 { { 4, 5 } }, // sa[4]'0
    68                 { { 8, 9 } }  // sa[4]'1
     66                { { 0, 1 } }, // sa[2]'0
     67                { { 1, 5 } }, // sa[4]'0
     68                { { 5, 6 } }  // sa[4]'1
    6969            },
    7070            {   // for VGPRs
    7171                { { 0, 9 } }, // V3
    7272                { { 0, 9 } }, // va[2]'0
    73                 { { SIZE_MAX-1, SIZE_MAX } } // va[4]'0 : out of range code block
     73                { { 9, 10 } } // va[4]'0 : out of range code block
    7474            },
    7575            { },
     
    8989            {   // for SGPRs
    9090                { { 0, 5 } }, // S3
    91                 { { 0, 0 } }, // sa[2]'0
    92                 { { 4, 5 } }, // sa[4]'0
    93                 { { 8, 9 } }  // sa[4]'1
     91                { { 0, 1 } }, // sa[2]'0
     92                { { 1, 5 } }, // sa[4]'0
     93                { { 5, 6 } }  // sa[4]'1
    9494            },
    9595            {   // for VGPRs
    9696                { { 0, 9 } }, // V3
    9797                { { 0, 9 } }, // va[2]'0
    98                 { { 12, 13 } } // va[4]'0 : out of range code block
     98                { { 9, 10 } } // va[4]'0 : out of range code block
    9999            },
    100100            { },
     
    116116                { { 0, 5 } }, // S4
    117117                { { 0, 5 } }, // S5
    118                 { { 0, 0 } }, // sa[2]'0
    119                 { { 0, 0 } }, // sa[3]'0
    120                 { { 4, 5 } }, // sa[4]'0
    121                 { { 8, 9 } }, // sa[4]'1
    122                 { { 4, 5 } }, // sa[5]'0
    123                 { { 8, 9 } }, // sa[5]'1
     118                { { 0, 1 } }, // sa[2]'0
     119                { { 0, 1 } }, // sa[3]'0
     120                { { 1, 5 } }, // sa[4]'0
     121                { { 5, 6 } }, // sa[4]'1
     122                { { 1, 5 } }, // sa[5]'0
     123                { { 5, 6 } }, // sa[5]'1
    124124                { { 0, 17 } }, // sa[7]'0
    125125                { { 0, 17 } }, // sbuf[0]'0
     
    131131                { { 0, 9 } }, // V3
    132132                { { 0, 9 } }, // V4
    133                 { { SIZE_MAX-1, SIZE_MAX } }, // rbx4[1]'0
    134                 { { SIZE_MAX-1, SIZE_MAX } }, // rbx4[2]'0
    135                 { { SIZE_MAX-1, SIZE_MAX } }, // rbx4[3]'0
    136                 { { SIZE_MAX-1, SIZE_MAX } }, // rbx4[4]'0
     133                { { 17, 18 } }, // rbx4[1]'0
     134                { { 17, 18 } }, // rbx4[2]'0
     135                { { 17, 18 } }, // rbx4[3]'0
     136                { { 17, 18 } }, // rbx4[4]'0
    137137                { { 0, 17 } }, // rbx4[5]'0: tfe - read before write
    138138                { { 0, 9 } }, // va[2]'0
    139139                { { 0, 9 } }, // va[3]'0
    140                 { { 16, 17 } }, // va[4]'0 : out of range code block
    141                 { { 16, 17 } }, // va[5]'0 : out of range code block
     140                { { 9, 10 } }, // va[4]'0 : out of range code block
     141                { { 9, 10 } }, // va[5]'0 : out of range code block
    142142                { { 0, 17 } } // va[6]'0
    143143            },
     
    196196                { { 0, 37 } }, // 1: sa[2]'0
    197197                { { 0, 37 } }, // 2: sa[3]'0
    198                 { { 4, 5 } }, // 3: sa[4]'0
    199                 { { 8, 29 } }, // 4: sa[4]'1
    200                 { { 40, 41 } }  // 5: sa[7]'0
     198                { { 1, 5 } }, // 3: sa[4]'0
     199                { { 5, 29 } }, // 4: sa[4]'1
     200                { { 37, 38 } }  // 5: sa[7]'0
    201201            },
    202202            {   // for VGPRs
     
    204204                { { 0, 9 } }, // 1: v3
    205205                { { 0, 9 } }, // 2: va[2]'0
    206                 { { 20, 41 } }, // 3: va[3]'0
    207                 { { 12, 29 } }, // 4: va[4]'0
    208                 { { 32, 33 } }, // 5: va[5]'0
    209                 { { 28, 33 } }, // 6: va[6]'0
     206                { { 13, 41 } }, // 3: va[3]'0
     207                { { 9, 29 } }, // 4: va[4]'0
     208                { { 29, 30 } }, // 5: va[5]'0
     209                { { 21, 33 } }, // 6: va[6]'0
    210210                { { 0, 41 } }  // 7: va[7]'0
    211211            },
     
    213213            { }
    214214        },
    215         {
    216         },
     215        { }, // linearDepMaps
    217216        true, ""
    218217    }
     
    254253    regAlloc.createSSAData(*section.usageHandler);
    255254    regAlloc.applySSAReplaces();
    256     regAlloc.createLivenesses(*section.usageHandler, section.getSize(),
    257                             section.content.data());
     255    regAlloc.createLivenesses(*section.usageHandler);
    258256   
    259257    std::ostringstream oss;
Note: See TracChangeset for help on using the changeset viewer.