summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM/subreg-remat.ll
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-09-01 17:18:50 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-09-01 17:18:50 +0000
commit6357fa2f0684781d711d92826f39aeadfccec7f6 (patch)
tree91ca3ae633de1a412a792682178034d1d9c476c5 /llvm/test/CodeGen/ARM/subreg-remat.ll
parent4a69c2e6c59ae69d2409964e40214d617c106db2 (diff)
downloadbcm5719-llvm-6357fa2f0684781d711d92826f39aeadfccec7f6.tar.gz
bcm5719-llvm-6357fa2f0684781d711d92826f39aeadfccec7f6.zip
Prevent remat of partial register redefinitions.
An instruction that redefines only part of a larger register can never be rematerialized since the virtual register value depends on the old value in other parts of the register. This was fixed for the inline spiller in r138794. This patch fixes the problem for all register allocators, and includes a small test case. <rdar://problem/10032939> llvm-svn: 138944
Diffstat (limited to 'llvm/test/CodeGen/ARM/subreg-remat.ll')
-rw-r--r--llvm/test/CodeGen/ARM/subreg-remat.ll28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/subreg-remat.ll b/llvm/test/CodeGen/ARM/subreg-remat.ll
new file mode 100644
index 00000000000..cf45c034514
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/subreg-remat.ll
@@ -0,0 +1,28 @@
+; RUN: llc < %s -relocation-model=pic -disable-fp-elim -mcpu=cortex-a8 -pre-RA-sched=source | FileCheck %s
+target triple = "thumbv7-apple-ios"
+; <rdar://problem/10032939>
+;
+; The vector %v2 is built like this:
+;
+; %vreg6:ssub_1<def> = VMOVSR %vreg0<kill>, pred:14, pred:%noreg, %vreg6<imp-def>; DPR_VFP2:%vreg6 GPR:%vreg0
+; %vreg6:ssub_0<def> = VLDRS <cp#0>, 0, pred:14, pred:%noreg; mem:LD4[ConstantPool] DPR_VFP2:%vreg6
+;
+; When %vreg6 spills, the VLDRS constant pool load cannot be rematerialized
+; since it implicitly reads the ssub_1 sub-register.
+;
+; CHECK: f1
+; CHECK: vmov s1, r0
+; CHECK: vldr.32 s0, LCPI
+; The vector must be spilled:
+; CHECK: vstr.64 d0,
+; CHECK: asm clobber d0
+; And reloaded after the asm:
+; CHECK: vldr.64 [[D16:d[0-9]+]],
+; CHECK: vstr.64 [[D16]], [r1]
+define void @f1(float %x, <2 x float>* %p) {
+ %v1 = insertelement <2 x float> undef, float %x, i32 1
+ %v2 = insertelement <2 x float> %v1, float 0x400921FB60000000, i32 0
+ %y = call double asm sideeffect "asm clobber $0", "=w,0,~{d1},~{d2},~{d3},~{d4},~{d5},~{d6},~{d7},~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15},~{d16},~{d17},~{d18},~{d19},~{d20},~{d21},~{d22},~{d23},~{d24},~{d25},~{d26},~{d27},~{d28},~{d29},~{d30},~{d31}"(<2 x float> %v2) nounwind
+ store <2 x float> %v2, <2 x float>* %p, align 8
+ ret void
+}
OpenPOWER on IntegriCloud