summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2010-05-13 00:00:35 +0000
committerEvan Cheng <evan.cheng@apple.com>2010-05-13 00:00:35 +0000
commit054dbb8e8230ae1a7f1f386b6bf307a36af7dd20 (patch)
tree1a7718668fd51437bf8fbaba58b2c315785d7bf6 /lib
parentde7dea2e44ea59674acb5680482cd516c6fce3bb (diff)
downloadllvm-054dbb8e8230ae1a7f1f386b6bf307a36af7dd20.tar.gz
llvm-054dbb8e8230ae1a7f1f386b6bf307a36af7dd20.tar.bz2
llvm-054dbb8e8230ae1a7f1f386b6bf307a36af7dd20.tar.xz
If REG_SEQUENCE source is livein, copy it first. Also, update livevariables information when a copy is introduced.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103680 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/TwoAddressInstructionPass.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/CodeGen/TwoAddressInstructionPass.cpp b/lib/CodeGen/TwoAddressInstructionPass.cpp
index bd24bab13e..9f00311fb4 100644
--- a/lib/CodeGen/TwoAddressInstructionPass.cpp
+++ b/lib/CodeGen/TwoAddressInstructionPass.cpp
@@ -1175,17 +1175,36 @@ bool TwoAddressInstructionPass::EliminateRegSequences() {
llvm_unreachable(0);
}
- if (!Seen.insert(SrcReg)) {
- // REG_SEQUENCE cannot have duplicated operands. Add a copy.
+ MachineInstr *DefMI = MRI->getVRegDef(SrcReg);
+ if (!Seen.insert(SrcReg) || MI->getParent() != DefMI->getParent()) {
+ // REG_SEQUENCE cannot have duplicated operands, add a copy.
+ // Also add an copy if the source if live-in the block. We don't want
+ // to end up with a partial-redef of a livein, e.g.
+ // BB0:
+ // reg1051:10<def> =
+ // ...
+ // BB1:
+ // ... = reg1051:10
+ // BB2:
+ // reg1051:9<def> =
+ // LiveIntervalAnalysis won't like it.
const TargetRegisterClass *RC = MRI->getRegClass(SrcReg);
unsigned NewReg = MRI->createVirtualRegister(RC);
+ MachineBasicBlock::iterator InsertLoc = MI;
bool Emitted =
- TII->copyRegToReg(*MI->getParent(), MI, NewReg, SrcReg, RC, RC,
+ TII->copyRegToReg(*MI->getParent(), InsertLoc, NewReg, SrcReg, RC, RC,
MI->getDebugLoc());
(void)Emitted;
assert(Emitted && "Unable to issue a copy instruction!\n");
MI->getOperand(i).setReg(NewReg);
- MI->getOperand(i).setIsKill();
+ if (MI->getOperand(i).isKill()) {
+ MachineBasicBlock::iterator CopyMI = prior(InsertLoc);
+ MachineOperand *KillMO = CopyMI->findRegisterUseOperand(SrcReg);
+ KillMO->setIsKill();
+ if (LV)
+ // Update live variables
+ LV->replaceKillInstruction(SrcReg, MI, &*CopyMI);
+ }
}
}