forked from OSchip/llvm-project
Don't kill the base register when expanding strd.
When an strd instruction doesn't get the registers it wants, it can be expanded into two str instructions. Make sure the first str doesn't kill the base register in the case where the base and data registers are identical: t2STRi12 %R0<kill>, %R0, 4, pred:14, pred:%noreg t2STRi12 %R2<kill>, %R0, 8, pred:14, pred:%noreg <rdar://problem/11101911> llvm-svn: 153611
This commit is contained in:
parent
cdee326ab6
commit
b6a7a89289
|
@ -1184,6 +1184,10 @@ bool ARMLoadStoreOpt::FixInvalidRegPairOp(MachineBasicBlock &MBB,
|
|||
EvenDeadKill = false;
|
||||
OddDeadKill = true;
|
||||
}
|
||||
// Never kill the base register in the first instruction.
|
||||
// <rdar://problem/11101911>
|
||||
if (EvenReg == BaseReg)
|
||||
EvenDeadKill = false;
|
||||
InsertLDR_STR(MBB, MBBI, OffImm, isLd, dl, NewOpc,
|
||||
EvenReg, EvenDeadKill, EvenUndef,
|
||||
BaseReg, false, BaseUndef, false, OffUndef,
|
||||
|
|
|
@ -61,3 +61,18 @@ entry:
|
|||
declare <4 x float> @llvm.arm.neon.vld1.v4f32(i8*, i32) nounwind readonly
|
||||
|
||||
declare void @llvm.arm.neon.vst1.v4f32(i8*, <4 x float>, i32) nounwind
|
||||
|
||||
; <rdar://problem/11101911>
|
||||
; When an strd is expanded into two str instructions, make sure the first str
|
||||
; doesn't kill the base register. This can happen if the base register is the
|
||||
; same as the data register.
|
||||
%class = type { i8*, %class*, i32 }
|
||||
define void @f11101911(%class* %this, i32 %num) ssp align 2 {
|
||||
entry:
|
||||
%p1 = getelementptr inbounds %class* %this, i32 0, i32 1
|
||||
%p2 = getelementptr inbounds %class* %this, i32 0, i32 2
|
||||
tail call void asm sideeffect "", "~{r1},~{r3},~{r5},~{r11},~{r13}"() nounwind
|
||||
store %class* %this, %class** %p1, align 4
|
||||
store i32 %num, i32* %p2, align 4
|
||||
ret void
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue