mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
TwoAddressInstructionPass::CoalesceExtSubRegs can insert INSERT_SUBREG
instructions, but it doesn't really understand live ranges, so the first INSERT_SUBREG uses an implicitly defined register. Fix it in LiveVariableAnalysis by adding the <undef> flag. llvm-svn: 106333
This commit is contained in:
parent
aa0ff1ae01
commit
3f0825f966
@ -329,9 +329,16 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock *mbb,
|
||||
MachineInstr *CopyMI = NULL;
|
||||
unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
|
||||
if (mi->isExtractSubreg() || mi->isInsertSubreg() || mi->isSubregToReg() ||
|
||||
tii_->isMoveInstr(*mi, SrcReg, DstReg, SrcSubReg, DstSubReg))
|
||||
tii_->isMoveInstr(*mi, SrcReg, DstReg, SrcSubReg, DstSubReg)) {
|
||||
CopyMI = mi;
|
||||
|
||||
// Some of the REG_SEQUENCE lowering in TwoAddressInstrPass creates
|
||||
// implicit defs without really knowing. It shows up as INSERT_SUBREG
|
||||
// using an undefined register.
|
||||
if (mi->isInsertSubreg())
|
||||
mi->getOperand(1).setIsUndef();
|
||||
}
|
||||
|
||||
VNInfo *ValNo = interval.getNextValue(defIndex, CopyMI, true,
|
||||
VNInfoAllocator);
|
||||
assert(ValNo->id == 0 && "First value in interval is not 0?");
|
||||
|
@ -19,3 +19,31 @@ entry:
|
||||
}
|
||||
|
||||
declare void @llvm.arm.neon.vst4.v4i32(i8*, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) nounwind
|
||||
|
||||
@sbuf = common global [16 x i32] zeroinitializer, align 16 ; <[16 x i32]*> [#uses=5]
|
||||
@dbuf = common global [16 x i32] zeroinitializer ; <[16 x i32]*> [#uses=2]
|
||||
|
||||
; This function creates 4 chained INSERT_SUBREGS and then invokes the register scavenger.
|
||||
; The first INSERT_SUBREG needs an <undef> use operand for that to work.
|
||||
define arm_apcscc i32 @main() nounwind {
|
||||
bb.nph:
|
||||
br label %bb
|
||||
|
||||
bb: ; preds = %bb, %bb.nph
|
||||
%0 = phi i32 [ 0, %bb.nph ], [ %1, %bb ] ; <i32> [#uses=4]
|
||||
%scevgep = getelementptr [16 x i32]* @sbuf, i32 0, i32 %0 ; <i32*> [#uses=1]
|
||||
%scevgep5 = getelementptr [16 x i32]* @dbuf, i32 0, i32 %0 ; <i32*> [#uses=1]
|
||||
store i32 %0, i32* %scevgep, align 4
|
||||
store i32 -1, i32* %scevgep5, align 4
|
||||
%1 = add nsw i32 %0, 1 ; <i32> [#uses=2]
|
||||
%exitcond = icmp eq i32 %1, 16 ; <i1> [#uses=1]
|
||||
br i1 %exitcond, label %bb2, label %bb
|
||||
|
||||
bb2: ; preds = %bb
|
||||
%2 = load <4 x i32>* bitcast ([16 x i32]* @sbuf to <4 x i32>*), align 16 ; <<4 x i32>> [#uses=1]
|
||||
%3 = load <4 x i32>* bitcast (i32* getelementptr inbounds ([16 x i32]* @sbuf, i32 0, i32 4) to <4 x i32>*), align 16 ; <<4 x i32>> [#uses=1]
|
||||
%4 = load <4 x i32>* bitcast (i32* getelementptr inbounds ([16 x i32]* @sbuf, i32 0, i32 8) to <4 x i32>*), align 16 ; <<4 x i32>> [#uses=1]
|
||||
%5 = load <4 x i32>* bitcast (i32* getelementptr inbounds ([16 x i32]* @sbuf, i32 0, i32 12) to <4 x i32>*), align 16 ; <<4 x i32>> [#uses=1]
|
||||
tail call void @llvm.arm.neon.vst4.v4i32(i8* bitcast ([16 x i32]* @dbuf to i8*), <4 x i32> %2, <4 x i32> %3, <4 x i32> %4, <4 x i32> %5) nounwind
|
||||
ret i32 0
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user