Index: src/IceRegAlloc.cpp |
diff --git a/src/IceRegAlloc.cpp b/src/IceRegAlloc.cpp |
index 6b8656b76e2aaef589d1592bc9b126aab65cdfc0..61557e276ad04047c10ff91036a37e9d2c9790ea 100644 |
--- a/src/IceRegAlloc.cpp |
+++ b/src/IceRegAlloc.cpp |
@@ -833,8 +833,7 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull, |
Iter.Cur = Unhandled.back(); |
Unhandled.pop_back(); |
dumpLiveRangeTrace("\nConsidering ", Iter.Cur); |
- Iter.RegMask = |
- RegMaskFull & Target->getRegisterSetForType(Iter.Cur->getType()); |
+ Iter.RegMask = RegMaskFull & Target->getRegistersForClass(Iter.Cur); |
KillsRange.trim(Iter.Cur->getLiveRange().getStart()); |
// Check for pre-colored ranges. If Cur is pre-colored, it definitely gets |
@@ -862,11 +861,10 @@ void LinearScan::scan(const llvm::SmallBitVector &RegMaskFull, |
// Disable AllowOverlap if an Active variable, which is not Prefer, shares |
// Prefer's register, and has a definition within Cur's live range. |
if (Iter.AllowOverlap) { |
+ const llvm::SmallBitVector &Aliases = *RegAliases[Iter.PreferReg]; |
for (const Variable *Item : Active) { |
int32_t RegNum = Item->getRegNumTmp(); |
- // TODO(stichnot): Consider aliases of RegNum. This is probably a |
- // correctness issue. |
- if (Item != Iter.Prefer && RegNum == Iter.PreferReg && |
+ if (Item != Iter.Prefer && Aliases[RegNum] && |
overlapsDefs(Func, Iter.Cur, Item)) { |
Iter.AllowOverlap = false; |
dumpDisableOverlap(Func, Item, "Active"); |