From 6e3f7e4913b17d7f8e3d81d61aa9e133f97e1ccd Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Fri, 3 Feb 2012 01:13:49 +0000 Subject: [PATCH] Incorporate suggestions Chad, Jakob and Evan's suggestions on r149957. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149655 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 55 ++++++++++++++++++------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 05c0ebd5ca1..fb3b5c8c4b5 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -12052,28 +12052,39 @@ X86TargetLowering::EmitVAStartSaveXMMRegsWithCustomInserter( return EndMBB; } -// Check whether the given instruction should have had a kill marker on -// the EFLAGS operand. -static bool shouldHaveEFlagsKill(MachineBasicBlock::iterator SelectItr, - MachineBasicBlock* BB) { - for (MachineBasicBlock::iterator miI(llvm::next(SelectItr)), miE = BB->end(); - miI != miE; ++miI) { +// The EFLAGS operand of SelectItr might be missing a kill marker +// because there were multiple uses of EFLAGS, and ISel didn't know +// which to mark. Figure out whether SelectItr should have had a +// kill marker, and set it if it should. Returns the correct kill +// marker value. +static bool checkAndUpdateEFLAGSKill(MachineBasicBlock::iterator SelectItr, + MachineBasicBlock* BB, + const TargetRegisterInfo* TRI) { + // Scan forward through BB for a use/def of EFLAGS. + MachineBasicBlock::iterator miI(llvm::next(SelectItr)); + for (MachineBasicBlock::iterator miE = BB->end(); miI != miE; ++miI) { const MachineInstr& mi = *miI; - if (mi.readsRegister(X86::EFLAGS)) { + if (mi.readsRegister(X86::EFLAGS)) return false; - } - if (mi.definesRegister(X86::EFLAGS)) { - // Should have kill-flag - update below. - break; + if (mi.definesRegister(X86::EFLAGS)) + break; // Should have kill-flag - update below. + } + + // If we hit the end of the block, check whether EFLAGS is live into a + // successor. + if (miI == BB->end()) { + for (MachineBasicBlock::succ_iterator sItr = BB->succ_begin(), + sEnd = BB->succ_end(); + sItr != sEnd; ++sItr) { + MachineBasicBlock* succ = *sItr; + if (succ->isLiveIn(X86::EFLAGS)) + return false; } } - // We found a def, or hit the end of the basic block. SelectMI should have a - // kill flag on EFLAGS. - MachineInstr& SelectMI = *SelectItr; - MachineOperand* EFlagsOp = SelectMI.findRegisterUseOperand(X86::EFLAGS); - assert(EFlagsOp != 0 && "No EFLAGS operand on select instruction?"); - EFlagsOp->setIsKill(); + // We found a def, or hit the end of the basic block and EFLAGS wasn't live + // out. SelectMI should have a kill flag on EFLAGS. + SelectItr->addRegisterKilled(X86::EFLAGS, TRI); return true; } @@ -12106,11 +12117,11 @@ X86TargetLowering::EmitLoweredSelect(MachineInstr *MI, // If the EFLAGS register isn't dead in the terminator, then claim that it's // live into the sink and copy blocks. - if (!MI->killsRegister(X86::EFLAGS)) { - if (!shouldHaveEFlagsKill(MI, BB)) { - copy0MBB->addLiveIn(X86::EFLAGS); - sinkMBB->addLiveIn(X86::EFLAGS); - } + const TargetRegisterInfo* TRI = getTargetMachine().getRegisterInfo(); + if (!MI->killsRegister(X86::EFLAGS) && + !checkAndUpdateEFLAGSKill(MI, BB, TRI)) { + copy0MBB->addLiveIn(X86::EFLAGS); + sinkMBB->addLiveIn(X86::EFLAGS); } // Transfer the remainder of BB and its successor edges to sinkMBB.