diff options
author | Lang Hames <lhames@gmail.com> | 2012-02-03 01:13:49 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2012-02-03 01:13:49 +0000 |
commit | 6e3f7e4913b17d7f8e3d81d61aa9e133f97e1ccd (patch) | |
tree | 7b9850e6b567a15a5e767d67bc0b34badddc9830 | |
parent | 16717a7c562d05915c1b30792eef24de5b264cc6 (diff) | |
download | external_llvm-6e3f7e4913b17d7f8e3d81d61aa9e133f97e1ccd.tar.gz external_llvm-6e3f7e4913b17d7f8e3d81d61aa9e133f97e1ccd.tar.bz2 external_llvm-6e3f7e4913b17d7f8e3d81d61aa9e133f97e1ccd.zip |
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
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 05c0ebd5ca..fb3b5c8c4b 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. |