Changeset 4046 in CLRX


Ignore:
Timestamp:
Apr 23, 2018, 11:05:42 PM (5 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Correctly process regvars firstly encountered in current block (adds liveness region from first visited block to current block).
Fixed Liveness:insert method: change end of a region if a region already present. First working testcase with few code blocks (createLivenesses).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r4045 r4046  
    740740            // find last
    741741            auto lvrit = lastVRegMap.find(entry.first);
    742             if (lvrit == lastVRegMap.end())
    743                 continue; // not found
    744             const VRegLastPos& lastPos = lvrit->second;
    745             FlowStackCIter flit = flowStack.begin() + lastPos.blockChain.back();
     742            FlowStackCIter flit = flowStack.begin();
     743            if (lvrit != lastVRegMap.end())
     744                flit += lvrit->second.blockChain.back();
     745           
    746746            cxuint regType = getRegType(regTypesNum, regRanges, entry.first);
    747747            const VarIndexMap& vregIndexMap = vregIndexMaps[regType];
     
    753753           
    754754            ARDOut << "  putCross for " << entry.first.regVar << ":" <<
    755                     entry.first.index << ": " << lastPos.blockChain.back() << "\n";
     755                    entry.first.index << "\n";
    756756            // insert live time to last seen position
    757757            const CodeBlock& lastBlk = codeBlocks[flit->blockIndex];
    758758           
    759             lv.insert(lastBlk.ssaInfoMap.find(entry.first)->second.lastPos, lastBlk.end);
    760             for (++flit; flit != flitEnd; ++flit)
     759            auto sinfoIt = lastBlk.ssaInfoMap.find(entry.first);
     760            size_t lastPos = lastBlk.start;
     761            if (sinfoIt != lastBlk.ssaInfoMap.end())
     762            {
     763                // if begin at some point at last block
     764                lastPos = sinfoIt->second.lastPos;
     765                lv.insert(lastPos + (!sinfoIt->second.readBeforeWrite),
     766                          lastBlk.end);
     767                ++flit; // skip last block in stack
     768            }
     769           
     770            for (; flit != flitEnd; ++flit)
    761771            {
    762772                const CodeBlock& cblock = codeBlocks[flit->blockIndex];
     
    10101020            if (!visited[entry.blockIndex])
    10111021            {
    1012                 putCrossBlockLivenesses(flowStack, codeBlocks,
    1013                         lastVRegMap, livenesses, vregIndexMaps, regTypesNum, regRanges);
     1022                if (flowStack.size() > 1)
     1023                    putCrossBlockLivenesses(flowStack, codeBlocks, lastVRegMap,
     1024                            livenesses, vregIndexMaps, regTypesNum, regRanges);
    10141025                // update last vreg position
    10151026                for (const auto& sentry: cblock.ssaInfoMap)
  • CLRadeonExtender/trunk/amdasm/AsmRegAlloc.h

    r4045 r4046  
    303303   
    304304    void insert(size_t k, size_t k2)
    305     { join(l.insert(std::make_pair(k, k2)).first); }
     305    {
     306        auto res = l.insert(std::make_pair(k, k2));
     307        if (!res.second)
     308            res.first->second = k2;
     309        join(res.first);
     310    }
    306311   
    307312    bool contain(size_t t) const
  • CLRadeonExtender/trunk/tests/amdasm/AsmRegAlloc3.cpp

    r4045 r4046  
    264264        { }, // linearDepMaps
    265265        true, ""
    266     }
    267 #if 0
    268     ,
     266    },
    269267    {   // 5 - blocks
    270268        R"ffDXD(.regvar sa:s:8, va:v:10
     
    284282       
    285283a2:     s_cselect_b32 sa[2], sa[4], sa[3]   # 44
    286         #v_cndmask_b32 va[3], va[0], va[1], vcc     # 48
     284        v_cndmask_b32 va[3], va[0], va[1], vcc     # 48
    287285        s_endpgm                        # 52
    288286)ffDXD",
    289287        {   // livenesses
    290288            {   // for SGPRs
    291             },
    292             {   // for VGPRs
    293             },
    294             { },
    295             { }
    296         },
    297         { }, // linearDepMaps
     289                { { 0, 17 } }, // 0: S0
     290                { { 0, 17 } }, // 1: S1
     291                { { 0, 21 } }, // 2: S3
     292                { { 0, 26 } }, // 3: S4
     293                { { 0, 25 } }, // 4: sa[2]'0
     294                { { 45, 46 } }, // 5: sa[2]'1
     295                { { 0, 20 }, { 44, 45 } }, // 6: sa[3]'0
     296                { { 21, 22 } }, // 7: sa[3]'1
     297                { { 1, 5 } }, // 8: sa[4]'0
     298                { { 5, 20 }, { 44, 45 } }, // 9: sa[4]'1
     299                { { 0, 20 }, { 32, 33 } }  // 10: sa[5]
     300            },
     301            {   // for VGPRs
     302                { { 0, 20 }, { 32, 37 } }, // 0: V0
     303                { { 9, 20 }, { 32, 33 }, { 44, 49 } }, // 1: va[0]'0
     304                { { 0, 20 }, { 44, 49 } }, // 2: va[1]'0
     305                { { 0, 9 } }, // 3: va[2]'0
     306                { { 33, 37 } }, // 4: va[2]'1
     307                { { 37, 38 } }, // 5: va[3]'0
     308                { { 49, 50 } }  // 6: va[3]'1
     309            },
     310            { },
     311            { }
     312        },
     313        {   // linearDepMaps
     314            {   // for SGPRs
     315                { 0, { 0, { }, { 1 } } },
     316                { 1, { 0, { 0 }, { } } }
     317            },
     318            { },
     319            { },
     320            { }
     321        },
    298322        true, ""
    299323    }
    300 #endif
    301324};
    302325
Note: See TracChangeset for help on using the changeset viewer.