Skip to content

Commit 099410b

Browse files
committed
Attributor: Add baseline test for inferring denormal-fp-math
1 parent 239ab16 commit 099410b

File tree

1 file changed

+389
-0
lines changed

1 file changed

+389
-0
lines changed
Lines changed: 389 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,389 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 2
2+
; RUN: opt -S -passes=attributor < %s | FileCheck %s
3+
4+
; Keep the attribute checks clean by disabling inference of anything else.
5+
declare void @call_of_mystery()
6+
7+
; Should infer to ieee,ieee/default
8+
define internal void @leaf_dynamic_dynamic_from_ieee_ieee() #0 {
9+
; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_ieee_ieee
10+
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
11+
; CHECK-NEXT: call void @call_of_mystery()
12+
; CHECK-NEXT: ret void
13+
;
14+
call void @call_of_mystery()
15+
ret void
16+
}
17+
18+
; Should infer to ieee,ieee/default
19+
define internal void @leaf_recursive_dynamic_dynamic_from_ieee_ieee() #0 {
20+
; CHECK-LABEL: define internal void @leaf_recursive_dynamic_dynamic_from_ieee_ieee
21+
; CHECK-SAME: () #[[ATTR0]] {
22+
; CHECK-NEXT: call void @call_of_mystery()
23+
; CHECK-NEXT: call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()
24+
; CHECK-NEXT: ret void
25+
;
26+
call void @call_of_mystery()
27+
call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()
28+
ret void
29+
}
30+
31+
; Should strip denormal-fp-math for default ieee
32+
define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee() #1 {
33+
; CHECK-LABEL: define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee
34+
; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
35+
; CHECK-NEXT: call void @call_of_mystery()
36+
; CHECK-NEXT: ret void
37+
;
38+
call void @call_of_mystery()
39+
ret void
40+
}
41+
42+
; Should infer to preserve-sign,preserve-sign
43+
define internal void @leaf_dynamic_dynamic_from_daz_daz() #0 {
44+
; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_daz_daz
45+
; CHECK-SAME: () #[[ATTR0]] {
46+
; CHECK-NEXT: call void @call_of_mystery()
47+
; CHECK-NEXT: ret void
48+
;
49+
call void @call_of_mystery()
50+
ret void
51+
}
52+
53+
; This goes to invalid because of the mismatch in the main mode. We
54+
; could theoretically refine to denormal-fp-math-f32=preserve-sign,preserve-sign
55+
define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz() #1 {
56+
; CHECK-LABEL: define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz
57+
; CHECK-SAME: () #[[ATTR1]] {
58+
; CHECK-NEXT: call void @call_of_mystery()
59+
; CHECK-NEXT: ret void
60+
;
61+
call void @call_of_mystery()
62+
ret void
63+
}
64+
65+
; Leave this alone, must stay dynamic,dynamic
66+
define internal void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee() #0 {
67+
; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee
68+
; CHECK-SAME: () #[[ATTR0]] {
69+
; CHECK-NEXT: call void @call_of_mystery()
70+
; CHECK-NEXT: ret void
71+
;
72+
call void @call_of_mystery()
73+
ret void
74+
}
75+
76+
; Leave this alone, should only have denormal-fp-math-f32=ieee,ieee
77+
define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee() #1 {
78+
; CHECK-LABEL: define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee
79+
; CHECK-SAME: () #[[ATTR1]] {
80+
; CHECK-NEXT: call void @call_of_mystery()
81+
; CHECK-NEXT: ret void
82+
;
83+
call void @call_of_mystery()
84+
ret void
85+
}
86+
87+
; Leave as dynamic,dynamic
88+
define void @externally_visible_dynamic_dynamic_from_ieee_ieee() #0 {
89+
; CHECK-LABEL: define void @externally_visible_dynamic_dynamic_from_ieee_ieee
90+
; CHECK-SAME: () #[[ATTR0]] {
91+
; CHECK-NEXT: call void @call_of_mystery()
92+
; CHECK-NEXT: ret void
93+
;
94+
call void @call_of_mystery()
95+
ret void
96+
}
97+
98+
; Should infer to positive-zero,positive-zero
99+
define internal void @leaf_dynamic_dynamic_from_dapz_dapz() #0 {
100+
; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_dapz_dapz
101+
; CHECK-SAME: () #[[ATTR0]] {
102+
; CHECK-NEXT: call void @call_of_mystery()
103+
; CHECK-NEXT: ret void
104+
;
105+
call void @call_of_mystery()
106+
ret void
107+
}
108+
109+
; ieee,ieee entry point
110+
define void @func_ieee_ieee() #2 {
111+
; CHECK-LABEL: define void @func_ieee_ieee
112+
; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
113+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_ieee_ieee()
114+
; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()
115+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()
116+
; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()
117+
; CHECK-NEXT: call void @externally_visible_dynamic_dynamic_from_ieee_ieee()
118+
; CHECK-NEXT: call void @leaf_dynamic_ieee_from_ieee_ieee()
119+
; CHECK-NEXT: call void @leaf_ieee_dynamic_from_ieee_ieee()
120+
; CHECK-NEXT: call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()
121+
; CHECK-NEXT: ret void
122+
;
123+
call void @leaf_dynamic_dynamic_from_ieee_ieee()
124+
call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()
125+
call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()
126+
call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()
127+
call void @externally_visible_dynamic_dynamic_from_ieee_ieee()
128+
call void @leaf_dynamic_ieee_from_ieee_ieee()
129+
call void @leaf_ieee_dynamic_from_ieee_ieee()
130+
call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()
131+
ret void
132+
}
133+
134+
; ieee,ieee entry point
135+
define void @func_default_is_ieee_ieee() {
136+
; CHECK-LABEL: define void @func_default_is_ieee_ieee() {
137+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_ieee_ieee()
138+
; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()
139+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()
140+
; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()
141+
; CHECK-NEXT: call void @externally_visible_dynamic_dynamic_from_ieee_ieee()
142+
; CHECK-NEXT: call void @leaf_dynamic_ieee_from_ieee_ieee()
143+
; CHECK-NEXT: call void @leaf_ieee_dynamic_from_ieee_ieee()
144+
; CHECK-NEXT: call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()
145+
; CHECK-NEXT: ret void
146+
;
147+
call void @leaf_dynamic_dynamic_from_ieee_ieee()
148+
call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()
149+
call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()
150+
call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()
151+
call void @externally_visible_dynamic_dynamic_from_ieee_ieee()
152+
call void @leaf_dynamic_ieee_from_ieee_ieee()
153+
call void @leaf_ieee_dynamic_from_ieee_ieee()
154+
call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()
155+
ret void
156+
}
157+
158+
; preserve-sign,preserve-sign entry point
159+
define void @func_daz_daz() #3 {
160+
; CHECK-LABEL: define void @func_daz_daz
161+
; CHECK-SAME: () #[[ATTR3:[0-9]+]] {
162+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz()
163+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()
164+
; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()
165+
; CHECK-NEXT: call void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz()
166+
; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz()
167+
; CHECK-NEXT: ret void
168+
;
169+
call void @leaf_dynamic_dynamic_from_daz_daz()
170+
call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()
171+
call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()
172+
call void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz()
173+
call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz()
174+
ret void
175+
}
176+
177+
; positive-zero,positive-zero entry point
178+
define void @func_dapz_dapz() #4 {
179+
; CHECK-LABEL: define void @func_dapz_dapz
180+
; CHECK-SAME: () #[[ATTR4:[0-9]+]] {
181+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_dapz_dapz()
182+
; CHECK-NEXT: ret void
183+
;
184+
call void @leaf_dynamic_dynamic_from_dapz_dapz()
185+
ret void
186+
}
187+
188+
; Could be fully preserve-sign,preserve-sign, but this isn't a
189+
; realistic case and we don't bother trying to handle it.
190+
define internal void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz() #5 {
191+
; CHECK-LABEL: define internal void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz
192+
; CHECK-SAME: () #[[ATTR5:[0-9]+]] {
193+
; CHECK-NEXT: call void @call_of_mystery()
194+
; CHECK-NEXT: ret void
195+
;
196+
call void @call_of_mystery()
197+
ret void
198+
}
199+
200+
; -> ieee,ieee
201+
define internal void @leaf_dynamic_ieee_from_ieee_ieee() #6 {
202+
; CHECK-LABEL: define internal void @leaf_dynamic_ieee_from_ieee_ieee
203+
; CHECK-SAME: () #[[ATTR6:[0-9]+]] {
204+
; CHECK-NEXT: call void @call_of_mystery()
205+
; CHECK-NEXT: ret void
206+
;
207+
call void @call_of_mystery()
208+
ret void
209+
}
210+
211+
; -> ieee,ieee
212+
define internal void @leaf_ieee_dynamic_from_ieee_ieee() #7 {
213+
; CHECK-LABEL: define internal void @leaf_ieee_dynamic_from_ieee_ieee
214+
; CHECK-SAME: () #[[ATTR7:[0-9]+]] {
215+
; CHECK-NEXT: call void @call_of_mystery()
216+
; CHECK-NEXT: ret void
217+
;
218+
call void @call_of_mystery()
219+
ret void
220+
}
221+
222+
; Specialize the f64 mode to ieee,ieee but leave f32 as dynamic,dynamic
223+
define internal void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic() #0 {
224+
; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic
225+
; CHECK-SAME: () #[[ATTR0]] {
226+
; CHECK-NEXT: call void @call_of_mystery()
227+
; CHECK-NEXT: ret void
228+
;
229+
call void @call_of_mystery()
230+
ret void
231+
}
232+
233+
define void @func_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic() #1 {
234+
; CHECK-LABEL: define void @func_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic
235+
; CHECK-SAME: () #[[ATTR1]] {
236+
; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic()
237+
; CHECK-NEXT: ret void
238+
;
239+
call void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic()
240+
ret void
241+
}
242+
243+
; -> preserve-sign,ieee.
244+
define internal void @leaf_daz_dynamic_from_dynamic_ieee() #8 {
245+
; CHECK-LABEL: define internal void @leaf_daz_dynamic_from_dynamic_ieee
246+
; CHECK-SAME: () #[[ATTR8:[0-9]+]] {
247+
; CHECK-NEXT: call void @call_of_mystery()
248+
; CHECK-NEXT: ret void
249+
;
250+
call void @call_of_mystery()
251+
ret void
252+
}
253+
254+
define void @dynamic_ieee() #6 {
255+
; CHECK-LABEL: define void @dynamic_ieee
256+
; CHECK-SAME: () #[[ATTR6]] {
257+
; CHECK-NEXT: call void @leaf_daz_dynamic_from_dynamic_ieee()
258+
; CHECK-NEXT: ret void
259+
;
260+
call void @leaf_daz_dynamic_from_dynamic_ieee()
261+
ret void
262+
}
263+
264+
; Leave unchanged as ieee,ieeee
265+
define internal void @leaf_ieee_ieee_from_dynamic() {
266+
; CHECK-LABEL: define internal void @leaf_ieee_ieee_from_dynamic() {
267+
; CHECK-NEXT: call void @call_of_mystery()
268+
; CHECK-NEXT: ret void
269+
;
270+
call void @call_of_mystery()
271+
ret void
272+
}
273+
274+
; Leave unchanged as dynamic,dynamic
275+
define internal void @leaf_dynamic_from_dynamic() {
276+
; CHECK-LABEL: define internal void @leaf_dynamic_from_dynamic() {
277+
; CHECK-NEXT: call void @call_of_mystery()
278+
; CHECK-NEXT: ret void
279+
;
280+
call void @call_of_mystery()
281+
ret void
282+
}
283+
284+
; Leave unchanged as preserve-sign,preserve-sign
285+
define internal void @leaf_daz_daz_from_dynamic() #3 {
286+
; CHECK-LABEL: define internal void @leaf_daz_daz_from_dynamic
287+
; CHECK-SAME: () #[[ATTR3]] {
288+
; CHECK-NEXT: call void @call_of_mystery()
289+
; CHECK-NEXT: ret void
290+
;
291+
call void @call_of_mystery()
292+
ret void
293+
}
294+
295+
define void @dynamic_dynamic() #0 {
296+
; CHECK-LABEL: define void @dynamic_dynamic
297+
; CHECK-SAME: () #[[ATTR0]] {
298+
; CHECK-NEXT: call void @leaf_ieee_ieee_from_dynamic()
299+
; CHECK-NEXT: call void @leaf_daz_daz_from_dynamic()
300+
; CHECK-NEXT: call void @leaf_dynamic_from_dynamic()
301+
; CHECK-NEXT: ret void
302+
;
303+
call void @leaf_ieee_ieee_from_dynamic()
304+
call void @leaf_daz_daz_from_dynamic()
305+
call void @leaf_dynamic_from_dynamic()
306+
ret void
307+
}
308+
309+
define internal void @leaf_ieee_f64_daz_f32() #9 {
310+
; CHECK-LABEL: define internal void @leaf_ieee_f64_daz_f32
311+
; CHECK-SAME: () #[[ATTR9:[0-9]+]] {
312+
; CHECK-NEXT: call void @call_of_mystery()
313+
; CHECK-NEXT: ret void
314+
;
315+
call void @call_of_mystery()
316+
ret void
317+
}
318+
319+
define internal void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32() #10 {
320+
; CHECK-LABEL: define internal void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32
321+
; CHECK-SAME: () #[[ATTR10:[0-9]+]] {
322+
; CHECK-NEXT: call void @call_of_mystery()
323+
; CHECK-NEXT: ret void
324+
;
325+
call void @call_of_mystery()
326+
ret void
327+
}
328+
329+
define void @ieee_f64_dynamic_f32() #1 {
330+
; CHECK-LABEL: define void @ieee_f64_dynamic_f32
331+
; CHECK-SAME: () #[[ATTR1]] {
332+
; CHECK-NEXT: call void @leaf_ieee_f64_daz_f32()
333+
; CHECK-NEXT: call void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32()
334+
; CHECK-NEXT: ret void
335+
;
336+
call void @leaf_ieee_f64_daz_f32()
337+
call void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32()
338+
ret void
339+
}
340+
341+
; => "preserve-sign,positive-zero" + "denormal-fp-math-f32"="ieee,positive-zero"
342+
define internal void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz() #11 {
343+
; CHECK-LABEL: define internal void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz
344+
; CHECK-SAME: () #[[ATTR11:[0-9]+]] {
345+
; CHECK-NEXT: call void @call_of_mystery()
346+
; CHECK-NEXT: ret void
347+
;
348+
call void @call_of_mystery()
349+
ret void
350+
}
351+
352+
define void @daz_dapz_ieee_dapz() #12 {
353+
; CHECK-LABEL: define void @daz_dapz_ieee_dapz
354+
; CHECK-SAME: () #[[ATTR12:[0-9]+]] {
355+
; CHECK-NEXT: call void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz()
356+
; CHECK-NEXT: ret void
357+
;
358+
call void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz()
359+
ret void
360+
}
361+
362+
attributes #0 = { "denormal-fp-math"="dynamic,dynamic" }
363+
attributes #1 = { "denormal-fp-math-f32"="dynamic,dynamic" }
364+
attributes #2 = { "denormal-fp-math"="ieee,ieee" }
365+
attributes #3 = { "denormal-fp-math"="preserve-sign,preserve-sign" }
366+
attributes #4 = { "denormal-fp-math"="positive-zero,positive-zero" }
367+
attributes #5 = { "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
368+
attributes #6 = { "denormal-fp-math"="dynamic,ieee" }
369+
attributes #7 = { "denormal-fp-math"="ieee,dynamic" }
370+
attributes #8 = { "denormal-fp-math"="preserve-sign,dynamic" }
371+
attributes #9 = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
372+
attributes #10 = { "denormal-fp-math"="preserve-sign,preserve-sign" "denormal-fp-math-f32"="ieee,ieee" }
373+
attributes #11 = { "denormal-fp-math"="preserve-sign,dynamic" "denormal-fp-math-f32"="dynamic,positive-zero" }
374+
attributes #12 = { "denormal-fp-math"="preserve-sign,positive-zero" "denormal-fp-math-f32"="ieee,positive-zero" }
375+
;.
376+
; CHECK: attributes #[[ATTR0]] = { "denormal-fp-math"="dynamic,dynamic" }
377+
; CHECK: attributes #[[ATTR1]] = { "denormal-fp-math-f32"="dynamic,dynamic" }
378+
; CHECK: attributes #[[ATTR2]] = { "denormal-fp-math"="ieee,ieee" }
379+
; CHECK: attributes #[[ATTR3]] = { "denormal-fp-math"="preserve-sign,preserve-sign" }
380+
; CHECK: attributes #[[ATTR4]] = { "denormal-fp-math"="positive-zero,positive-zero" }
381+
; CHECK: attributes #[[ATTR5]] = { "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
382+
; CHECK: attributes #[[ATTR6]] = { "denormal-fp-math"="dynamic,ieee" }
383+
; CHECK: attributes #[[ATTR7]] = { "denormal-fp-math"="ieee,dynamic" }
384+
; CHECK: attributes #[[ATTR8]] = { "denormal-fp-math"="preserve-sign,dynamic" }
385+
; CHECK: attributes #[[ATTR9]] = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" }
386+
; CHECK: attributes #[[ATTR10]] = { "denormal-fp-math"="preserve-sign,preserve-sign" "denormal-fp-math-f32"="ieee,ieee" }
387+
; CHECK: attributes #[[ATTR11]] = { "denormal-fp-math"="preserve-sign,dynamic" "denormal-fp-math-f32"="dynamic,positive-zero" }
388+
; CHECK: attributes #[[ATTR12]] = { "denormal-fp-math"="preserve-sign,positive-zero" "denormal-fp-math-f32"="ieee,positive-zero" }
389+
;.

0 commit comments

Comments
 (0)