Skip to content

Commit 9348d83

Browse files
committed
ValueTracking: Add some baseline tests for issue llvm#63316
1 parent eed4a4d commit 9348d83

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed

llvm/test/Transforms/Attributor/nofpclass-nan-fmul.ll

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,176 @@ define float @ret_fmul_square_nnan_nzero(float nofpclass(nan zero) %arg) #0 {
194194
ret float %fmul
195195
}
196196

197+
define float @ret_fmul_ieee_inf(float %arg) {
198+
; CHECK-LABEL: define float @ret_fmul_ieee_inf
199+
; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR4:[0-9]+]] {
200+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG]], 0x7FF0000000000000
201+
; CHECK-NEXT: ret float [[FMUL]]
202+
;
203+
%fmul = fmul float %arg, 0x7FF0000000000000
204+
ret float %fmul
205+
}
206+
207+
define float @ret_fmul_ieee_any__noinf(float %arg0, float nofpclass(inf) %arg1) {
208+
; CHECK-LABEL: define float @ret_fmul_ieee_any__noinf
209+
; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR4]] {
210+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
211+
; CHECK-NEXT: ret float [[FMUL]]
212+
;
213+
%fmul = fmul float %arg0, %arg1
214+
ret float %fmul
215+
}
216+
217+
define float @ret_fmul_ieee_noinf__any(float nofpclass(inf) %arg0, float %arg1) {
218+
; CHECK-LABEL: define float @ret_fmul_ieee_noinf__any
219+
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR4]] {
220+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
221+
; CHECK-NEXT: ret float [[FMUL]]
222+
;
223+
%fmul = fmul float %arg0, %arg1
224+
ret float %fmul
225+
}
226+
227+
define float @ret_fmul_ieee_noinf__noinf(float nofpclass(inf) %arg0, float nofpclass(inf) %arg1) {
228+
; CHECK-LABEL: define float @ret_fmul_ieee_noinf__noinf
229+
; CHECK-SAME: (float nofpclass(inf) [[ARG0:%.*]], float nofpclass(inf) [[ARG1:%.*]]) #[[ATTR4]] {
230+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
231+
; CHECK-NEXT: ret float [[FMUL]]
232+
;
233+
%fmul = fmul float %arg0, %arg1
234+
ret float %fmul
235+
}
236+
237+
define float @ret_fmul_ieee_any__noinf_nonan(float %arg0, float nofpclass(inf nan) %arg1) {
238+
; CHECK-LABEL: define float @ret_fmul_ieee_any__noinf_nonan
239+
; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR4]] {
240+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
241+
; CHECK-NEXT: ret float [[FMUL]]
242+
;
243+
%fmul = fmul float %arg0, %arg1
244+
ret float %fmul
245+
}
246+
247+
define float @ret_fmul_ieee_noinf_nonan__any(float nofpclass(inf nan) %arg0, float %arg1) {
248+
; CHECK-LABEL: define float @ret_fmul_ieee_noinf_nonan__any
249+
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR4]] {
250+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
251+
; CHECK-NEXT: ret float [[FMUL]]
252+
;
253+
%fmul = fmul float %arg0, %arg1
254+
ret float %fmul
255+
}
256+
257+
define float @ret_fmul_ieee_noinf_nonan__noinf_noann(float nofpclass(inf nan) %arg0, float nofpclass(inf nan) %arg1) {
258+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_noinf_nonan__noinf_noann
259+
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR4]] {
260+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
261+
; CHECK-NEXT: ret float [[FMUL]]
262+
;
263+
%fmul = fmul float %arg0, %arg1
264+
ret float %fmul
265+
}
266+
267+
define float @ret_fmul_ieee_nozero__noinf_nonan(float nofpclass(zero) %arg0, float nofpclass(inf nan) %arg1) {
268+
; CHECK-LABEL: define float @ret_fmul_ieee_nozero__noinf_nonan
269+
; CHECK-SAME: (float nofpclass(zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR4]] {
270+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
271+
; CHECK-NEXT: ret float [[FMUL]]
272+
;
273+
%fmul = fmul float %arg0, %arg1
274+
ret float %fmul
275+
}
276+
277+
define float @ret_fmul_ieee_noinf_nonan__nozero(float nofpclass(inf nan) %arg0, float nofpclass(zero) %arg1) {
278+
; CHECK-LABEL: define float @ret_fmul_ieee_noinf_nonan__nozero
279+
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(zero) [[ARG1:%.*]]) #[[ATTR4]] {
280+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
281+
; CHECK-NEXT: ret float [[FMUL]]
282+
;
283+
%fmul = fmul float %arg0, %arg1
284+
ret float %fmul
285+
}
286+
287+
define float @ret_fmul_ieee_nozero_nonan__noinf_nonan(float nofpclass(zero nan) %arg0, float nofpclass(inf nan) %arg1) {
288+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nozero_nonan__noinf_nonan
289+
; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR4]] {
290+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
291+
; CHECK-NEXT: ret float [[FMUL]]
292+
;
293+
%fmul = fmul float %arg0, %arg1
294+
ret float %fmul
295+
}
296+
297+
define float @ret_fmul_ieee_noinf_nonan__nozero_nonan(float nofpclass(inf nan) %arg0, float nofpclass(zero nan) %arg1) {
298+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_noinf_nonan__nozero_nonan
299+
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR4]] {
300+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
301+
; CHECK-NEXT: ret float [[FMUL]]
302+
;
303+
%fmul = fmul float %arg0, %arg1
304+
ret float %fmul
305+
}
306+
307+
define float @ret_fmul_ieee_nozero_nonan_noinf__noinf_nonan(float nofpclass(zero nan inf) %arg0, float nofpclass(inf nan) %arg1) {
308+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nozero_nonan_noinf__noinf_nonan
309+
; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan inf) [[ARG1:%.*]]) #[[ATTR4]] {
310+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
311+
; CHECK-NEXT: ret float [[FMUL]]
312+
;
313+
%fmul = fmul float %arg0, %arg1
314+
ret float %fmul
315+
}
316+
317+
define float @ret_fmul_ieee_noinf_nonan__nozero_nonan_noinf(float nofpclass(inf nan) %arg0, float nofpclass(zero nan inf) %arg1) {
318+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_noinf_nonan__nozero_nonan_noinf
319+
; CHECK-SAME: (float nofpclass(nan inf) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR4]] {
320+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
321+
; CHECK-NEXT: ret float [[FMUL]]
322+
;
323+
%fmul = fmul float %arg0, %arg1
324+
ret float %fmul
325+
}
326+
327+
define float @ret_fmul_ieee_nozero_nonan_noinf__nozero_nonan(float nofpclass(zero nan inf) %arg0, float nofpclass(zero nan) %arg1) {
328+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nozero_nonan_noinf__nozero_nonan
329+
; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan zero) [[ARG1:%.*]]) #[[ATTR4]] {
330+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
331+
; CHECK-NEXT: ret float [[FMUL]]
332+
;
333+
%fmul = fmul float %arg0, %arg1
334+
ret float %fmul
335+
}
336+
337+
define float @ret_fmul_ieee_nozero_nonan__nozero_nonan_noinf(float nofpclass(zero nan) %arg0, float nofpclass(zero nan inf) %arg1) {
338+
; CHECK-LABEL: define nofpclass(nan) float @ret_fmul_ieee_nozero_nonan__nozero_nonan_noinf
339+
; CHECK-SAME: (float nofpclass(nan zero) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR4]] {
340+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
341+
; CHECK-NEXT: ret float [[FMUL]]
342+
;
343+
%fmul = fmul float %arg0, %arg1
344+
ret float %fmul
345+
}
346+
347+
define float @ret_fmul_ieee_nozero_nonan_noinf__nonan(float nofpclass(zero nan inf) %arg0, float nofpclass(nan) %arg1) {
348+
; CHECK-LABEL: define float @ret_fmul_ieee_nozero_nonan_noinf__nonan
349+
; CHECK-SAME: (float nofpclass(nan inf zero) [[ARG0:%.*]], float nofpclass(nan) [[ARG1:%.*]]) #[[ATTR4]] {
350+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
351+
; CHECK-NEXT: ret float [[FMUL]]
352+
;
353+
%fmul = fmul float %arg0, %arg1
354+
ret float %fmul
355+
}
356+
357+
define float @ret_fmul_ieee_nonan__nozero_nonan_noinf(float nofpclass(nan) %arg0, float nofpclass(zero nan inf) %arg1) {
358+
; CHECK-LABEL: define float @ret_fmul_ieee_nonan__nozero_nonan_noinf
359+
; CHECK-SAME: (float nofpclass(nan) [[ARG0:%.*]], float nofpclass(nan inf zero) [[ARG1:%.*]]) #[[ATTR4]] {
360+
; CHECK-NEXT: [[FMUL:%.*]] = fmul float [[ARG0]], [[ARG1]]
361+
; CHECK-NEXT: ret float [[FMUL]]
362+
;
363+
%fmul = fmul float %arg0, %arg1
364+
ret float %fmul
365+
}
366+
197367
attributes #0 = { "denormal-fp-math"="ieee,ieee" }
198368
attributes #1 = { "denormal-fp-math"="ieee,preserve-sign" }
199369
attributes #2 = { "denormal-fp-math"="ieee,positive-zero" }

llvm/test/Transforms/InstSimplify/known-never-nan.ll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,3 +555,24 @@ unwind:
555555
landingpad ptr cleanup
556556
resume ptr null
557557
}
558+
559+
; This should not fold to false because fmul 0 * inf = nan
560+
define i1 @issue63316(i64 %arg) {
561+
; CHECK-LABEL: @issue63316(
562+
; CHECK-NEXT: ret i1 false
563+
;
564+
%sitofp = sitofp i64 %arg to float
565+
%fmul = fmul float %sitofp, 0x7FF0000000000000
566+
%fcmp = fcmp uno float %fmul, 0.000000e+00
567+
ret i1 %fcmp
568+
}
569+
570+
define i1 @issue63316_commute(i64 %arg) {
571+
; CHECK-LABEL: @issue63316_commute(
572+
; CHECK-NEXT: ret i1 false
573+
;
574+
%sitofp = sitofp i64 %arg to float
575+
%fmul = fmul float 0x7FF0000000000000, %sitofp
576+
%fcmp = fcmp uno float %fmul, 0.000000e+00
577+
ret i1 %fcmp
578+
}

0 commit comments

Comments
 (0)