@@ -716,3 +716,110 @@ define fp128 @sqrt_call_squared_f128(fp128 %x) #0 {
716
716
; CHECK-NEXT: ret fp128 %fabs
717
717
}
718
718
719
+ ; =========================================================================
720
+ ;
721
+ ; Test-cases for fmin / fmax
722
+ ;
723
+ ; =========================================================================
724
+
725
+ declare double @fmax (double , double )
726
+ declare double @fmin (double , double )
727
+ declare float @fmaxf (float , float )
728
+ declare float @fminf (float , float )
729
+ declare fp128 @fmaxl (fp128 , fp128 )
730
+ declare fp128 @fminl (fp128 , fp128 )
731
+
732
+ ; No NaNs is the minimum requirement to replace these calls.
733
+ ; This should always be set when unsafe-fp-math is true, but
734
+ ; alternate the attributes for additional test coverage.
735
+ ; 'nsz' is implied by the definition of fmax or fmin itself.
736
+ attributes #1 = { "no-nans-fp-math" = "true" }
737
+
738
+ ; Shrink and remove the call.
739
+ define float @max1 (float %a , float %b ) #0 {
740
+ %c = fpext float %a to double
741
+ %d = fpext float %b to double
742
+ %e = call double @fmax (double %c , double %d )
743
+ %f = fptrunc double %e to float
744
+ ret float %f
745
+
746
+ ; CHECK-LABEL: max1(
747
+ ; CHECK-NEXT: fcmp fast ogt float %a, %b
748
+ ; CHECK-NEXT: select {{.*}} float %a, float %b
749
+ ; CHECK-NEXT: ret
750
+ }
751
+
752
+ define float @max2 (float %a , float %b ) #1 {
753
+ %c = call float @fmaxf (float %a , float %b )
754
+ ret float %c
755
+
756
+ ; CHECK-LABEL: max2(
757
+ ; CHECK-NEXT: fcmp nnan nsz ogt float %a, %b
758
+ ; CHECK-NEXT: select {{.*}} float %a, float %b
759
+ ; CHECK-NEXT: ret
760
+ }
761
+
762
+
763
+ define double @max3 (double %a , double %b ) #0 {
764
+ %c = call double @fmax (double %a , double %b )
765
+ ret double %c
766
+
767
+ ; CHECK-LABEL: max3(
768
+ ; CHECK-NEXT: fcmp fast ogt double %a, %b
769
+ ; CHECK-NEXT: select {{.*}} double %a, double %b
770
+ ; CHECK-NEXT: ret
771
+ }
772
+
773
+ define fp128 @max4 (fp128 %a , fp128 %b ) #1 {
774
+ %c = call fp128 @fmaxl (fp128 %a , fp128 %b )
775
+ ret fp128 %c
776
+
777
+ ; CHECK-LABEL: max4(
778
+ ; CHECK-NEXT: fcmp nnan nsz ogt fp128 %a, %b
779
+ ; CHECK-NEXT: select {{.*}} fp128 %a, fp128 %b
780
+ ; CHECK-NEXT: ret
781
+ }
782
+
783
+ ; Shrink and remove the call.
784
+ define float @min1 (float %a , float %b ) #1 {
785
+ %c = fpext float %a to double
786
+ %d = fpext float %b to double
787
+ %e = call double @fmin (double %c , double %d )
788
+ %f = fptrunc double %e to float
789
+ ret float %f
790
+
791
+ ; CHECK-LABEL: min1(
792
+ ; CHECK-NEXT: fcmp nnan nsz olt float %a, %b
793
+ ; CHECK-NEXT: select {{.*}} float %a, float %b
794
+ ; CHECK-NEXT: ret
795
+ }
796
+
797
+ define float @min2 (float %a , float %b ) #0 {
798
+ %c = call float @fminf (float %a , float %b )
799
+ ret float %c
800
+
801
+ ; CHECK-LABEL: min2(
802
+ ; CHECK-NEXT: fcmp fast olt float %a, %b
803
+ ; CHECK-NEXT: select {{.*}} float %a, float %b
804
+ ; CHECK-NEXT: ret
805
+ }
806
+
807
+ define double @min3 (double %a , double %b ) #1 {
808
+ %c = call double @fmin (double %a , double %b )
809
+ ret double %c
810
+
811
+ ; CHECK-LABEL: min3(
812
+ ; CHECK-NEXT: fcmp nnan nsz olt double %a, %b
813
+ ; CHECK-NEXT: select {{.*}} double %a, double %b
814
+ ; CHECK-NEXT: ret
815
+ }
816
+
817
+ define fp128 @min4 (fp128 %a , fp128 %b ) #0 {
818
+ %c = call fp128 @fminl (fp128 %a , fp128 %b )
819
+ ret fp128 %c
820
+
821
+ ; CHECK-LABEL: min4(
822
+ ; CHECK-NEXT: fcmp fast olt fp128 %a, %b
823
+ ; CHECK-NEXT: select {{.*}} fp128 %a, fp128 %b
824
+ ; CHECK-NEXT: ret
825
+ }
0 commit comments