@@ -3922,6 +3922,38 @@ define i1 @test_class_is_not_psub_pnorm_pinf__dynamic(float %arg) #3 {
3922
3922
ret i1 %class
3923
3923
}
3924
3924
3925
+ ; Make sure we don't take sign bit from NaN operands.
3926
+
3927
+ define i1 @minnum_qnan (i32 %x ) {
3928
+ ; CHECK-LABEL: @minnum_qnan(
3929
+ ; CHECK-NEXT: entry:
3930
+ ; CHECK-NEXT: ret i1 true
3931
+ ;
3932
+ entry:
3933
+ %qnan_bits = or i32 %x , -5938
3934
+ %qnan = bitcast i32 %qnan_bits to float
3935
+ %min = call float @llvm.minnum.f32 (float %qnan , float 0 .000000e+00 )
3936
+ %test = call i1 @llvm.is.fpclass.f32 (float %min , i32 64 )
3937
+ ret i1 %test
3938
+ }
3939
+
3940
+ define i1 @minnum_qnan_commuted (i32 %x , float nofpclass(nnorm nsub nzero ninf nan) %y ) {
3941
+ ; CHECK-LABEL: @minnum_qnan_commuted(
3942
+ ; CHECK-NEXT: entry:
3943
+ ; CHECK-NEXT: [[QNAN_BITS:%.*]] = or i32 [[X:%.*]], -5938
3944
+ ; CHECK-NEXT: [[QNAN:%.*]] = bitcast i32 [[QNAN_BITS]] to float
3945
+ ; CHECK-NEXT: [[MIN:%.*]] = call float @llvm.minnum.f32(float [[Y:%.*]], float [[QNAN]])
3946
+ ; CHECK-NEXT: [[TEST:%.*]] = call i1 @llvm.is.fpclass.f32(float [[MIN]], i32 64)
3947
+ ; CHECK-NEXT: ret i1 [[TEST]]
3948
+ ;
3949
+ entry:
3950
+ %qnan_bits = or i32 %x , -5938
3951
+ %qnan = bitcast i32 %qnan_bits to float
3952
+ %min = call float @llvm.minnum.f32 (float %y , float %qnan )
3953
+ %test = call i1 @llvm.is.fpclass.f32 (float %min , i32 64 )
3954
+ ret i1 %test
3955
+ }
3956
+
3925
3957
declare i1 @llvm.is.fpclass.f32 (float , i32 immarg)
3926
3958
declare i1 @llvm.is.fpclass.f64 (double , i32 immarg)
3927
3959
declare <2 x i1 > @llvm.is.fpclass.v2f32 (<2 x float >, i32 immarg)
0 commit comments