summaryrefslogtreecommitdiff
path: root/test/CodeGen/ARM
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2013-04-04 18:25:36 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2013-04-04 18:25:36 +0000
commitee27cac9fac622d3198d4a53130f04653ad09d37 (patch)
tree7777dc92a31f1b687a9d603eb3a7820b3626af27 /test/CodeGen/ARM
parent5622eaeffef44dd09a1dd061299d6c02d9ad4099 (diff)
downloadllvm-ee27cac9fac622d3198d4a53130f04653ad09d37.tar.gz
llvm-ee27cac9fac622d3198d4a53130f04653ad09d37.tar.bz2
llvm-ee27cac9fac622d3198d4a53130f04653ad09d37.tar.xz
Avoid high-latency false CPSR dependencies even for tMOVSi.
The Thumb2SizeReduction pass avoids false CPSR dependencies, except it still aggressively creates tMOVi8 instructions because they are so common. Avoid creating false CPSR dependencies even for tMOVi8 instructions when the the CPSR flags are known to have high latency. This allows integer computation to overlap floating point computations. Also process blocks in a reverse post-order and propagate high-latency flags to successors. <rdar://problem/13468102> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178773 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/ARM')
-rw-r--r--test/CodeGen/ARM/avoid-cpsr-rmw.ll31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/CodeGen/ARM/avoid-cpsr-rmw.ll b/test/CodeGen/ARM/avoid-cpsr-rmw.ll
index d98925ef8f..c5d00a0f8a 100644
--- a/test/CodeGen/ARM/avoid-cpsr-rmw.ll
+++ b/test/CodeGen/ARM/avoid-cpsr-rmw.ll
@@ -83,3 +83,34 @@ while.body:
while.end:
ret void
}
+
+; Avoid producing tMOVi8 after a high-latency flag-setting operation.
+; <rdar://problem/13468102>
+define void @t4(i32* nocapture %p, double* nocapture %q) {
+entry:
+; CHECK: t4
+; CHECK: vmrs APSR_nzcv, fpscr
+; CHECK: if.then
+; CHECK-NOT movs
+ %0 = load double* %q, align 4
+ %cmp = fcmp olt double %0, 1.000000e+01
+ %incdec.ptr1 = getelementptr inbounds i32* %p, i32 1
+ br i1 %cmp, label %if.then, label %if.else
+
+if.then:
+ store i32 7, i32* %p, align 4
+ %incdec.ptr2 = getelementptr inbounds i32* %p, i32 2
+ store i32 8, i32* %incdec.ptr1, align 4
+ store i32 9, i32* %incdec.ptr2, align 4
+ br label %if.end
+
+if.else:
+ store i32 3, i32* %p, align 4
+ %incdec.ptr5 = getelementptr inbounds i32* %p, i32 2
+ store i32 5, i32* %incdec.ptr1, align 4
+ store i32 6, i32* %incdec.ptr5, align 4
+ br label %if.end
+
+if.end:
+ ret void
+}