forked from OSchip/llvm-project
Determine whether a spill kills the register it's spilling before insertion rather than trying to undo the kill marker afterwards.
llvm-svn: 46953
This commit is contained in:
parent
887f5ebfa9
commit
ad4d57a2f5
|
@ -303,17 +303,12 @@ void RALocal::spillVirtReg(MachineBasicBlock &MBB,
|
|||
const TargetRegisterClass *RC = MF->getRegInfo().getRegClass(VirtReg);
|
||||
int FrameIndex = getStackSpaceFor(VirtReg, RC);
|
||||
DOUT << " to stack slot #" << FrameIndex;
|
||||
TII->storeRegToStackSlot(MBB, I, PhysReg, true, FrameIndex, RC);
|
||||
|
||||
// If the instruction reads the register that's spilled, (e.g. this can
|
||||
// happen if it is a move to a physical register), then the spill
|
||||
// instruction is not a kill.
|
||||
if (I != MBB.end() && I->findRegisterUseOperandIdx(PhysReg) != -1) {
|
||||
MachineBasicBlock::iterator StoreMI = prior(I);
|
||||
int Idx = StoreMI->findRegisterUseOperandIdx(PhysReg, true);
|
||||
assert(Idx != -1 && "Unrecognized spill instruction!");
|
||||
StoreMI->getOperand(Idx).setIsKill(false);
|
||||
}
|
||||
bool isKill = !(I != MBB.end() &&
|
||||
I->findRegisterUseOperandIdx(PhysReg) != -1);
|
||||
TII->storeRegToStackSlot(MBB, I, PhysReg, isKill, FrameIndex, RC);
|
||||
++NumStores; // Update statistics
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
; RUN: llvm-as < %s | llc -mtriple=powerpc-apple-darwin -regalloc=local
|
||||
|
||||
define i32 @bork(i64 %foo, i64 %bar) {
|
||||
entry:
|
||||
%tmp = load i64* null, align 8 ; <i64> [#uses=2]
|
||||
%tmp2 = icmp ule i64 %tmp, 0 ; <i1> [#uses=1]
|
||||
%min = select i1 %tmp2, i64 %tmp, i64 0 ; <i64> [#uses=1]
|
||||
store i64 %min, i64* null, align 8
|
||||
ret i32 0
|
||||
}
|
Loading…
Reference in New Issue