summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorPhilip Reames <listmail@philipreames.com>2016-04-21 16:51:08 +0000
committerPhilip Reames <listmail@philipreames.com>2016-04-21 16:51:08 +0000
commit92c43699bcc4a749c6c434e4fc56dc348d39d334 (patch)
tree4fa24c11b7f1d2d5d0117f5a0edaa0da9b96a769 /llvm/test/Transforms
parent99bc480bc31b39c98a5192b2b9b145a692ad1207 (diff)
downloadbcm5719-llvm-92c43699bcc4a749c6c434e4fc56dc348d39d334.tar.gz
bcm5719-llvm-92c43699bcc4a749c6c434e4fc56dc348d39d334.zip
[unordered] Add tests and conservative handling in support of future changes [NFCI]
This change adds a couple of test cases to make sure FindAvailableLoadedValue does the right thing. At the moment, the code added is dead, but separating it makes follow on changes far more obvious. llvm-svn: 266999
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/atomic.ll48
1 files changed, 47 insertions, 1 deletions
diff --git a/llvm/test/Transforms/InstCombine/atomic.ll b/llvm/test/Transforms/InstCombine/atomic.ll
index 5754a5a4ba5..bf576ba4b3a 100644
--- a/llvm/test/Transforms/InstCombine/atomic.ll
+++ b/llvm/test/Transforms/InstCombine/atomic.ll
@@ -5,12 +5,58 @@ target triple = "x86_64-apple-macosx10.7.0"
; Check transforms involving atomic operations
+define i32 @test1(i32* %p) {
+; CHECK-LABEL: define i32 @test1(
+; CHECK: %x = load atomic i32, i32* %p seq_cst, align 4
+; CHECK: shl i32 %x, 1
+ %x = load atomic i32, i32* %p seq_cst, align 4
+ %y = load i32, i32* %p, align 4
+ %z = add i32 %x, %y
+ ret i32 %z
+}
+
define i32 @test2(i32* %p) {
; CHECK-LABEL: define i32 @test2(
+; CHECK: %x = load volatile i32, i32* %p, align 4
+; CHECK: %y = load volatile i32, i32* %p, align 4
+ %x = load volatile i32, i32* %p, align 4
+ %y = load volatile i32, i32* %p, align 4
+ %z = add i32 %x, %y
+ ret i32 %z
+}
+
+; The exact semantics of mixing volatile and non-volatile on the same
+; memory location are a bit unclear, but conservatively, we know we don't
+; want to remove the volatile.
+define i32 @test3(i32* %p) {
+; CHECK-LABEL: define i32 @test3(
+; CHECK: %x = load volatile i32, i32* %p, align 4
+ %x = load volatile i32, i32* %p, align 4
+ %y = load i32, i32* %p, align 4
+ %z = add i32 %x, %y
+ ret i32 %z
+}
+
+; FIXME: Forwarding from a stronger atomic is fine
+define i32 @test4(i32* %p) {
+; CHECK-LABEL: define i32 @test4(
; CHECK: %x = load atomic i32, i32* %p seq_cst, align 4
-; CHECK: shl i32 %x, 1
+; CHECK: %y = load atomic i32, i32* %p unordered, align 4
%x = load atomic i32, i32* %p seq_cst, align 4
+ %y = load atomic i32, i32* %p unordered, align 4
+ %z = add i32 %x, %y
+ ret i32 %z
+}
+
+; Forwarding from a non-atomic is not. (The earlier load
+; could in priciple be promoted to atomic and then forwarded,
+; but we can't just drop the atomic from the load.)
+define i32 @test5(i32* %p) {
+; CHECK-LABEL: define i32 @test5(
+; CHECK: %x = load atomic i32, i32* %p unordered, align 4
+ %x = load atomic i32, i32* %p unordered, align 4
%y = load i32, i32* %p, align 4
%z = add i32 %x, %y
ret i32 %z
}
+
OpenPOWER on IntegriCloud