| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -S -passes=instsimplify %s | FileCheck %s |
| |
| define float @canonicalize_zero() { |
| ; CHECK-LABEL: @canonicalize_zero( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float 0.0) |
| ret float %ret |
| } |
| |
| define float @canonicalize_negzero() { |
| ; CHECK-LABEL: @canonicalize_negzero( |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float -0.0) |
| ret float %ret |
| } |
| |
| define <2 x float> @canonicalize_zero_vector() { |
| ; CHECK-LABEL: @canonicalize_zero_vector( |
| ; CHECK-NEXT: ret <2 x float> zeroinitializer |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> zeroinitializer) |
| ret <2 x float> %ret |
| } |
| |
| define <2 x float> @canonicalize_negzero_vector() { |
| ; CHECK-LABEL: @canonicalize_negzero_vector( |
| ; CHECK-NEXT: ret <2 x float> <float -0.000000e+00, float -0.000000e+00> |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> <float -0.0, float -0.0>) |
| ret <2 x float> %ret |
| } |
| |
| define <2 x float> @canonicalize_negzero_vector_partialundef() { |
| ; CHECK-LABEL: @canonicalize_negzero_vector_partialundef( |
| ; CHECK-NEXT: ret <2 x float> <float -0.000000e+00, float 0.000000e+00> |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> <float -0.0, float undef>) |
| ret <2 x float> %ret |
| } |
| |
| define float @canonicalize_undef() { |
| ; CHECK-LABEL: @canonicalize_undef( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float undef) |
| ret float %ret |
| } |
| |
| define <2 x float> @canonicalize_undef_vector() { |
| ; CHECK-LABEL: @canonicalize_undef_vector( |
| ; CHECK-NEXT: ret <2 x float> zeroinitializer |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> undef) |
| ret <2 x float> %ret |
| } |
| |
| define float @canonicalize_poison() { |
| ; CHECK-LABEL: @canonicalize_poison( |
| ; CHECK-NEXT: ret float poison |
| ; |
| %ret = call float @llvm.canonicalize.f32(float poison) |
| ret float %ret |
| } |
| |
| define <2 x float> @canonicalize_poison_vector() { |
| ; CHECK-LABEL: @canonicalize_poison_vector( |
| ; CHECK-NEXT: ret <2 x float> poison |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> poison) |
| ret <2 x float> %ret |
| } |
| |
| define float @canonicalize_denorm() { |
| ; CHECK-LABEL: @canonicalize_denorm( |
| ; CHECK-NEXT: ret float 0x380FFFFFC0000000 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_pos_denorm_preserve_sign_output() "denormal-fp-math"="preserve-sign,ieee" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_preserve_sign_output( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_pos_denorm_preserve_sign_input() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_preserve_sign_input( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_denorm_preserve_sign_output() "denormal-fp-math"="preserve-sign,ieee" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_preserve_sign_output( |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_denorm_preserve_sign_input() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_preserve_sign_input( |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_pos_denorm_positive_zero_output() "denormal-fp-math"="positive-zero,ieee" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_positive_zero_output( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_pos_denorm_positive_zero_input() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_positive_zero_input( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_denorm_positive_zero_output() "denormal-fp-math"="positive-zero,ieee" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_positive_zero_output( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_denorm_positive_zero_input() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_positive_zero_input( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_pos_denorm_dynamic_dynamic() "denormal-fp-math"="dynamic,dynamic" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_dynamic_dynamic( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x380FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_denorm_dynamic_dynamic() "denormal-fp-math"="dynamic,dynamic" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_dynamic_dynamic( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| ; Dynamic output - cannot flush |
| define float @canonicalize_pos_denorm_dynamic_output() "denormal-fp-math"="dynamic,ieee" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_dynamic_output( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x380FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| ; Dynamic output - cannot flush |
| define float @canonicalize_neg_denorm_dynamic_output() "denormal-fp-math"="dynamic,ieee" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_dynamic_output( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| ; Dynamic input - cannot flush |
| define float @canonicalize_pos_denorm_dynamic_input() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_dynamic_input( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x380FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| ; Dynamic input - cannot flush |
| define float @canonicalize_neg_denorm_dynamic_input() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_dynamic_input( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| ; Input is flushed, can fold |
| define float @canonicalize_pos_denorm_dynamic_output_preserve_sign_input() "denormal-fp-math"="dynamic,preserve-sign" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_dynamic_output_preserve_sign_input( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| ; Input is flushed, can fold |
| define float @canonicalize_neg_denorm_dynamic_output_preserve_sign_input() "denormal-fp-math"="dynamic,preserve-sign" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_dynamic_output_preserve_sign_input( |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| ; Output is known flushed, can fold |
| define float @canonicalize_pos_preserve_sign_output_denorm_dynamic_input() "denormal-fp-math"="preserve-sign,dynamic" { |
| ; CHECK-LABEL: @canonicalize_pos_preserve_sign_output_denorm_dynamic_input( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x380FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float)) |
| ret float %ret |
| } |
| |
| ; Output is known flushed, can fold |
| define float @canonicalize_neg_denorm_preserve_sign_output_dynamic_input() "denormal-fp-math"="preserve-sign,dynamic" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_preserve_sign_output_dynamic_input( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0xB80FFFFFC0000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_inf() { |
| ; CHECK-LABEL: @canonicalize_inf( |
| ; CHECK-NEXT: ret float 0x7FF0000000000000 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float 0x7FF0000000000000) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_inf() { |
| ; CHECK-LABEL: @canonicalize_neg_inf( |
| ; CHECK-NEXT: ret float 0xFFF0000000000000 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float 0xFFF0000000000000) |
| ret float %ret |
| } |
| |
| define float @canonicalize_qnan() { |
| ; CHECK-LABEL: @canonicalize_qnan( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x7FF8000000000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float 0x7FF8000000000000) |
| ret float %ret |
| } |
| |
| define float @canonicalize_snan() { |
| ; CHECK-LABEL: @canonicalize_snan( |
| ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x7FF0000020000000) |
| ; CHECK-NEXT: ret float [[RET]] |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_pos_normal() { |
| ; CHECK-LABEL: @canonicalize_pos_normal( |
| ; CHECK-NEXT: ret float 4.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float 4.0) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_normal() { |
| ; CHECK-LABEL: @canonicalize_neg_normal( |
| ; CHECK-NEXT: ret float -4.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float -4.0) |
| ret float %ret |
| } |
| |
| define <2 x float> @canonicalize_pos_denorm_preserve_sign_output_mixed_vector() "denormal-fp-math"="preserve-sign,ieee" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_preserve_sign_output_mixed_vector( |
| ; CHECK-NEXT: ret <2 x float> <float 0.000000e+00, float -0.000000e+00> |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> <float bitcast (i32 8388607 to float), float bitcast (i32 -2139095041 to float)>) |
| ret <2 x float> %ret |
| } |
| |
| define <2 x float> @canonicalize_pos_denorm_preserve_sign_input_mixed_vector() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_preserve_sign_input_mixed_vector( |
| ; CHECK-NEXT: ret <2 x float> <float -0.000000e+00, float 0.000000e+00> |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> <float bitcast (i32 -2139095041 to float), float bitcast (i32 8388607 to float)>) |
| ret <2 x float> %ret |
| } |
| |
| define <2 x float> @canonicalize_pos_denorm_positive_zero_output_mixed_vector() "denormal-fp-math"="positive-zero,ieee" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_positive_zero_output_mixed_vector( |
| ; CHECK-NEXT: ret <2 x float> zeroinitializer |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> <float bitcast (i32 8388607 to float), float bitcast (i32 -2139095041 to float)>) |
| ret <2 x float> %ret |
| } |
| |
| define <2 x float> @canonicalize_pos_denorm_positive_zero_input_mixed_vector() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @canonicalize_pos_denorm_positive_zero_input_mixed_vector( |
| ; CHECK-NEXT: ret <2 x float> zeroinitializer |
| ; |
| %ret = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> <float bitcast (i32 -2139095041 to float), float bitcast (i32 8388607 to float)>) |
| ret <2 x float> %ret |
| } |
| |
| define float @canonicalize_neg_denorm_preserve_sign_output_positive_zero_input() "denormal-fp-math"="preserve-sign,positive-zero" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_preserve_sign_output_positive_zero_input( |
| ; CHECK-NEXT: ret float 0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| define float @canonicalize_neg_denorm_positive_zero_output_preserve_sign_input() "denormal-fp-math"="positive-zero,preserve-sign" { |
| ; CHECK-LABEL: @canonicalize_neg_denorm_positive_zero_output_preserve_sign_input( |
| ; CHECK-NEXT: ret float -0.000000e+00 |
| ; |
| %ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float)) |
| ret float %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; f64 handling |
| ; -------------------------------------------------------------------- |
| |
| define double @canonicalize_zero_f64() { |
| ; CHECK-LABEL: @canonicalize_zero_f64( |
| ; CHECK-NEXT: ret double 0.000000e+00 |
| ; |
| %ret = call double @llvm.canonicalize.f64(double 0.0) |
| ret double %ret |
| } |
| |
| define double @canonicalize_negzero_f64() { |
| ; CHECK-LABEL: @canonicalize_negzero_f64( |
| ; CHECK-NEXT: ret double -0.000000e+00 |
| ; |
| %ret = call double @llvm.canonicalize.f64(double -0.0) |
| ret double %ret |
| } |
| |
| define double @canonicalize_1.0_f64() { |
| ; CHECK-LABEL: @canonicalize_1.0_f64( |
| ; CHECK-NEXT: ret double 1.000000e+00 |
| ; |
| %ret = call double @llvm.canonicalize.f64(double 1.0) |
| ret double %ret |
| } |
| |
| define double @canonicalize_0x00000000000001_f64() { |
| ; CHECK-LABEL: @canonicalize_0x00000000000001_f64( |
| ; CHECK-NEXT: ret double 4.940660e-324 |
| ; |
| %ret = call double @llvm.canonicalize.f64(double 0x00000000000001) |
| ret double %ret |
| } |
| |
| define double @canonicalize_inf_f64() { |
| ; CHECK-LABEL: @canonicalize_inf_f64( |
| ; CHECK-NEXT: ret double 0x7FF0000000000000 |
| ; |
| %ret = call double @llvm.canonicalize.f64(double 0x7FF0000000000000) |
| ret double %ret |
| } |
| |
| define double @canonicalize_ninf_f64() { |
| ; CHECK-LABEL: @canonicalize_ninf_f64( |
| ; CHECK-NEXT: ret double 0xFFF0000000000000 |
| ; |
| %ret = call double @llvm.canonicalize.f64(double 0xFFF0000000000000) |
| ret double %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; f16 handling |
| ; -------------------------------------------------------------------- |
| |
| define half @canonicalize_zero_f16() { |
| ; CHECK-LABEL: @canonicalize_zero_f16( |
| ; CHECK-NEXT: ret half 0xH0000 |
| ; |
| %ret = call half @llvm.canonicalize.f16(half 0.0) |
| ret half %ret |
| } |
| |
| define half @canonicalize_1.0_f16() { |
| ; CHECK-LABEL: @canonicalize_1.0_f16( |
| ; CHECK-NEXT: ret half 0xH3C00 |
| ; |
| %ret = call half @llvm.canonicalize.f16(half 1.0) |
| ret half %ret |
| } |
| |
| define half @canonicalize_0x0001_f16() { |
| ; CHECK-LABEL: @canonicalize_0x0001_f16( |
| ; CHECK-NEXT: ret half 0xH0001 |
| ; |
| %ret = call half @llvm.canonicalize.f16(half 0xH0001) |
| ret half %ret |
| } |
| |
| define half @canonicalize_inf_f16() { |
| ; CHECK-LABEL: @canonicalize_inf_f16( |
| ; CHECK-NEXT: ret half 0xH7C00 |
| ; |
| %ret = call half @llvm.canonicalize.f16(half 0xH7C00) |
| ret half %ret |
| } |
| |
| define half @canonicalize_neg_inf_f16() { |
| ; CHECK-LABEL: @canonicalize_neg_inf_f16( |
| ; CHECK-NEXT: ret half 0xHFC00 |
| ; |
| %ret = call half @llvm.canonicalize.f16(half 0xHFC00) |
| ret half %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; fp128 handling |
| ; -------------------------------------------------------------------- |
| |
| define fp128 @canonicalize_zero_fp128() { |
| ; CHECK-LABEL: @canonicalize_zero_fp128( |
| ; CHECK-NEXT: ret fp128 0xL00000000000000000000000000000000 |
| ; |
| %ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL00000000000000000000000000000000) |
| ret fp128 %ret |
| } |
| |
| define fp128 @canonicalize_1.0_fp128() { |
| ; CHECK-LABEL: @canonicalize_1.0_fp128( |
| ; CHECK-NEXT: ret fp128 0xL00000000000000003FFF000000000000 |
| ; |
| %ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL00000000000000003FFF000000000000) |
| ret fp128 %ret |
| } |
| |
| define fp128 @canonicalize_0x00000000000000000000000000000001_fp128() { |
| ; CHECK-LABEL: @canonicalize_0x00000000000000000000000000000001_fp128( |
| ; CHECK-NEXT: ret fp128 0xL00000000000000000000000000000001 |
| ; |
| %ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL00000000000000000000000000000001) |
| ret fp128 %ret |
| } |
| |
| define fp128 @canonicalize_inf_fp128() { |
| ; CHECK-LABEL: @canonicalize_inf_fp128( |
| ; CHECK-NEXT: ret fp128 0xL00000000000000007FFF000000000000 |
| ; |
| %ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL00000000000000007FFF000000000000) |
| ret fp128 %ret |
| } |
| |
| define fp128 @canonicalize_neg_inf_fp128() { |
| ; CHECK-LABEL: @canonicalize_neg_inf_fp128( |
| ; CHECK-NEXT: ret fp128 0xL0000000000000000FFFF000000000000 |
| ; |
| %ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL0000000000000000FFFF000000000000) |
| ret fp128 %ret |
| } |
| |
| define fp128 @canonicalize_nan_fp128() { |
| ; CHECK-LABEL: @canonicalize_nan_fp128( |
| ; CHECK-NEXT: [[RET:%.*]] = call fp128 @llvm.canonicalize.f128(fp128 0xL00000000000000007FFF800000000000) |
| ; CHECK-NEXT: ret fp128 [[RET]] |
| ; |
| %ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL00000000000000007FFF800000000000) |
| ret fp128 %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; bfloat handling |
| ; -------------------------------------------------------------------- |
| |
| define bfloat @canonicalize_zero_bf16() { |
| ; CHECK-LABEL: @canonicalize_zero_bf16( |
| ; CHECK-NEXT: ret bfloat 0xR0000 |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 0.0) |
| ret bfloat %ret |
| } |
| |
| define bfloat @canonicalize_1.0_bf16() { |
| ; CHECK-LABEL: @canonicalize_1.0_bf16( |
| ; CHECK-NEXT: ret bfloat 0xR3F80 |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 1.0) |
| ret bfloat %ret |
| } |
| |
| define bfloat @canonicalize_0x0001_bf16() { |
| ; CHECK-LABEL: @canonicalize_0x0001_bf16( |
| ; CHECK-NEXT: ret bfloat 0xR0001 |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 0xR0001) |
| ret bfloat %ret |
| } |
| |
| define bfloat @canonicalize_inf_bf16() { |
| ; CHECK-LABEL: @canonicalize_inf_bf16( |
| ; CHECK-NEXT: ret bfloat 0xR7F80 |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 0xR7F80) |
| ret bfloat %ret |
| } |
| |
| define bfloat @canonicalize_neg_inf_bf16() { |
| ; CHECK-LABEL: @canonicalize_neg_inf_bf16( |
| ; CHECK-NEXT: ret bfloat 0xRFF80 |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 0xRFF80) |
| ret bfloat %ret |
| } |
| |
| define bfloat @canonicalize_nan_bf16() { |
| ; CHECK-LABEL: @canonicalize_nan_bf16( |
| ; CHECK-NEXT: [[RET:%.*]] = call bfloat @llvm.canonicalize.bf16(bfloat 0xR7FC0) |
| ; CHECK-NEXT: ret bfloat [[RET]] |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 0xR7FC0) |
| ret bfloat %ret |
| } |
| |
| define bfloat @canonicalize_0xff_bf16() { |
| ; CHECK-LABEL: @canonicalize_0xff_bf16( |
| ; CHECK-NEXT: ret bfloat 0xR00FF |
| ; |
| %ret = call bfloat @llvm.canonicalize.bf16(bfloat 0xR00FF) |
| ret bfloat %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; f80 handling |
| ; -------------------------------------------------------------------- |
| |
| define x86_fp80 @canonicalize_poison_f80() { |
| ; CHECK-LABEL: @canonicalize_poison_f80( |
| ; CHECK-NEXT: ret x86_fp80 poison |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 poison) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_undef_f80() { |
| ; CHECK-LABEL: @canonicalize_undef_f80( |
| ; CHECK-NEXT: ret x86_fp80 0xK00000000000000000000 |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 undef) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_zero_f80() { |
| ; CHECK-LABEL: @canonicalize_zero_f80( |
| ; CHECK-NEXT: ret x86_fp80 0xK00000000000000000000 |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK00000000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_negzero_f80() { |
| ; CHECK-LABEL: @canonicalize_negzero_f80( |
| ; CHECK-NEXT: ret x86_fp80 0xK80000000000000000000 |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK80000000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_inf_f80() { |
| ; CHECK-LABEL: @canonicalize_inf_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK7FFF8000000000000000) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK7FFF8000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_ninf_f80() { |
| ; CHECK-LABEL: @canonicalize_ninf_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKFFFF8000000000000000) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKFFFF8000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_qnan_f80() { |
| ; CHECK-LABEL: @canonicalize_qnan_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKFFFFC000000000000000) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKFFFFC000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_snan_f80() { |
| ; CHECK-LABEL: @canonicalize_snan_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKFFFFE000000000000000) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKFFFFE000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_1.0_f80() { |
| ; CHECK-LABEL: @canonicalize_1.0_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK3FFF8000000000000000) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK3FFF8000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_neg1.0_f80() { |
| ; CHECK-LABEL: @canonicalize_neg1.0_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKBFFF8000000000000000) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xKBFFF8000000000000000) |
| ret x86_fp80 %ret |
| } |
| |
| define x86_fp80 @canonicalize_0xK00000000000000000001_f80() { |
| ; CHECK-LABEL: @canonicalize_0xK00000000000000000001_f80( |
| ; CHECK-NEXT: [[RET:%.*]] = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK00000000000000000001) |
| ; CHECK-NEXT: ret x86_fp80 [[RET]] |
| ; |
| %ret = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 0xK00000000000000000001) |
| ret x86_fp80 %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; ppc_fp128 handling |
| ; -------------------------------------------------------------------- |
| |
| define ppc_fp128 @canonicalize_poison_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_poison_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 poison |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 poison) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_undef_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_undef_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 0xM00000000000000000000000000000000 |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 undef) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_zero_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_zero_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 0xM00000000000000000000000000000000 |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM00000000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_negzero_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_negzero_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 0xM80000000000000000000000000000000 |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM80000000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_noncanonical_zero_0_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_noncanonical_zero_0_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 0xM00000000000000000000000000000000 |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM0000000000000000ffffffffffffffff) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_noncanonical_zero_1_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_noncanonical_zero_1_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 0xM00000000000000000000000000000000 |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM00000000000000000000000000000001) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_noncanonical_negzero_0_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_noncanonical_negzero_0_ppcf128( |
| ; CHECK-NEXT: ret ppc_fp128 0xM80000000000000000000000000000000 |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM8000000000000000ffffffffffffffff) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_inf_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_inf_ppcf128( |
| ; CHECK-NEXT: [[RET:%.*]] = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM7FF00000000000000000000000000000) |
| ; CHECK-NEXT: ret ppc_fp128 [[RET]] |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM7FF00000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_neginf_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_neginf_ppcf128( |
| ; CHECK-NEXT: [[RET:%.*]] = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMFFF00000000000000000000000000000) |
| ; CHECK-NEXT: ret ppc_fp128 [[RET]] |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMFFF00000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_qnan_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_qnan_ppcf128( |
| ; CHECK-NEXT: [[RET:%.*]] = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMFFF80000000000000000000000000000) |
| ; CHECK-NEXT: ret ppc_fp128 [[RET]] |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMFFF80000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_snan_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_snan_ppcf128( |
| ; CHECK-NEXT: [[RET:%.*]] = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMFFFC0000000000000000000000000000) |
| ; CHECK-NEXT: ret ppc_fp128 [[RET]] |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMFFFC0000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_1.0_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_1.0_ppcf128( |
| ; CHECK-NEXT: [[RET:%.*]] = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM3FF00000000000000000000000000000) |
| ; CHECK-NEXT: ret ppc_fp128 [[RET]] |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xM3FF00000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| define ppc_fp128 @canonicalize_neg1.0_ppcf128() { |
| ; CHECK-LABEL: @canonicalize_neg1.0_ppcf128( |
| ; CHECK-NEXT: [[RET:%.*]] = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMBFF00000000000000000000000000000) |
| ; CHECK-NEXT: ret ppc_fp128 [[RET]] |
| ; |
| %ret = call ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128 0xMBFF00000000000000000000000000000) |
| ret ppc_fp128 %ret |
| } |
| |
| ; -------------------------------------------------------------------- |
| ; Test folds of using canonicalize + is.fpclass to inspect the denormal mode. |
| ; -------------------------------------------------------------------- |
| |
| define i1 @is_poszero_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_dynamic( |
| ; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0x36A0000000000000) |
| ; CHECK-NEXT: [[IS_POS_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 64) |
| ; CHECK-NEXT: ret i1 [[IS_POS_ZERO]] |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_preserve_sign_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_dynamic( |
| ; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0xB6A0000000000000) |
| ; CHECK-NEXT: [[IS_NEG_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 32) |
| ; CHECK-NEXT: ret i1 [[IS_NEG_ZERO]] |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32) |
| ret i1 %is.neg.zero |
| } |
| |
| define i1 @is_positive_zero_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @is_positive_zero_daz_enabled_check_dynamic( |
| ; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0xB6A0000000000000) |
| ; CHECK-NEXT: [[IS_POS_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 64) |
| ; CHECK-NEXT: ret i1 [[IS_POS_ZERO]] |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_any_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @is_any_daz_enabled_check_dynamic( |
| ; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0xB6A0000000000000) |
| ; CHECK-NEXT: [[IS_ANY_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 96) |
| ; CHECK-NEXT: ret i1 [[IS_ANY_ZERO]] |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96) |
| ret i1 %is.any.zero |
| } |
| |
| define i1 @is_not_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @is_not_daz_enabled_check_dynamic( |
| ; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0x36A0000000000000) |
| ; CHECK-NEXT: [[IS_NOT_POS_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 959) |
| ; CHECK-NEXT: ret i1 [[IS_NOT_POS_ZERO]] |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959) |
| ret i1 %is.not.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_ieee( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_preserve_sign_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" { |
| ; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_ieee( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32) |
| ret i1 %is.neg.zero |
| } |
| |
| define i1 @is_positive_zero_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" { |
| ; CHECK-LABEL: @is_positive_zero_daz_enabled_check_ieee( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_any_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" { |
| ; CHECK-LABEL: @is_any_daz_enabled_check_ieee( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96) |
| ret i1 %is.any.zero |
| } |
| |
| define i1 @is_not_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" { |
| ; CHECK-LABEL: @is_not_daz_enabled_check_ieee( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959) |
| ret i1 %is.not.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_preserve_sign( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_preserve_sign_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_preserve_sign( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32) |
| ret i1 %is.neg.zero |
| } |
| |
| define i1 @is_positive_zero_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @is_positive_zero_daz_enabled_check_preserve_sign( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_any_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @is_any_daz_enabled_check_preserve_sign( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96) |
| ret i1 %is.any.zero |
| } |
| |
| define i1 @is_not_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @is_not_daz_enabled_check_preserve_sign( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959) |
| ret i1 %is.not.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_positive_zero( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_preserve_sign_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_positive_zero( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32) |
| ret i1 %is.neg.zero |
| } |
| |
| define i1 @is_positive_zero_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @is_positive_zero_daz_enabled_check_positive_zero( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64) |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_any_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @is_any_daz_enabled_check_positive_zero( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float)) |
| %is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96) |
| ret i1 %is.any.zero |
| } |
| |
| define i1 @is_not_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @is_not_daz_enabled_check_positive_zero( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959) |
| ret i1 %is.not.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_dynamic_bitcast() "denormal-fp-math"="ieee,dynamic" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_dynamic_bitcast( |
| ; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0x36A0000000000000) |
| ; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[CANONICAL]] to i32 |
| ; CHECK-NEXT: [[IS_POS_ZERO:%.*]] = icmp eq i32 [[BITCAST]], 0 |
| ; CHECK-NEXT: ret i1 [[IS_POS_ZERO]] |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %bitcast = bitcast float %canonical to i32 |
| %is.pos.zero = icmp eq i32 %bitcast, 0 |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_preserve_sign_bitcast() "denormal-fp-math"="ieee,preserve-sign" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_preserve_sign_bitcast( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %bitcast = bitcast float %canonical to i32 |
| %is.pos.zero = icmp eq i32 %bitcast, 0 |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_positive_zero_bitcast() "denormal-fp-math"="ieee,positive-zero" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_positive_zero_bitcast( |
| ; CHECK-NEXT: ret i1 true |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %bitcast = bitcast float %canonical to i32 |
| %is.pos.zero = icmp eq i32 %bitcast, 0 |
| ret i1 %is.pos.zero |
| } |
| |
| define i1 @is_poszero_daz_enabled_check_ieee_bitcast() "denormal-fp-math"="ieee,ieee" { |
| ; CHECK-LABEL: @is_poszero_daz_enabled_check_ieee_bitcast( |
| ; CHECK-NEXT: ret i1 false |
| ; |
| %canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float)) |
| %bitcast = bitcast float %canonical to i32 |
| %is.pos.zero = icmp eq i32 %bitcast, 0 |
| ret i1 %is.pos.zero |
| } |
| |
| declare bfloat @llvm.canonicalize.bf16(bfloat) |
| declare half @llvm.canonicalize.f16(half) |
| declare float @llvm.canonicalize.f32(float) |
| declare <2 x float> @llvm.canonicalize.v2f32(<2 x float>) |
| declare double @llvm.canonicalize.f64(double) |
| declare fp128 @llvm.canonicalize.fp128(fp128) |
| declare x86_fp80 @llvm.canonicalize.f80(x86_fp80) |
| declare ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128) |
| declare i1 @llvm.is.fpclass.f32(float, i32 immarg) |