aboutsummaryrefslogtreecommitdiff
path: root/test/Transforms/JumpThreading
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2016-01-13 19:58:01 +0000
committerDimitry Andric <dim@FreeBSD.org>2016-01-13 19:58:01 +0000
commit050e163ae8b4bb6eb252b59e2f8f36e68ae9239d (patch)
tree7376a0c71aad05d327e5b1dcbceb3311a10f9f29 /test/Transforms/JumpThreading
parent8a6c1c25bce0267ee4072bd7b786b921e8a66a35 (diff)
Notes
Diffstat (limited to 'test/Transforms/JumpThreading')
-rw-r--r--test/Transforms/JumpThreading/pr26096.ll68
-rw-r--r--test/Transforms/JumpThreading/select.ll37
2 files changed, 105 insertions, 0 deletions
diff --git a/test/Transforms/JumpThreading/pr26096.ll b/test/Transforms/JumpThreading/pr26096.ll
new file mode 100644
index 000000000000..2671e82b6177
--- /dev/null
+++ b/test/Transforms/JumpThreading/pr26096.ll
@@ -0,0 +1,68 @@
+; RUN: opt -prune-eh -inline -jump-threading -S < %s | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@d = external global i32*, align 8
+
+define void @fn3(i1 %B) {
+entry:
+ br i1 %B, label %if.end, label %if.then
+
+if.then: ; preds = %entry
+ call void @fn2()
+ ret void
+
+if.end: ; preds = %entry
+ call void @fn2()
+ ret void
+}
+
+define internal void @fn2() unnamed_addr {
+entry:
+ call void @fn1()
+ call void @fn1()
+ call void @fn1()
+ unreachable
+}
+
+; CHECK-LABEL: define internal void @fn2(
+; CHECK: %[[LOAD:.*]] = load i32*, i32** @d, align 8
+; CHECK: %tobool1.i = icmp eq i32* %[[LOAD]], null
+
+define internal void @fn1() unnamed_addr {
+entry:
+ br label %for.body
+
+for.body: ; preds = %entry
+ %0 = load i32*, i32** @d, align 8
+ %tobool1 = icmp eq i32* %0, null
+ br i1 %tobool1, label %cond.false, label %cond.end
+
+cond.false: ; preds = %for.body
+ call void @__assert_fail(i8* null)
+ unreachable
+
+cond.end: ; preds = %for.body
+ %1 = load i32*, i32** @d, align 8
+ %cmp = icmp eq i32* %1, null
+ br i1 %cmp, label %cond.end4, label %cond.false3
+
+cond.false3: ; preds = %cond.end
+ call void @__assert_fail(i8* null)
+ unreachable
+
+cond.end4: ; preds = %cond.end
+ call void @__assert_fail(i8* null)
+ unreachable
+
+for.end: ; No predecessors!
+ ret void
+}
+
+declare void @__assert_fail(i8*)
+
+; Function Attrs: noreturn nounwind
+declare void @llvm.trap() #0
+
+attributes #0 = { noreturn nounwind }
diff --git a/test/Transforms/JumpThreading/select.ll b/test/Transforms/JumpThreading/select.ll
index 595cacbcbf54..6a3cf7edd7dc 100644
--- a/test/Transforms/JumpThreading/select.ll
+++ b/test/Transforms/JumpThreading/select.ll
@@ -250,3 +250,40 @@ if.end: ; preds = %if.then, %cond.end4
; CHECK: br i1 %cmp6, label %if.then, label %if.end
; CHECK: br label %if.end
}
+
+
+define i32 @unfold3(i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z, i32 %j) nounwind {
+entry:
+ %add3 = add nsw i32 %j, 2
+ %cmp.i = icmp slt i32 %u, %v
+ br i1 %cmp.i, label %.exit, label %cond.false.i
+
+cond.false.i: ; preds = %entry
+ %cmp4.i = icmp sgt i32 %u, %v
+ br i1 %cmp4.i, label %.exit, label %cond.false.6.i
+
+cond.false.6.i: ; preds = %cond.false.i
+ %cmp8.i = icmp slt i32 %w, %x
+ br i1 %cmp8.i, label %.exit, label %cond.false.10.i
+
+cond.false.10.i: ; preds = %cond.false.6.i
+ %cmp13.i = icmp sgt i32 %w, %x
+ br i1 %cmp13.i, label %.exit, label %cond.false.15.i
+
+cond.false.15.i: ; preds = %cond.false.10.i
+ %phitmp = icmp sge i32 %y, %z
+ br label %.exit
+
+.exit: ; preds = %entry, %cond.false.i, %cond.false.6.i, %cond.false.10.i, %cond.false.15.i
+ %cond23.i = phi i1 [ false, %entry ], [ true, %cond.false.i ], [ false, %cond.false.6.i ], [ %phitmp, %cond.false.15.i ], [ true, %cond.false.10.i ]
+ %j.add3 = select i1 %cond23.i, i32 %j, i32 %add3
+ ret i32 %j.add3
+
+; CHECK-LABEL: @unfold3
+; CHECK: br i1 %cmp.i, label %.exit.thread2, label %cond.false.i
+; CHECK: br i1 %cmp4.i, label %.exit.thread, label %cond.false.6.i
+; CHECK: br i1 %cmp8.i, label %.exit.thread2, label %cond.false.10.i
+; CHECK: br i1 %cmp13.i, label %.exit.thread, label %.exit
+; CHECK: br i1 %phitmp, label %.exit.thread, label %.exit.thread2
+; CHECK: br label %.exit.thread2
+}