1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -simplifycfg < %s | FileCheck %s
3
4declare void @foo()
5declare void @bar()
6declare void @use.i1(i1)
7
8define void @test_phi_simple(i1 %c) {
9; CHECK-LABEL: @test_phi_simple(
10; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
11; CHECK:       if:
12; CHECK-NEXT:    call void @foo()
13; CHECK-NEXT:    call void @foo()
14; CHECK-NEXT:    br label [[JOIN2:%.*]]
15; CHECK:       else:
16; CHECK-NEXT:    call void @bar()
17; CHECK-NEXT:    call void @bar()
18; CHECK-NEXT:    br label [[JOIN2]]
19; CHECK:       join2:
20; CHECK-NEXT:    ret void
21;
22  br i1 %c, label %if, label %else
23
24if:
25  call void @foo()
26  br label %join
27
28else:
29  call void @bar()
30  br label %join
31
32join:
33  %c2 = phi i1 [ true, %if ], [ false, %else ]
34  br i1 %c2, label %if2, label %else2
35
36if2:
37  call void @foo()
38  br label %join2
39
40else2:
41  call void @bar()
42  br label %join2
43
44join2:
45  ret void
46}
47
48define void @test_phi_extra_use(i1 %c) {
49; CHECK-LABEL: @test_phi_extra_use(
50; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
51; CHECK:       if:
52; CHECK-NEXT:    call void @foo()
53; CHECK-NEXT:    call void @use.i1(i1 true)
54; CHECK-NEXT:    call void @foo()
55; CHECK-NEXT:    br label [[JOIN2:%.*]]
56; CHECK:       else:
57; CHECK-NEXT:    call void @bar()
58; CHECK-NEXT:    call void @use.i1(i1 false)
59; CHECK-NEXT:    call void @bar()
60; CHECK-NEXT:    br label [[JOIN2]]
61; CHECK:       join2:
62; CHECK-NEXT:    ret void
63;
64  br i1 %c, label %if, label %else
65
66if:
67  call void @foo()
68  br label %join
69
70else:
71  call void @bar()
72  br label %join
73
74join:
75  %c2 = phi i1 [ true, %if ], [ false, %else ]
76  call void @use.i1(i1 %c2)
77  br i1 %c2, label %if2, label %else2
78
79if2:
80  call void @foo()
81  br label %join2
82
83else2:
84  call void @bar()
85  br label %join2
86
87join2:
88  ret void
89}
90
91define void @test_phi_extra_use_different_block(i1 %c) {
92; CHECK-LABEL: @test_phi_extra_use_different_block(
93; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
94; CHECK:       if:
95; CHECK-NEXT:    call void @foo()
96; CHECK-NEXT:    br label [[JOIN:%.*]]
97; CHECK:       else:
98; CHECK-NEXT:    call void @bar()
99; CHECK-NEXT:    br label [[JOIN]]
100; CHECK:       join:
101; CHECK-NEXT:    [[C2:%.*]] = phi i1 [ true, [[IF]] ], [ false, [[ELSE]] ]
102; CHECK-NEXT:    br i1 [[C2]], label [[IF2:%.*]], label [[ELSE2:%.*]]
103; CHECK:       if2:
104; CHECK-NEXT:    call void @use.i1(i1 [[C2]])
105; CHECK-NEXT:    call void @foo()
106; CHECK-NEXT:    br label [[JOIN2:%.*]]
107; CHECK:       else2:
108; CHECK-NEXT:    call void @use.i1(i1 [[C2]])
109; CHECK-NEXT:    call void @bar()
110; CHECK-NEXT:    br label [[JOIN2]]
111; CHECK:       join2:
112; CHECK-NEXT:    ret void
113;
114  br i1 %c, label %if, label %else
115
116if:
117  call void @foo()
118  br label %join
119
120else:
121  call void @bar()
122  br label %join
123
124join:
125  %c2 = phi i1 [ true, %if ], [ false, %else ]
126  br i1 %c2, label %if2, label %else2
127
128if2:
129  call void @use.i1(i1 %c2)
130  call void @foo()
131  br label %join2
132
133else2:
134  call void @use.i1(i1 %c2)
135  call void @bar()
136  br label %join2
137
138join2:
139  ret void
140}
141
142define void @test_same_cond_simple(i1 %c) {
143; CHECK-LABEL: @test_same_cond_simple(
144; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
145; CHECK:       if:
146; CHECK-NEXT:    call void @foo()
147; CHECK-NEXT:    call void @foo()
148; CHECK-NEXT:    br label [[JOIN2:%.*]]
149; CHECK:       else:
150; CHECK-NEXT:    call void @bar()
151; CHECK-NEXT:    call void @bar()
152; CHECK-NEXT:    br label [[JOIN2]]
153; CHECK:       join2:
154; CHECK-NEXT:    ret void
155;
156  br i1 %c, label %if, label %else
157
158if:
159  call void @foo()
160  br label %join
161
162else:
163  call void @bar()
164  br label %join
165
166join:
167  br i1 %c, label %if2, label %else2
168
169if2:
170  call void @foo()
171  br label %join2
172
173else2:
174  call void @bar()
175  br label %join2
176
177join2:
178  ret void
179}
180
181define void @test_same_cond_extra_use(i1 %c) {
182; CHECK-LABEL: @test_same_cond_extra_use(
183; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
184; CHECK:       if:
185; CHECK-NEXT:    call void @foo()
186; CHECK-NEXT:    call void @use.i1(i1 true)
187; CHECK-NEXT:    call void @foo()
188; CHECK-NEXT:    br label [[JOIN2:%.*]]
189; CHECK:       else:
190; CHECK-NEXT:    call void @bar()
191; CHECK-NEXT:    call void @use.i1(i1 false)
192; CHECK-NEXT:    call void @bar()
193; CHECK-NEXT:    br label [[JOIN2]]
194; CHECK:       join2:
195; CHECK-NEXT:    ret void
196;
197  br i1 %c, label %if, label %else
198
199if:
200  call void @foo()
201  br label %join
202
203else:
204  call void @bar()
205  br label %join
206
207join:
208  call void @use.i1(i1 %c)
209  br i1 %c, label %if2, label %else2
210
211if2:
212  call void @foo()
213  br label %join2
214
215else2:
216  call void @bar()
217  br label %join2
218
219join2:
220  ret void
221}
222
223define void @test_same_cond_extra_use_different_block(i1 %c) {
224; CHECK-LABEL: @test_same_cond_extra_use_different_block(
225; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
226; CHECK:       if:
227; CHECK-NEXT:    call void @foo()
228; CHECK-NEXT:    call void @use.i1(i1 [[C]])
229; CHECK-NEXT:    call void @foo()
230; CHECK-NEXT:    br label [[JOIN2:%.*]]
231; CHECK:       else:
232; CHECK-NEXT:    call void @bar()
233; CHECK-NEXT:    call void @use.i1(i1 [[C]])
234; CHECK-NEXT:    call void @bar()
235; CHECK-NEXT:    br label [[JOIN2]]
236; CHECK:       join2:
237; CHECK-NEXT:    ret void
238;
239  br i1 %c, label %if, label %else
240
241if:
242  call void @foo()
243  br label %join
244
245else:
246  call void @bar()
247  br label %join
248
249join:
250  br i1 %c, label %if2, label %else2
251
252if2:
253  call void @use.i1(i1 %c)
254  call void @foo()
255  br label %join2
256
257else2:
258  call void @use.i1(i1 %c)
259  call void @bar()
260  br label %join2
261
262join2:
263  ret void
264}
265