Skip to content

Commit d82c1e8

Browse files
committed
Rename test name, add more tests for codegenprepare
1 parent e872502 commit d82c1e8

File tree

2 files changed

+323
-135
lines changed

2 files changed

+323
-135
lines changed
Lines changed: 323 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -codegenprepare < %s | FileCheck %s
3+
4+
target triple = "x86_64-unknown-linux-gnu"
5+
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
17+
;
18+
%c = icmp eq i32 %a, 0
19+
%fr = freeze i1 %c
20+
br i1 %fr, label %A, label %B
21+
A:
22+
call void @g1()
23+
ret void
24+
B:
25+
call void @g2()
26+
ret void
27+
}
28+
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
40+
;
41+
%c = icmp eq i32 0, %a
42+
%fr = freeze i1 %c
43+
br i1 %fr, label %A, label %B
44+
A:
45+
call void @g1()
46+
ret void
47+
B:
48+
call void @g2()
49+
ret void
50+
}
51+
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
62+
;
63+
%c = icmp eq i32 0, 1
64+
%fr = freeze i1 %c
65+
br i1 %fr, label %A, label %B
66+
A:
67+
call void @g1()
68+
ret void
69+
B:
70+
call void @g2()
71+
ret void
72+
}
73+
74+
define i1 @ptrcmp(i8* %p) {
75+
; CHECK-LABEL: @ptrcmp(
76+
; CHECK-NEXT: [[FR:%.*]] = freeze i8* [[P:%.*]]
77+
; CHECK-NEXT: [[C:%.*]] = icmp eq i8* [[FR]], null
78+
; CHECK-NEXT: ret i1 [[C]]
79+
;
80+
%c = icmp eq i8* %p, null
81+
%fr = freeze i1 %c
82+
ret i1 %fr
83+
}
84+
85+
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]]
91+
;
92+
%c = fcmp oeq float %a, 0.0
93+
%fr = freeze i1 %c
94+
ret i1 %fr
95+
}
96+
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]]
102+
;
103+
%c = fcmp nnan oeq float %a, 0.0
104+
%fr = freeze i1 %c
105+
ret i1 %fr
106+
}
107+
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
120+
;
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
125+
A:
126+
call void @g1()
127+
ret void
128+
B:
129+
call void @g2()
130+
ret void
131+
}
132+
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
145+
;
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
150+
A:
151+
call void @g1()
152+
ret void
153+
B:
154+
call void @g2()
155+
ret void
156+
}
157+
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
173+
;
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
181+
A:
182+
call void @g1()
183+
ret void
184+
B:
185+
call void @g2()
186+
ret void
187+
}
188+
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
201+
;
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
206+
A:
207+
call void @g1()
208+
ret void
209+
B:
210+
call void @g2()
211+
ret void
212+
}
213+
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
230+
;
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
239+
A:
240+
call void @g1()
241+
ret void
242+
B:
243+
call void @g2()
244+
ret void
245+
}
246+
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
262+
;
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
270+
A:
271+
call void @g1()
272+
ret void
273+
B:
274+
call void @g2()
275+
ret void
276+
}
277+
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
290+
;
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
295+
A:
296+
call void @g1()
297+
ret void
298+
B:
299+
call void @g2()
300+
ret void
301+
}
302+
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
312+
;
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
320+
}
321+
322+
declare void @g1()
323+
declare void @g2()

0 commit comments

Comments
 (0)