From b0f65e1348cda5b03c5def307c1dc657c6080233 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 27 May 2008 20:40:52 +0000 Subject: [PATCH] Incorporated feedback: Check that the implicitly defined operands aren't used before deleting the instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51609 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TwoAddressInstructionPass.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/CodeGen/TwoAddressInstructionPass.cpp b/lib/CodeGen/TwoAddressInstructionPass.cpp index 5bac6a6822a..145f80ae74b 100644 --- a/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -373,6 +373,8 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) { } if (EnableReMat) { + // Check to see if the instructions that we rematerialized are now dead. If + // they are, expunge them here. SmallPtrSet::iterator I = ReMattedInstrs.begin(); SmallPtrSet::iterator E = ReMattedInstrs.end(); @@ -385,20 +387,17 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) { if (!MO.isRegister()) continue; unsigned MOReg = MO.getReg(); - if (!MOReg) - continue; - if (MO.isDef()) { - if (MO.isImplicit()) - continue; - if (MRI->use_begin(MOReg) != MRI->use_end()) { - InstrDead = false; - break; - } + if (!MOReg || !MO.isDef() || (MO.isImplicit() && MO.isDead())) + continue; + + if (MRI->use_begin(MOReg) != MRI->use_end()) { + InstrDead = false; + break; } } - if (InstrDead && MI->getNumOperands() > 0) + if (InstrDead) MI->eraseFromParent(); } }