Changeset 4093 in CLRX


Ignore:
Timestamp:
May 6, 2018, 7:37:12 PM (6 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Tentative join readBeforeWrites from called routine with livenesses in the rest of the code.

File:
1 edited

Legend:

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

    r4092 r4093  
    751751        if (entry.second.readBeforeWrite)
    752752        {
    753             // find last 
     753            // find last
    754754            auto lvrit = lastVRegMap.find(entry.first);
    755755            FlowStackCIter flit = flowStack.begin();
     
    15891589                createRoutineDataLv(codeBlocks, routineMap, res.first->second,
    15901590                        entry.blockIndex, vregIndexMaps, regTypesNum, regRanges);
     1591            else
     1592            {
     1593                // already added join livenesses from all readBeforeWrites
     1594                for (const auto& entry: res.first->second.readBeforeWrites)
     1595                {
     1596                    // find last
     1597                    auto lvrit = lastVRegMap.find(entry);
     1598                    FlowStackCIter flit = flowStack.begin();
     1599                    if (lvrit != lastVRegMap.end())
     1600                        flit += lvrit->second.back();
     1601                   
     1602                    cxuint regType = getRegType(regTypesNum, regRanges, entry);
     1603                    const VarIndexMap& vregIndexMap = vregIndexMaps[regType];
     1604                    const std::vector<size_t>& ssaIdIndices =
     1605                                vregIndexMap.find(entry)->second;
     1606                   
     1607                    const CodeBlock& lastBlk = codeBlocks[flit->blockIndex];
     1608                    auto sinfoIt = lastBlk.ssaInfoMap.find(entry);
     1609                    const size_t ssaIdBefore = (sinfoIt != lastBlk.ssaInfoMap.end()) ?
     1610                            sinfoIt->second.ssaIdLast : 0;
     1611                    Liveness& lv = livenesses[regType][ssaIdIndices[ssaIdBefore]];
     1612                   
     1613                    if (lv.contain(codeBlocks[(flowStack.end()-1)->blockIndex].end-1))
     1614                        // already joined (check last byte from last block)
     1615                        continue;
     1616                   
     1617                    size_t lastPos = lastBlk.start;
     1618                    if (sinfoIt != lastBlk.ssaInfoMap.end())
     1619                    {
     1620                        // if begin at some point at last block
     1621                        lastPos = sinfoIt->second.lastPos;
     1622                        lv.insert(lastPos + 1, lastBlk.end);
     1623                        ++flit; // skip last block in stack
     1624                    }
     1625                   
     1626                    for (; flit != flowStack.end(); ++flit)
     1627                    {
     1628                        const CodeBlock& cblock = codeBlocks[flit->blockIndex];
     1629                        lv.insert(cblock.start, cblock.end);
     1630                    }
     1631                }
     1632            }
    15911633            callStack.pop_back(); // just return from call
    15921634        }
Note: See TracChangeset for help on using the changeset viewer.