summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Reames <listmail@philipreames.com>2018-08-06 21:39:43 +0000
committerPhilip Reames <listmail@philipreames.com>2018-08-06 21:39:43 +0000
commit94b29601ef74d170a4b655839bfdba7c7183e708 (patch)
treeaa47432e78739cb4873a29e845b7813767592e73
parentf8768bfc846cc3e007f096c530f4f5c17f85eb58 (diff)
downloadbcm5719-llvm-94b29601ef74d170a4b655839bfdba7c7183e708.tar.gz
bcm5719-llvm-94b29601ef74d170a4b655839bfdba7c7183e708.zip
[LICM] Further strengthen tests for hoisting guards and invariant.starts [NFC]
llvm-svn: 339062
-rw-r--r--llvm/test/Transforms/LICM/guards.ll62
-rw-r--r--llvm/test/Transforms/LICM/invariant.start.ll49
2 files changed, 110 insertions, 1 deletions
diff --git a/llvm/test/Transforms/LICM/guards.ll b/llvm/test/Transforms/LICM/guards.ll
index 51db1580f7f..78401197def 100644
--- a/llvm/test/Transforms/LICM/guards.ll
+++ b/llvm/test/Transforms/LICM/guards.ll
@@ -20,4 +20,66 @@ loop:
br label %loop
}
+; Can't hoist over a side effect
+define void @test2(i1 %cond, i32* %ptr) {
+; CHECK-LABEL: @test2(
+; CHECK-LABEL: entry:
+; CHECK-LABEL: loop:
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond)
+; CHECK: %val = load i32, i32* %ptr
+
+entry:
+ br label %loop
+
+loop:
+ %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
+ store i32 0, i32* %ptr
+ call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
+ %val = load i32, i32* %ptr
+ %x.inc = add i32 %x, %val
+ br label %loop
+}
+
+; Can't hoist over a side effect
+define void @test2b(i1 %cond, i32* %ptr) {
+; CHECK-LABEL: @test2b(
+; CHECK-LABEL: entry:
+; CHECK-LABEL: loop:
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond)
+; CHECK: %val = load i32, i32* %ptr
+
+entry:
+ br label %loop
+
+loop:
+ %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
+ %p2 = getelementptr i32, i32* %ptr, i32 1
+ store i32 0, i32* %p2
+ call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
+ %val = load i32, i32* %ptr
+ %x.inc = add i32 %x, %val
+ br label %loop
+}
+
+
+; Could hoist, but don't
+define void @test3(i1 %cond, i32* %ptr) {
+; CHECK-LABEL: @test3(
+; CHECK-LABEL: entry:
+; CHECK-LABEL: loop:
+; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond)
+; CHECK: %val = load i32, i32* %ptr
+
+entry:
+ br label %loop
+
+loop:
+ %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
+ call void (i1, ...) @llvm.experimental.guard(i1 %cond) ["deopt" (i32 0)]
+ %val = load i32, i32* %ptr
+ store i32 0, i32* %ptr
+ %x.inc = add i32 %x, %val
+ br label %loop
+}
+
declare void @llvm.experimental.guard(i1, ...)
diff --git a/llvm/test/Transforms/LICM/invariant.start.ll b/llvm/test/Transforms/LICM/invariant.start.ll
index 36082f6b9ee..6c587ac3f2a 100644
--- a/llvm/test/Transforms/LICM/invariant.start.ll
+++ b/llvm/test/Transforms/LICM/invariant.start.ll
@@ -28,7 +28,7 @@ define void @test2(i1 %cond, i32* %ptr) {
; CHECK-LABEL: loop:
; CHECK: call {}* @llvm.invariant.start.p0i32(i64 4, i32* %piv)
; CHECK: %val = load i32, i32* %ptr
-
+
entry:
br label %loop
@@ -62,4 +62,51 @@ loop:
br label %loop
}
+; can't hoist due to init in loop, only well defined if loop exits
+; on first iteration, but we don't bother checking for that currently
+define void @test4(i1 %cond, i32* %ptr) {
+; CHECK-LABEL: @test4(
+; CHECK-LABEL: entry:
+; CHECK-LABEL: loop:
+; CHECK: store i32 0, i32* %ptr
+; CHECK: call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
+; CHECK: %val = load i32, i32* %ptr
+
+entry:
+ br label %loop
+
+loop:
+ %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
+ store i32 0, i32* %ptr
+ call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
+ %val = load i32, i32* %ptr
+ %x.inc = add i32 %x, %val
+ br label %loop
+}
+
+; don't try to reason about scopes
+define void @test5(i1 %cond, i32* %ptr) {
+; CHECK-LABEL: @test5(
+; CHECK-LABEL: entry:
+; CHECK-LABEL: loop:
+; CHECK: store i32 0, i32* %ptr
+; CHECK: call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
+; CHECK: %val = load i32, i32* %ptr
+
+entry:
+ br label %loop
+
+loop:
+ %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
+ store i32 0, i32* %ptr
+ %scope = call {}* @llvm.invariant.start.p0i32(i64 4, i32* %ptr)
+ %val = load i32, i32* %ptr
+;; NOTE: despite being correct syntax, uncommenting this line causes
+;; a crash in the optimizer. FIXME
+;; call void @llvm.invariant.end.p0i32({}* %scope, i64 4, i32* %ptr)
+ %x.inc = add i32 %x, %val
+ br label %loop
+}
+
declare {}* @llvm.invariant.start.p0i32(i64, i32*)
+declare void @llvm.invariant.end.p0i32({}*, i64, i32*)
OpenPOWER on IntegriCloud