• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -correlated-propagation -S | FileCheck %s
2; PR2581
3
4; CHECK: @test1
5define i32 @test1(i1 %C) nounwind  {
6        br i1 %C, label %exit, label %body
7
8body:           ; preds = %0
9; CHECK-NOT: select
10        %A = select i1 %C, i32 10, i32 11               ; <i32> [#uses=1]
11; CHECK: ret i32 11
12        ret i32 %A
13
14exit:           ; preds = %0
15; CHECK: ret i32 10
16        ret i32 10
17}
18
19; PR4420
20declare i1 @ext()
21; CHECK: @test2
22define i1 @test2() {
23entry:
24        %cond = tail call i1 @ext()             ; <i1> [#uses=2]
25        br i1 %cond, label %bb1, label %bb2
26
27bb1:            ; preds = %entry
28        %cond2 = tail call i1 @ext()            ; <i1> [#uses=1]
29        br i1 %cond2, label %bb3, label %bb2
30
31bb2:            ; preds = %bb1, %entry
32; CHECK-NOT: phi i1
33        %cond_merge = phi i1 [ %cond, %entry ], [ false, %bb1 ]         ; <i1> [#uses=1]
34; CHECK: ret i1 false
35        ret i1 %cond_merge
36
37bb3:            ; preds = %bb1
38        %res = tail call i1 @ext()              ; <i1> [#uses=1]
39; CHECK: ret i1 %res
40        ret i1 %res
41}
42
43; PR4855
44@gv = internal constant i8 7
45; CHECK: @test3
46define i8 @test3(i8* %a) nounwind {
47entry:
48        %cond = icmp eq i8* %a, @gv
49        br i1 %cond, label %bb2, label %bb
50
51bb:             ; preds = %entry
52        ret i8 0
53
54bb2:            ; preds = %entry
55; CHECK: %should_be_const = load i8* @gv
56        %should_be_const = load i8* %a
57        ret i8 %should_be_const
58}
59
60; PR1757
61; CHECK: @test4
62define i32 @test4(i32) {
63EntryBlock:
64; CHECK: icmp sgt i32 %0, 2
65  %.demorgan = icmp sgt i32 %0, 2
66  br i1 %.demorgan, label %GreaterThanTwo, label %LessThanOrEqualToTwo
67
68GreaterThanTwo:
69; CHECK-NOT: icmp eq i32 %0, 2
70  icmp eq i32 %0, 2
71; CHECK: br i1 false
72  br i1 %1, label %Impossible, label %NotTwoAndGreaterThanTwo
73
74NotTwoAndGreaterThanTwo:
75  ret i32 2
76
77Impossible:
78  ret i32 1
79
80LessThanOrEqualToTwo:
81  ret i32 0
82}
83
84define i32 @switch1(i32 %s) {
85; CHECK: @switch1
86entry:
87  %cmp = icmp slt i32 %s, 0
88  br i1 %cmp, label %negative, label %out
89
90negative:
91  switch i32 %s, label %out [
92; CHECK: switch i32 %s, label %out
93    i32 0, label %out
94; CHECK-NOT: i32 0
95    i32 1, label %out
96; CHECK-NOT: i32 1
97    i32 -1, label %next
98; CHECK: i32 -1, label %next
99    i32 -2, label %next
100; CHECK: i32 -2, label %next
101    i32 2, label %out
102; CHECK-NOT: i32 2
103    i32 3, label %out
104; CHECK-NOT: i32 3
105  ]
106
107out:
108  %p = phi i32 [ 1, %entry ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ]
109  ret i32 %p
110
111next:
112  %q = phi i32 [ 0, %negative ], [ 0, %negative ]
113  ret i32 %q
114}
115
116define i32 @switch2(i32 %s) {
117; CHECK: @switch2
118entry:
119  %cmp = icmp sgt i32 %s, 0
120  br i1 %cmp, label %positive, label %out
121
122positive:
123  switch i32 %s, label %out [
124    i32 0, label %out
125    i32 -1, label %next
126    i32 -2, label %next
127  ]
128; CHECK: br label %out
129
130out:
131  %p = phi i32 [ -1, %entry ], [ 1, %positive ], [ 1, %positive ]
132  ret i32 %p
133
134next:
135  %q = phi i32 [ 0, %positive ], [ 0, %positive ]
136  ret i32 %q
137}
138
139define i32 @switch3(i32 %s) {
140; CHECK: @switch3
141entry:
142  %cmp = icmp sgt i32 %s, 0
143  br i1 %cmp, label %positive, label %out
144
145positive:
146  switch i32 %s, label %out [
147    i32 -1, label %out
148    i32 -2, label %next
149    i32 -3, label %next
150  ]
151; CHECK: br label %out
152
153out:
154  %p = phi i32 [ -1, %entry ], [ 1, %positive ], [ 1, %positive ]
155  ret i32 %p
156
157next:
158  %q = phi i32 [ 0, %positive ], [ 0, %positive ]
159  ret i32 %q
160}
161
162define void @switch4(i32 %s) {
163; CHECK: @switch4
164entry:
165  %cmp = icmp eq i32 %s, 0
166  br i1 %cmp, label %zero, label %out
167
168zero:
169  switch i32 %s, label %out [
170    i32 0, label %next
171    i32 1, label %out
172    i32 -1, label %out
173  ]
174; CHECK: br label %next
175
176out:
177  ret void
178
179next:
180  ret void
181}
182