diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-05-13 00:00:35 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-05-13 00:00:35 +0000 |
commit | 054dbb8e8230ae1a7f1f386b6bf307a36af7dd20 (patch) | |
tree | 1a7718668fd51437bf8fbaba58b2c315785d7bf6 | |
parent | de7dea2e44ea59674acb5680482cd516c6fce3bb (diff) | |
download | external_llvm-054dbb8e8230ae1a7f1f386b6bf307a36af7dd20.zip external_llvm-054dbb8e8230ae1a7f1f386b6bf307a36af7dd20.tar.gz external_llvm-054dbb8e8230ae1a7f1f386b6bf307a36af7dd20.tar.bz2 |
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
-rw-r--r-- | lib/CodeGen/TwoAddressInstructionPass.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/CodeGen/TwoAddressInstructionPass.cpp b/lib/CodeGen/TwoAddressInstructionPass.cpp index bd24bab..9f00311 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); + } } } |