| Index: src/IceRegAlloc.cpp
|
| diff --git a/src/IceRegAlloc.cpp b/src/IceRegAlloc.cpp
|
| index f610d9668b6dc8711c642aaad2737c730207e880..fcfe13e40cd1a946342f577a8c4d6c4d8ae23f87 100644
|
| --- a/src/IceRegAlloc.cpp
|
| +++ b/src/IceRegAlloc.cpp
|
| @@ -205,12 +205,14 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
|
| // overlaps with the current range and is precolored.
|
| // Cur.endsBefore(*I) is an early exit check that turns a
|
| // guaranteed O(N^2) algorithm into expected linear complexity.
|
| + llvm::SmallBitVector PrecoloredUnhandled(RegMask.size());
|
| for (OrderedRanges::const_iterator I = Unhandled.begin(),
|
| E = Unhandled.end();
|
| I != E && !Cur.endsBefore(*I); ++I) {
|
| LiveRangeWrapper Item = *I;
|
| if (Item.Var->hasReg() && Item.overlaps(Cur)) {
|
| Free[Item.Var->getRegNum()] = false; // Note: getRegNum not getRegNumTmp
|
| + PrecoloredUnhandled[Item.Var->getRegNum()] = true;
|
| }
|
| }
|
|
|
| @@ -219,7 +221,8 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
|
| for (SizeT i = 0; i < RegMask.size(); ++i) {
|
| if (RegMask[i]) {
|
| Str << Func->getTarget()->getRegName(i, IceType_i32)
|
| - << "(U=" << RegUses[i] << ",F=" << Free[i] << ") ";
|
| + << "(U=" << RegUses[i] << ",F=" << Free[i]
|
| + << ",P=" << PrecoloredUnhandled[i] << ") ";
|
| }
|
| }
|
| Str << "\n";
|
| @@ -228,8 +231,11 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull) {
|
| Variable *Prefer = Cur.Var->getPreferredRegister();
|
| int32_t PreferReg = Prefer && Prefer->hasRegTmp() ? Prefer->getRegNumTmp()
|
| : Variable::NoRegister;
|
| + bool AllowedToOverlap = Cur.Var->getRegisterOverlap() &&
|
| + PreferReg != Variable::NoRegister &&
|
| + !PrecoloredUnhandled[PreferReg];
|
| if (PreferReg != Variable::NoRegister &&
|
| - (Cur.Var->getRegisterOverlap() || Free[PreferReg])) {
|
| + (AllowedToOverlap || Free[PreferReg])) {
|
| // First choice: a preferred register that is either free or is
|
| // allowed to overlap with its linked variable.
|
| Cur.Var->setRegNumTmp(PreferReg);
|
|
|