From 054dbb8e8230ae1a7f1f386b6bf307a36af7dd20 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Thu, 13 May 2010 00:00:35 +0000 Subject: [PATCH] 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 --- lib/CodeGen/TwoAddressInstructionPass.cpp | 27 +++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/TwoAddressInstructionPass.cpp b/lib/CodeGen/TwoAddressInstructionPass.cpp index bd24bab13e7..9f00311fb44 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 = + // ... + // BB1: + // ... = reg1051:10 + // BB2: + // reg1051:9 = + // 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); + } } }