diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-08-05 23:51:28 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-08-05 23:51:28 +0000 |
commit | 40cf43d39190bcddefc8a8422b02b5a1e6e9d44c (patch) | |
tree | 4eda04136090980b42f695f27bdd65974126d16f /lib | |
parent | 987f88fa7179f4d8f14a1526bba7017a7be6e2ec (diff) | |
download | external_llvm-40cf43d39190bcddefc8a8422b02b5a1e6e9d44c.tar.gz external_llvm-40cf43d39190bcddefc8a8422b02b5a1e6e9d44c.tar.bz2 external_llvm-40cf43d39190bcddefc8a8422b02b5a1e6e9d44c.zip |
Be more aggressive about removing joined physreg copies.
When a joined COPY changes subreg liveness, we keep it around as a KILL,
otherwise it is safe to delete.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110403 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SimpleRegisterCoalescing.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/CodeGen/SimpleRegisterCoalescing.cpp b/lib/CodeGen/SimpleRegisterCoalescing.cpp index ff591832a3..fd6ffcecd1 100644 --- a/lib/CodeGen/SimpleRegisterCoalescing.cpp +++ b/lib/CodeGen/SimpleRegisterCoalescing.cpp @@ -1726,7 +1726,8 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) { bool DoDelete = true; assert(MI->isCopyLike() && "Unrecognized copy instruction"); unsigned SrcReg = MI->getOperand(MI->isSubregToReg() ? 2 : 1).getReg(); - if (TargetRegisterInfo::isPhysicalRegister(SrcReg)) + if (TargetRegisterInfo::isPhysicalRegister(SrcReg) && + MI->getNumOperands() > 2) // Do not delete extract_subreg, insert_subreg of physical // registers unless the definition is dead. e.g. // %DO<def> = INSERT_SUBREG %D0<undef>, %S0<kill>, 1 @@ -1740,9 +1741,15 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) { ShortenDeadCopyLiveRange(li, MI); DoDelete = true; } - if (!DoDelete) + if (!DoDelete) { + // We need the instruction to adjust liveness, so make it a KILL. + if (MI->isSubregToReg()) { + MI->RemoveOperand(3); + MI->RemoveOperand(1); + } + MI->setDesc(tii_->get(TargetOpcode::KILL)); mii = llvm::next(mii); - else { + } else { li_->RemoveMachineInstrFromMaps(MI); mii = mbbi->erase(mii); ++numPeep; |