diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-08-04 21:30:30 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2009-08-04 21:30:30 +0000 |
| commit | 0e0b5405f5f42d4ab080c8f102dfea8c89c37975 (patch) | |
| tree | 4ed8ac3009a305f72f473aab8b39e3cd9b1fb6cd /llvm/lib/CodeGen | |
| parent | 86cdcdc3d2f2152459273c6787dd732d5afbfd37 (diff) | |
| download | bcm5719-llvm-0e0b5405f5f42d4ab080c8f102dfea8c89c37975.tar.gz bcm5719-llvm-0e0b5405f5f42d4ab080c8f102dfea8c89c37975.zip | |
Clean up the handling of two-address operands in RegScavenger.
This fixes PR4528.
llvm-svn: 78107
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/RegisterScavenging.cpp | 15 |
1 files changed, 3 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp index 1cd7e089ce0..97751cd9fc8 100644 --- a/llvm/lib/CodeGen/RegisterScavenging.cpp +++ b/llvm/lib/CodeGen/RegisterScavenging.cpp @@ -224,11 +224,13 @@ void RegScavenger::forward() { BitVector KillRegs(NumPhysRegs); for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) { const MachineOperand MO = *UseMOs[i].first; + unsigned Idx = UseMOs[i].second; unsigned Reg = MO.getReg(); assert(isUsed(Reg) && "Using an undefined register!"); - if (MO.isKill() && !isReserved(Reg)) { + // Two-address operands implicitly kill. + if ((MO.isKill() || MI->isRegTiedToDefOperand(Idx)) && !isReserved(Reg)) { KillRegs.set(Reg); // Mark sub-registers as used. @@ -251,8 +253,6 @@ void RegScavenger::forward() { for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) { const MachineOperand &MO = (i < NumECs) ? *EarlyClobberMOs[i].first : *DefMOs[i-NumECs].first; - unsigned Idx = (i < NumECs) - ? EarlyClobberMOs[i].second : DefMOs[i-NumECs].second; unsigned Reg = MO.getReg(); if (MO.isUndef()) continue; @@ -263,15 +263,6 @@ void RegScavenger::forward() { continue; } - // Skip two-address destination operand. - unsigned UseIdx; - if (MI->isRegTiedToUseOperand(Idx, &UseIdx) && - !MI->getOperand(UseIdx).isUndef()) { - assert(!MI->getOperand(UseIdx).isKill() && - "Using an undefined register!"); - continue; - } - // Skip if this is merely redefining part of a super-register. if (RedefinesSuperRegPart(MI, MO, TRI)) continue; |

