aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-03-25 02:02:19 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-03-25 02:02:19 +0000
commita2fb634defce316ec972aa6f3ca3a941b4656f5e (patch)
tree6d48a84f82e76ea831e1a5f21a98a16d60b8c838 /lib/CodeGen
parentd804f8ff70e335c56aa6bc698f4c43cc00b6830c (diff)
downloadexternal_llvm-a2fb634defce316ec972aa6f3ca3a941b4656f5e.zip
external_llvm-a2fb634defce316ec972aa6f3ca3a941b4656f5e.tar.gz
external_llvm-a2fb634defce316ec972aa6f3ca3a941b4656f5e.tar.bz2
lastRegisterUse() should ignore identity copies. Those will be erased.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48759 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/SimpleRegisterCoalescing.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp
index 6f5b523..870fcc4 100644
--- a/lib/CodeGen/SimpleRegisterCoalescing.cpp
+++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp
@@ -1541,6 +1541,10 @@ SimpleRegisterCoalescing::lastRegisterUse(unsigned Start, unsigned End,
E = mri_->use_end(); I != E; ++I) {
MachineOperand &Use = I.getOperand();
MachineInstr *UseMI = Use.getParent();
+ unsigned SrcReg, DstReg;
+ if (tii_->isMoveInstr(*UseMI, SrcReg, DstReg) && SrcReg == DstReg)
+ // Ignore identity copies.
+ continue;
unsigned Idx = li_->getInstructionIndex(UseMI);
if (Idx >= Start && Idx < End && Idx >= UseIdx) {
LastUse = &Use;
@@ -1562,14 +1566,17 @@ SimpleRegisterCoalescing::lastRegisterUse(unsigned Start, unsigned End,
if (e < s || MI == NULL)
return NULL;
- for (unsigned i = 0, NumOps = MI->getNumOperands(); i != NumOps; ++i) {
- MachineOperand &Use = MI->getOperand(i);
- if (Use.isRegister() && Use.isUse() && Use.getReg() &&
- tri_->regsOverlap(Use.getReg(), Reg)) {
- UseIdx = e;
- return &Use;
+ // Ignore identity copies.
+ unsigned SrcReg, DstReg;
+ if (!(tii_->isMoveInstr(*MI, SrcReg, DstReg) && SrcReg == DstReg))
+ for (unsigned i = 0, NumOps = MI->getNumOperands(); i != NumOps; ++i) {
+ MachineOperand &Use = MI->getOperand(i);
+ if (Use.isRegister() && Use.isUse() && Use.getReg() &&
+ tri_->regsOverlap(Use.getReg(), Reg)) {
+ UseIdx = e;
+ return &Use;
+ }
}
- }
e -= InstrSlots::NUM;
}