1 ; RUN: opt < %s -correlated-propagation -S | FileCheck %s
5 define i32 @test1(i1 %C) nounwind {
6 br i1 %C, label %exit, label %body
10 %A = select i1 %C, i32 10, i32 11 ; <i32> [#uses=1]
21 ; CHECK-LABEL: @test2(
24 %cond = tail call i1 @ext() ; <i1> [#uses=2]
25 br i1 %cond, label %bb1, label %bb2
28 %cond2 = tail call i1 @ext() ; <i1> [#uses=1]
29 br i1 %cond2, label %bb3, label %bb2
31 bb2: ; preds = %bb1, %entry
33 %cond_merge = phi i1 [ %cond, %entry ], [ false, %bb1 ] ; <i1> [#uses=1]
38 %res = tail call i1 @ext() ; <i1> [#uses=1]
44 @gv = internal constant i8 7
45 ; CHECK-LABEL: @test3(
46 define i8 @test3(i8* %a) nounwind {
48 %cond = icmp eq i8* %a, @gv
49 br i1 %cond, label %bb2, label %bb
55 ; CHECK: %should_be_const = load i8* @gv
56 %should_be_const = load i8* %a
57 ret i8 %should_be_const
61 ; CHECK-LABEL: @test4(
62 define i32 @test4(i32) {
64 ; CHECK: icmp sgt i32 %0, 2
65 %.demorgan = icmp sgt i32 %0, 2
66 br i1 %.demorgan, label %GreaterThanTwo, label %LessThanOrEqualToTwo
69 ; CHECK-NOT: icmp eq i32 %0, 2
72 br i1 %1, label %Impossible, label %NotTwoAndGreaterThanTwo
74 NotTwoAndGreaterThanTwo:
85 define void @test5(i32* %x, i32* %y) {
86 ; CHECK-LABEL: @test5(
88 %pre = icmp eq i32* %x, null
89 br i1 %pre, label %return, label %loop
92 %phi = phi i32* [ %sel, %loop ], [ %x, %entry ]
93 ; CHECK: %phi = phi i32* [ %f, %loop ], [ %x, %entry ]
94 %f = tail call i32* @f(i32* %phi)
95 %cmp1 = icmp ne i32* %f, %y
96 %sel = select i1 %cmp1, i32* %f, i32* null
97 %cmp2 = icmp eq i32* %sel, null
98 br i1 %cmp2, label %return, label %loop
104 define i32 @switch1(i32 %s) {
105 ; CHECK-LABEL: @switch1(
107 %cmp = icmp slt i32 %s, 0
108 br i1 %cmp, label %negative, label %out
111 switch i32 %s, label %out [
112 ; CHECK: switch i32 %s, label %out
118 ; CHECK: i32 -1, label %next
120 ; CHECK: i32 -2, label %next
128 %p = phi i32 [ 1, %entry ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ]
132 %q = phi i32 [ 0, %negative ], [ 0, %negative ]
136 define i32 @switch2(i32 %s) {
137 ; CHECK-LABEL: @switch2(
139 %cmp = icmp sgt i32 %s, 0
140 br i1 %cmp, label %positive, label %out
143 switch i32 %s, label %out [
148 ; CHECK: br label %out
151 %p = phi i32 [ -1, %entry ], [ 1, %positive ], [ 1, %positive ]
155 %q = phi i32 [ 0, %positive ], [ 0, %positive ]
159 define i32 @switch3(i32 %s) {
160 ; CHECK-LABEL: @switch3(
162 %cmp = icmp sgt i32 %s, 0
163 br i1 %cmp, label %positive, label %out
166 switch i32 %s, label %out [
171 ; CHECK: br label %out
174 %p = phi i32 [ -1, %entry ], [ 1, %positive ], [ 1, %positive ]
178 %q = phi i32 [ 0, %positive ], [ 0, %positive ]
182 define void @switch4(i32 %s) {
183 ; CHECK-LABEL: @switch4(
185 %cmp = icmp eq i32 %s, 0
186 br i1 %cmp, label %zero, label %out
189 switch i32 %s, label %out [
194 ; CHECK: br label %next