Changeset 4007 in CLRX


Ignore:
Timestamp:
Apr 16, 2018, 5:55:58 PM (8 days ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmRegAlloc?: Changes in Liveness class (use join routine to join new or changed region).

File:
1 edited

Legend:

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

    r4006 r4007  
    744744    { l.clear(); }
    745745   
     746    void join(std::map<size_t, size_t>::iterator it)
     747    {
     748        if (it != l.begin())
     749        {
     750            auto prevIt = it;
     751            --prevIt;
     752            if (prevIt->second >= it->first)
     753            {
     754                // join with previous region
     755                prevIt->second = it->second;
     756                l.erase(it);
     757                it = prevIt;
     758            }
     759        }
     760        if (it != l.end())
     761        {
     762            auto nextIt = it;
     763            ++nextIt;
     764            if (nextIt->first <= it->second)
     765            {
     766                // join with next region
     767                it->second = nextIt->second;
     768                l.erase(nextIt);
     769            }
     770        }
     771    }
     772   
    746773    void expand(size_t k)
    747774    {
     775        std::map<size_t, size_t>::iterator it;
    748776        if (l.empty())
    749             l.insert(std::make_pair(k, k+1));
     777            it = l.insert(std::make_pair(k, k+1)).first;
    750778        else
    751779        {
    752             auto it = l.end();
     780            it = l.end();
    753781            --it;
    754782            it->second = k+1;
    755783        }
     784        join(it);
    756785    }
    757786    void newRegion(size_t k)
    758     {
    759         if (l.empty())
    760             l.insert(std::make_pair(k, k));
    761         else
    762         {
    763             auto it = l.end();
    764             --it;
    765             if (it->first != k && it->second != k)
    766                 l.insert(std::make_pair(k, k));
    767         }
    768     }
     787    { join(l.insert(std::make_pair(k, k)).first); }
    769788   
    770789    void insert(size_t k, size_t k2)
    771     {
    772         auto it1 = l.lower_bound(k);
    773         if (it1!=l.begin() && (it1==l.end() || it1->first>k))
    774             --it1;
    775         if (it1->second < k)
    776             ++it1;
    777         auto it2 = l.lower_bound(k2);
    778         if (it1!=it2)
    779         {
    780             k = std::min(k, it1->first);
    781             k2 = std::max(k2, (--it2)->second);
    782             l.erase(it1, it2);
    783         }
    784         l.insert(std::make_pair(k, k2));
    785     }
     790    { join(l.insert(std::make_pair(k, k2)).first); }
    786791   
    787792    bool contain(size_t t) const
Note: See TracChangeset for help on using the changeset viewer.