mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-24 06:30:19 +00:00
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
This commit is contained in:
parent
16717a7c56
commit
6e3f7e4913
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user