mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
Determine whether a spill kills the register it's spilling before insertion rather than trying to undo the kill marker afterwards.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46953 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
786cb7e446
commit
431bfcbe37
@ -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
|
||||
}
|
||||
|
||||
|
10
test/CodeGen/PowerPC/2008-02-09-LocalRegAllocAssert.ll
Normal file
10
test/CodeGen/PowerPC/2008-02-09-LocalRegAllocAssert.ll
Normal file
@ -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
Block a user