[JumpThreading] Split select that has constant conditions coming from the PHI node
[oota-llvm.git] / test / Transforms / JumpThreading / implied-cond.ll
1 ; RUN: opt -jump-threading -S < %s | FileCheck %s
2
3 declare void @side_effect(i32)
4
5 define void @test0(i32 %i, i32 %len) {
6 ; CHECK-LABEL: @test0(
7  entry:
8   call void @side_effect(i32 0)
9   %i.inc = add nuw i32 %i, 1
10   %c0 = icmp ult i32 %i.inc, %len
11   br i1 %c0, label %left, label %right
12
13  left:
14 ; CHECK: entry:
15 ; CHECK: br i1 %c0, label %left0, label %right
16
17 ; CHECK: left0:
18 ; CHECK: call void @side_effect
19 ; CHECK-NOT: br i1 %c1
20 ; CHECK: call void @side_effect
21   call void @side_effect(i32 0)
22   %c1 = icmp ult i32 %i, %len
23   br i1 %c1, label %left0, label %right
24
25  left0:
26   call void @side_effect(i32 0)
27   ret void
28
29  right:
30   %t = phi i32 [ 1, %left ], [ 2, %entry ]
31   call void @side_effect(i32 %t)
32   ret void
33 }
34
35 define void @test1(i32 %i, i32 %len) {
36 ; CHECK-LABEL: @test1(
37  entry:
38   call void @side_effect(i32 0)
39   %i.inc = add nsw i32 %i, 1
40   %c0 = icmp slt i32 %i.inc, %len
41   br i1 %c0, label %left, label %right
42
43  left:
44 ; CHECK: entry:
45 ; CHECK: br i1 %c0, label %left0, label %right
46
47 ; CHECK: left0:
48 ; CHECK: call void @side_effect
49 ; CHECK-NOT: br i1 %c1
50 ; CHECK: call void @side_effect
51   call void @side_effect(i32 0)
52   %c1 = icmp slt i32 %i, %len
53   br i1 %c1, label %left0, label %right
54
55  left0:
56   call void @side_effect(i32 0)
57   ret void
58
59  right:
60   %t = phi i32 [ 1, %left ], [ 2, %entry ]
61   call void @side_effect(i32 %t)
62   ret void
63 }
64
65 define void @test2(i32 %i, i32 %len, i1* %c.ptr) {
66 ; CHECK-LABEL: @test2(
67
68 ; CHECK: entry:
69 ; CHECK: br i1 %c0, label %cont, label %right
70 ; CHECK: cont:
71 ; CHECK: br i1 %c, label %left0, label %right
72 ; CHECK: left0:
73 ; CHECK: call void @side_effect(i32 0)
74 ; CHECK: call void @side_effect(i32 0)
75  entry:
76   call void @side_effect(i32 0)
77   %i.inc = add nsw i32 %i, 1
78   %c0 = icmp slt i32 %i.inc, %len
79   br i1 %c0, label %cont, label %right
80
81  cont:
82   %c = load i1, i1* %c.ptr
83   br i1 %c, label %left, label %right
84
85  left:
86   call void @side_effect(i32 0)
87   %c1 = icmp slt i32 %i, %len
88   br i1 %c1, label %left0, label %right
89
90  left0:
91   call void @side_effect(i32 0)
92   ret void
93
94  right:
95   %t = phi i32 [ 1, %left ], [ 2, %entry ], [ 3, %cont ]
96   call void @side_effect(i32 %t)
97   ret void
98 }