diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-03-25 02:02:19 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-03-25 02:02:19 +0000 |
commit | a2fb634defce316ec972aa6f3ca3a941b4656f5e (patch) | |
tree | 6d48a84f82e76ea831e1a5f21a98a16d60b8c838 /lib/CodeGen | |
parent | d804f8ff70e335c56aa6bc698f4c43cc00b6830c (diff) | |
download | external_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.cpp | 21 |
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; } |