Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / X86 / freeze-brcond.ll
blobe9ecfd1615d457db56ec83fabc38ec241ebea3f1
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' < %s | FileCheck %s
4 target triple = "x86_64-unknown-linux-gnu"
6 define void @f1(i32 %a) {
7 ; CHECK-LABEL: @f1(
8 ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[A:%.*]]
9 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[FR]], 0
10 ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
11 ; CHECK:       A:
12 ; CHECK-NEXT:    call void @g1()
13 ; CHECK-NEXT:    ret void
14 ; CHECK:       B:
15 ; CHECK-NEXT:    call void @g2()
16 ; CHECK-NEXT:    ret void
18   %c = icmp eq i32 %a, 0
19   %fr = freeze i1 %c
20   br i1 %fr, label %A, label %B
22   call void @g1()
23   ret void
25   call void @g2()
26   ret void
29 define void @f2(i32 %a) {
30 ; CHECK-LABEL: @f2(
31 ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[A:%.*]]
32 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 0, [[FR]]
33 ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
34 ; CHECK:       A:
35 ; CHECK-NEXT:    call void @g1()
36 ; CHECK-NEXT:    ret void
37 ; CHECK:       B:
38 ; CHECK-NEXT:    call void @g2()
39 ; CHECK-NEXT:    ret void
41   %c = icmp eq i32 0, %a
42   %fr = freeze i1 %c
43   br i1 %fr, label %A, label %B
45   call void @g1()
46   ret void
48   call void @g2()
49   ret void
52 define void @f3(i32 %a) {
53 ; CHECK-LABEL: @f3(
54 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 0, 1
55 ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
56 ; CHECK:       A:
57 ; CHECK-NEXT:    call void @g1()
58 ; CHECK-NEXT:    ret void
59 ; CHECK:       B:
60 ; CHECK-NEXT:    call void @g2()
61 ; CHECK-NEXT:    ret void
63   %c = icmp eq i32 0, 1
64   %fr = freeze i1 %c
65   br i1 %fr, label %A, label %B
67   call void @g1()
68   ret void
70   call void @g2()
71   ret void
74 define i1 @ptrcmp(ptr %p) {
75 ; CHECK-LABEL: @ptrcmp(
76 ; CHECK-NEXT:    [[FR:%.*]] = freeze ptr [[P:%.*]]
77 ; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[FR]], null
78 ; CHECK-NEXT:    ret i1 [[C]]
80   %c = icmp eq ptr %p, null
81   %fr = freeze i1 %c
82   ret i1 %fr
86 define i1 @fcmp(float %a) {
87 ; CHECK-LABEL: @fcmp(
88 ; CHECK-NEXT:    [[FR:%.*]] = freeze float [[A:%.*]]
89 ; CHECK-NEXT:    [[C:%.*]] = fcmp oeq float [[FR]], 0.000000e+00
90 ; CHECK-NEXT:    ret i1 [[C]]
92   %c = fcmp oeq float %a, 0.0
93   %fr = freeze i1 %c
94   ret i1 %fr
97 define i1 @fcmp_nan(float %a) {
98 ; CHECK-LABEL: @fcmp_nan(
99 ; CHECK-NEXT:    [[C:%.*]] = fcmp nnan oeq float [[A:%.*]], 0.000000e+00
100 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[C]]
101 ; CHECK-NEXT:    ret i1 [[FR]]
103   %c = fcmp nnan oeq float %a, 0.0
104   %fr = freeze i1 %c
105   ret i1 %fr
108 define void @and_bitmask(i32 %flag) {
109 ; CHECK-LABEL: @and_bitmask(
110 ; CHECK-NEXT:    [[V:%.*]] = and i32 [[FLAG:%.*]], 1
111 ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[V]]
112 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[FR]], 0
113 ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
114 ; CHECK:       A:
115 ; CHECK-NEXT:    call void @g1()
116 ; CHECK-NEXT:    ret void
117 ; CHECK:       B:
118 ; CHECK-NEXT:    call void @g2()
119 ; CHECK-NEXT:    ret void
121   %v = and i32 %flag, 1
122   %c = icmp eq i32 %v, 0
123   %fr = freeze i1 %c
124   br i1 %fr, label %A, label %B
126   call void @g1()
127   ret void
129   call void @g2()
130   ret void
133 define void @and_bitmask_r(i32 %flag) {
134 ; CHECK-LABEL: @and_bitmask_r(
135 ; CHECK-NEXT:    [[V:%.*]] = and i32 1, [[FLAG:%.*]]
136 ; CHECK-NEXT:    [[FR:%.*]] = freeze i32 [[V]]
137 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 0, [[FR]]
138 ; CHECK-NEXT:    br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
139 ; CHECK:       A:
140 ; CHECK-NEXT:    call void @g1()
141 ; CHECK-NEXT:    ret void
142 ; CHECK:       B:
143 ; CHECK-NEXT:    call void @g2()
144 ; CHECK-NEXT:    ret void
146   %v = and i32 1, %flag
147   %c = icmp eq i32 0, %v
148   %fr = freeze i1 %c
149   br i1 %fr, label %A, label %B
151   call void @g1()
152   ret void
154   call void @g2()
155   ret void
158 define void @and_bitmask2(i32 %flag, i32 %flag2) {
159 ; CHECK-LABEL: @and_bitmask2(
160 ; CHECK-NEXT:    [[V:%.*]] = and i32 [[FLAG:%.*]], 1
161 ; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[V]], 0
162 ; CHECK-NEXT:    [[V2:%.*]] = and i32 [[FLAG2:%.*]], 2
163 ; CHECK-NEXT:    [[C2:%.*]] = icmp eq i32 [[V2]], 0
164 ; CHECK-NEXT:    [[COND:%.*]] = or i1 [[C]], [[C2]]
165 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND]]
166 ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
167 ; CHECK:       A:
168 ; CHECK-NEXT:    call void @g1()
169 ; CHECK-NEXT:    ret void
170 ; CHECK:       B:
171 ; CHECK-NEXT:    call void @g2()
172 ; CHECK-NEXT:    ret void
174   %v = and i32 %flag, 1
175   %c = icmp eq i32 %v, 0
176   %v2 = and i32 %flag2, 2
177   %c2 = icmp eq i32 %v2, 0
178   %cond = or i1 %c, %c2
179   %fr = freeze i1 %cond
180   br i1 %fr, label %A, label %B
182   call void @g1()
183   ret void
185   call void @g2()
186   ret void
189 define void @and(i1 %a, i1 %b, i1 %c) {
190 ; CHECK-LABEL: @and(
191 ; CHECK-NEXT:    [[COND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
192 ; CHECK-NEXT:    [[COND2:%.*]] = and i1 [[C:%.*]], [[COND]]
193 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND2]]
194 ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
195 ; CHECK:       A:
196 ; CHECK-NEXT:    call void @g1()
197 ; CHECK-NEXT:    ret void
198 ; CHECK:       B:
199 ; CHECK-NEXT:    call void @g2()
200 ; CHECK-NEXT:    ret void
202   %cond = and i1 %a, %b
203   %cond2 = and i1 %c, %cond
204   %fr = freeze i1 %cond2
205   br i1 %fr, label %A, label %B
207   call void @g1()
208   ret void
210   call void @g2()
211   ret void
214 define void @and_long(i1 %a, i1 %b, i1 %c, i1 %d, i1 %e, i1 %f, i1 %g) {
215 ; CHECK-LABEL: @and_long(
216 ; CHECK-NEXT:    [[COND:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
217 ; CHECK-NEXT:    [[COND2:%.*]] = and i1 [[C:%.*]], [[COND]]
218 ; CHECK-NEXT:    [[COND3:%.*]] = and i1 [[D:%.*]], [[COND2]]
219 ; CHECK-NEXT:    [[COND4:%.*]] = and i1 [[E:%.*]], [[COND3]]
220 ; CHECK-NEXT:    [[COND5:%.*]] = and i1 [[F:%.*]], [[COND4]]
221 ; CHECK-NEXT:    [[COND6:%.*]] = and i1 [[G:%.*]], [[COND5]]
222 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND6]]
223 ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
224 ; CHECK:       A:
225 ; CHECK-NEXT:    call void @g1()
226 ; CHECK-NEXT:    ret void
227 ; CHECK:       B:
228 ; CHECK-NEXT:    call void @g2()
229 ; CHECK-NEXT:    ret void
231   %cond = and i1 %a, %b
232   %cond2 = and i1 %c, %cond
233   %cond3 = and i1 %d, %cond2
234   %cond4 = and i1 %e, %cond3
235   %cond5 = and i1 %f, %cond4
236   %cond6 = and i1 %g, %cond5
237   %fr = freeze i1 %cond6
238   br i1 %fr, label %A, label %B
240   call void @g1()
241   ret void
243   call void @g2()
244   ret void
247 define void @and_cmp(i32 %v, float %w, i32 %v2) {
248 ; CHECK-LABEL: @and_cmp(
249 ; CHECK-NEXT:    [[C1:%.*]] = icmp eq i32 [[V:%.*]], 0
250 ; CHECK-NEXT:    [[C2:%.*]] = fcmp oeq float [[W:%.*]], 0.000000e+00
251 ; CHECK-NEXT:    [[COND:%.*]] = and i1 [[C1]], [[C2]]
252 ; CHECK-NEXT:    [[C3:%.*]] = icmp eq i32 [[V2:%.*]], 1
253 ; CHECK-NEXT:    [[COND2:%.*]] = and i1 [[COND]], [[C3]]
254 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND2]]
255 ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
256 ; CHECK:       A:
257 ; CHECK-NEXT:    call void @g1()
258 ; CHECK-NEXT:    ret void
259 ; CHECK:       B:
260 ; CHECK-NEXT:    call void @g2()
261 ; CHECK-NEXT:    ret void
263   %c1 = icmp eq i32 %v, 0
264   %c2 = fcmp oeq float %w, 0.0
265   %cond = and i1 %c1, %c2
266   %c3 = icmp eq i32 %v2, 1
267   %cond2 = and i1 %cond, %c3
268   %fr = freeze i1 %cond2
269   br i1 %fr, label %A, label %B
271   call void @g1()
272   ret void
274   call void @g2()
275   ret void
278 define void @or(i1 %a, i1 %b, i1 %c) {
279 ; CHECK-LABEL: @or(
280 ; CHECK-NEXT:    [[COND:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
281 ; CHECK-NEXT:    [[COND2:%.*]] = or i1 [[C:%.*]], [[COND]]
282 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[COND2]]
283 ; CHECK-NEXT:    br i1 [[FR]], label [[A:%.*]], label [[B:%.*]]
284 ; CHECK:       A:
285 ; CHECK-NEXT:    call void @g1()
286 ; CHECK-NEXT:    ret void
287 ; CHECK:       B:
288 ; CHECK-NEXT:    call void @g2()
289 ; CHECK-NEXT:    ret void
291   %cond = or i1 %a, %b
292   %cond2 = or i1 %c, %cond
293   %fr = freeze i1 %cond2
294   br i1 %fr, label %A, label %B
296   call void @g1()
297   ret void
299   call void @g2()
300   ret void
303 define void @and_loop(i1 %a, i1 %b) {
304 ; CHECK-LABEL: @and_loop(
305 ; CHECK-NEXT:    ret void
306 ; CHECK:       UNREACHABLE:
307 ; CHECK-NEXT:    [[C:%.*]] = and i1 [[A:%.*]], [[C]]
308 ; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[C]]
309 ; CHECK-NEXT:    br i1 [[FR]], label [[UNREACHABLE:%.*]], label [[EXIT:%.*]]
310 ; CHECK:       EXIT:
311 ; CHECK-NEXT:    ret void
313   ret void
314 UNREACHABLE:
315   %c = and i1 %a, %c
316   %fr = freeze i1 %c
317   br i1 %fr, label %UNREACHABLE, label %EXIT
318 EXIT:
319   ret void
322 declare void @g1()
323 declare void @g2()