@@ -448,3 +448,76 @@ define bfloat @bf16_frem(bfloat %x) {
448448 %t3 = fptrunc float %t2 to bfloat
449449 ret bfloat %t3
450450}
451+
452+ define double @fptrunc_fpextend_nofast (double %x , double %y , double %z ) {
453+ ; CHECK-LABEL: @fptrunc_fpextend_nofast(
454+ ; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X:%.*]], [[Y:%.*]]
455+ ; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc double [[ADD1]] to float
456+ ; CHECK-NEXT: [[EXT:%.*]] = fpext float [[TRUNC]] to double
457+ ; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[Z:%.*]], [[EXT]]
458+ ; CHECK-NEXT: ret double [[ADD2]]
459+ ;
460+ %add1 = fadd double %x , %y
461+ %trunc = fptrunc double %add1 to float
462+ %ext = fpext float %trunc to double
463+ %add2 = fadd double %ext , %z
464+ ret double %add2
465+ }
466+
467+ define double @fptrunc_fpextend_fast (double %x , double %y , double %z ) {
468+ ; CHECK-LABEL: @fptrunc_fpextend_fast(
469+ ; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X:%.*]], [[Y:%.*]]
470+ ; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[ADD1]], [[Z:%.*]]
471+ ; CHECK-NEXT: ret double [[ADD2]]
472+ ;
473+ %add1 = fadd double %x , %y
474+ %trunc = fptrunc contract double %add1 to float
475+ %ext = fpext nnan ninf contract float %trunc to double
476+ %add2 = fadd double %ext , %z
477+ ret double %add2
478+ }
479+
480+ define float @fptrunc_fpextend_result_smaller (double %x , double %y , float %z ) {
481+ ; CHECK-LABEL: @fptrunc_fpextend_result_smaller(
482+ ; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X:%.*]], [[Y:%.*]]
483+ ; CHECK-NEXT: [[EXT:%.*]] = fptrunc nnan ninf contract double [[ADD1]] to float
484+ ; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[Z:%.*]], [[EXT]]
485+ ; CHECK-NEXT: ret float [[ADD2]]
486+ ;
487+ %add1 = fadd double %x , %y
488+ %trunc = fptrunc contract double %add1 to half
489+ %ext = fpext nnan ninf contract half %trunc to float
490+ %add2 = fadd float %ext , %z
491+ ret float %add2
492+ }
493+
494+ define double @fptrunc_fpextend_result_larger (float %x , float %y , double %z ) {
495+ ; CHECK-LABEL: @fptrunc_fpextend_result_larger(
496+ ; CHECK-NEXT: [[ADD1:%.*]] = fadd float [[X:%.*]], [[Y:%.*]]
497+ ; CHECK-NEXT: [[EXT:%.*]] = fpext nnan ninf contract float [[ADD1]] to double
498+ ; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[Z:%.*]], [[EXT]]
499+ ; CHECK-NEXT: ret double [[ADD2]]
500+ ;
501+ %add1 = fadd float %x , %y
502+ %trunc = fptrunc contract float %add1 to half
503+ %ext = fpext nnan ninf contract half %trunc to double
504+ %add2 = fadd double %ext , %z
505+ ret double %add2
506+ }
507+
508+ define double @fptrunc_fpextend_multiple_use (double %x , double %y , double %a , double %b ) {
509+ ; CHECK-LABEL: @fptrunc_fpextend_multiple_use(
510+ ; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X:%.*]], [[Y:%.*]]
511+ ; CHECK-NEXT: [[ADD2:%.*]] = fadd double [[ADD1]], [[A:%.*]]
512+ ; CHECK-NEXT: [[ADD3:%.*]] = fadd double [[ADD1]], [[B:%.*]]
513+ ; CHECK-NEXT: [[MUL:%.*]] = fmul double [[ADD2]], [[ADD3]]
514+ ; CHECK-NEXT: ret double [[MUL]]
515+ ;
516+ %add1 = fadd double %x , %y
517+ %trunc = fptrunc contract double %add1 to float
518+ %ext = fpext nnan ninf contract float %trunc to double
519+ %add2 = fadd double %ext , %a
520+ %add3 = fadd double %ext , %b
521+ %mul = fmul double %add2 , %add3
522+ ret double %mul
523+ }
0 commit comments