Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 2a38970

Browse files
committed
Revert "ConstantFolding: Constant fold denormal inputs to canonicalize for IEEE"
This reverts commit a09d9b4. The commit triggers CTS failures in dEQP-VK.spirv_assembly.instruction.*.float_controls.fp32.generated_args.upack_half_denorm_flush_to_zero* Change-Id: I5c7e0912cee97dbdf2b9ccd3010d3867d4effa81
1 parent ccc4331 commit 2a38970

File tree

2 files changed

+12
-244
lines changed

2 files changed

+12
-244
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1959,8 +1959,9 @@ static Constant *constantFoldCanonicalize(const Type *Ty, const CallBase *CI,
19591959
DenormalMode DenormMode =
19601960
CI->getFunction()->getDenormalMode(Src.getSemantics());
19611961

1962+
// TODO: Should allow folding for pure IEEE.
19621963
if (DenormMode == DenormalMode::getIEEE())
1963-
return ConstantFP::get(CI->getContext(), Src);
1964+
return nullptr;
19641965

19651966
if (DenormMode.Input == DenormalMode::Dynamic)
19661967
return nullptr;

llvm/test/Transforms/InstSimplify/canonicalize.ll

Lines changed: 10 additions & 243 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ define <2 x float> @canonicalize_poison_vector() {
7575

7676
define float @canonicalize_denorm() {
7777
; CHECK-LABEL: @canonicalize_denorm(
78-
; CHECK-NEXT: ret float 0x380FFFFFC0000000
78+
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.canonicalize.f32(float 0x380FFFFFC0000000)
79+
; CHECK-NEXT: ret float [[RET]]
7980
;
8081
%ret = call float @llvm.canonicalize.f32(float bitcast (i32 8388607 to float))
8182
ret float %ret
@@ -369,7 +370,8 @@ define double @canonicalize_1.0_f64() {
369370

370371
define double @canonicalize_0x00000000000001_f64() {
371372
; CHECK-LABEL: @canonicalize_0x00000000000001_f64(
372-
; CHECK-NEXT: ret double 4.940660e-324
373+
; CHECK-NEXT: [[RET:%.*]] = call double @llvm.canonicalize.f64(double 4.940660e-324)
374+
; CHECK-NEXT: ret double [[RET]]
373375
;
374376
%ret = call double @llvm.canonicalize.f64(double 0x00000000000001)
375377
ret double %ret
@@ -413,7 +415,8 @@ define half @canonicalize_1.0_f16() {
413415

414416
define half @canonicalize_0x0001_f16() {
415417
; CHECK-LABEL: @canonicalize_0x0001_f16(
416-
; CHECK-NEXT: ret half 0xH0001
418+
; CHECK-NEXT: [[RET:%.*]] = call half @llvm.canonicalize.f16(half 0xH0001)
419+
; CHECK-NEXT: ret half [[RET]]
417420
;
418421
%ret = call half @llvm.canonicalize.f16(half 0xH0001)
419422
ret half %ret
@@ -457,7 +460,8 @@ define fp128 @canonicalize_1.0_fp128() {
457460

458461
define fp128 @canonicalize_0x00000000000000000000000000000001_fp128() {
459462
; CHECK-LABEL: @canonicalize_0x00000000000000000000000000000001_fp128(
460-
; CHECK-NEXT: ret fp128 0xL00000000000000000000000000000001
463+
; CHECK-NEXT: [[RET:%.*]] = call fp128 @llvm.canonicalize.f128(fp128 0xL00000000000000000000000000000001)
464+
; CHECK-NEXT: ret fp128 [[RET]]
461465
;
462466
%ret = call fp128 @llvm.canonicalize.fp128(fp128 0xL00000000000000000000000000000001)
463467
ret fp128 %ret
@@ -510,7 +514,8 @@ define bfloat @canonicalize_1.0_bf16() {
510514

511515
define bfloat @canonicalize_0x0001_bf16() {
512516
; CHECK-LABEL: @canonicalize_0x0001_bf16(
513-
; CHECK-NEXT: ret bfloat 0xR0001
517+
; CHECK-NEXT: [[RET:%.*]] = call bfloat @llvm.canonicalize.bf16(bfloat 0xR0001)
518+
; CHECK-NEXT: ret bfloat [[RET]]
514519
;
515520
%ret = call bfloat @llvm.canonicalize.bf16(bfloat 0xR0001)
516521
ret bfloat %ret
@@ -762,243 +767,6 @@ define ppc_fp128 @canonicalize_neg1.0_ppcf128() {
762767
ret ppc_fp128 %ret
763768
}
764769

765-
; --------------------------------------------------------------------
766-
; Test folds of using canonicalize + is.fpclass to inspect the denormal mode.
767-
; --------------------------------------------------------------------
768-
769-
define i1 @is_poszero_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" {
770-
; CHECK-LABEL: @is_poszero_daz_enabled_check_dynamic(
771-
; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0x36A0000000000000)
772-
; CHECK-NEXT: [[IS_POS_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 64)
773-
; CHECK-NEXT: ret i1 [[IS_POS_ZERO]]
774-
;
775-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
776-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
777-
ret i1 %is.pos.zero
778-
}
779-
780-
define i1 @is_preserve_sign_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" {
781-
; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_dynamic(
782-
; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0xB6A0000000000000)
783-
; CHECK-NEXT: [[IS_NEG_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 32)
784-
; CHECK-NEXT: ret i1 [[IS_NEG_ZERO]]
785-
;
786-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
787-
%is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32)
788-
ret i1 %is.neg.zero
789-
}
790-
791-
define i1 @is_positive_zero_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" {
792-
; CHECK-LABEL: @is_positive_zero_daz_enabled_check_dynamic(
793-
; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0xB6A0000000000000)
794-
; CHECK-NEXT: [[IS_POS_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 64)
795-
; CHECK-NEXT: ret i1 [[IS_POS_ZERO]]
796-
;
797-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
798-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
799-
ret i1 %is.pos.zero
800-
}
801-
802-
define i1 @is_any_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" {
803-
; CHECK-LABEL: @is_any_daz_enabled_check_dynamic(
804-
; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0xB6A0000000000000)
805-
; CHECK-NEXT: [[IS_ANY_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 96)
806-
; CHECK-NEXT: ret i1 [[IS_ANY_ZERO]]
807-
;
808-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
809-
%is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96)
810-
ret i1 %is.any.zero
811-
}
812-
813-
define i1 @is_not_daz_enabled_check_dynamic() "denormal-fp-math"="ieee,dynamic" {
814-
; CHECK-LABEL: @is_not_daz_enabled_check_dynamic(
815-
; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0x36A0000000000000)
816-
; CHECK-NEXT: [[IS_NOT_POS_ZERO:%.*]] = call i1 @llvm.is.fpclass.f32(float [[CANONICAL]], i32 959)
817-
; CHECK-NEXT: ret i1 [[IS_NOT_POS_ZERO]]
818-
;
819-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
820-
%is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959)
821-
ret i1 %is.not.pos.zero
822-
}
823-
824-
define i1 @is_poszero_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" {
825-
; CHECK-LABEL: @is_poszero_daz_enabled_check_ieee(
826-
; CHECK-NEXT: ret i1 false
827-
;
828-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
829-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
830-
ret i1 %is.pos.zero
831-
}
832-
833-
define i1 @is_preserve_sign_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" {
834-
; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_ieee(
835-
; CHECK-NEXT: ret i1 false
836-
;
837-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
838-
%is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32)
839-
ret i1 %is.neg.zero
840-
}
841-
842-
define i1 @is_positive_zero_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" {
843-
; CHECK-LABEL: @is_positive_zero_daz_enabled_check_ieee(
844-
; CHECK-NEXT: ret i1 false
845-
;
846-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
847-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
848-
ret i1 %is.pos.zero
849-
}
850-
851-
define i1 @is_any_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" {
852-
; CHECK-LABEL: @is_any_daz_enabled_check_ieee(
853-
; CHECK-NEXT: ret i1 false
854-
;
855-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
856-
%is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96)
857-
ret i1 %is.any.zero
858-
}
859-
860-
define i1 @is_not_daz_enabled_check_ieee() "denormal-fp-math"="ieee,ieee" {
861-
; CHECK-LABEL: @is_not_daz_enabled_check_ieee(
862-
; CHECK-NEXT: ret i1 true
863-
;
864-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
865-
%is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959)
866-
ret i1 %is.not.pos.zero
867-
}
868-
869-
define i1 @is_poszero_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" {
870-
; CHECK-LABEL: @is_poszero_daz_enabled_check_preserve_sign(
871-
; CHECK-NEXT: ret i1 true
872-
;
873-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
874-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
875-
ret i1 %is.pos.zero
876-
}
877-
878-
define i1 @is_preserve_sign_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" {
879-
; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_preserve_sign(
880-
; CHECK-NEXT: ret i1 true
881-
;
882-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
883-
%is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32)
884-
ret i1 %is.neg.zero
885-
}
886-
887-
define i1 @is_positive_zero_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" {
888-
; CHECK-LABEL: @is_positive_zero_daz_enabled_check_preserve_sign(
889-
; CHECK-NEXT: ret i1 false
890-
;
891-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
892-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
893-
ret i1 %is.pos.zero
894-
}
895-
896-
define i1 @is_any_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" {
897-
; CHECK-LABEL: @is_any_daz_enabled_check_preserve_sign(
898-
; CHECK-NEXT: ret i1 true
899-
;
900-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
901-
%is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96)
902-
ret i1 %is.any.zero
903-
}
904-
905-
define i1 @is_not_daz_enabled_check_preserve_sign() "denormal-fp-math"="ieee,preserve-sign" {
906-
; CHECK-LABEL: @is_not_daz_enabled_check_preserve_sign(
907-
; CHECK-NEXT: ret i1 false
908-
;
909-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
910-
%is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959)
911-
ret i1 %is.not.pos.zero
912-
}
913-
914-
define i1 @is_poszero_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" {
915-
; CHECK-LABEL: @is_poszero_daz_enabled_check_positive_zero(
916-
; CHECK-NEXT: ret i1 true
917-
;
918-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
919-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
920-
ret i1 %is.pos.zero
921-
}
922-
923-
define i1 @is_preserve_sign_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" {
924-
; CHECK-LABEL: @is_preserve_sign_daz_enabled_check_positive_zero(
925-
; CHECK-NEXT: ret i1 false
926-
;
927-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
928-
%is.neg.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 32)
929-
ret i1 %is.neg.zero
930-
}
931-
932-
define i1 @is_positive_zero_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" {
933-
; CHECK-LABEL: @is_positive_zero_daz_enabled_check_positive_zero(
934-
; CHECK-NEXT: ret i1 true
935-
;
936-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
937-
%is.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 64)
938-
ret i1 %is.pos.zero
939-
}
940-
941-
define i1 @is_any_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" {
942-
; CHECK-LABEL: @is_any_daz_enabled_check_positive_zero(
943-
; CHECK-NEXT: ret i1 true
944-
;
945-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 -2147483647 to float))
946-
%is.any.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 96)
947-
ret i1 %is.any.zero
948-
}
949-
950-
define i1 @is_not_daz_enabled_check_positive_zero() "denormal-fp-math"="ieee,positive-zero" {
951-
; CHECK-LABEL: @is_not_daz_enabled_check_positive_zero(
952-
; CHECK-NEXT: ret i1 false
953-
;
954-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
955-
%is.not.pos.zero = call i1 @llvm.is.fpclass.f32(float %canonical, i32 959)
956-
ret i1 %is.not.pos.zero
957-
}
958-
959-
define i1 @is_poszero_daz_enabled_check_dynamic_bitcast() "denormal-fp-math"="ieee,dynamic" {
960-
; CHECK-LABEL: @is_poszero_daz_enabled_check_dynamic_bitcast(
961-
; CHECK-NEXT: [[CANONICAL:%.*]] = call float @llvm.canonicalize.f32(float 0x36A0000000000000)
962-
; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[CANONICAL]] to i32
963-
; CHECK-NEXT: [[IS_POS_ZERO:%.*]] = icmp eq i32 [[BITCAST]], 0
964-
; CHECK-NEXT: ret i1 [[IS_POS_ZERO]]
965-
;
966-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
967-
%bitcast = bitcast float %canonical to i32
968-
%is.pos.zero = icmp eq i32 %bitcast, 0
969-
ret i1 %is.pos.zero
970-
}
971-
972-
define i1 @is_poszero_daz_enabled_check_preserve_sign_bitcast() "denormal-fp-math"="ieee,preserve-sign" {
973-
; CHECK-LABEL: @is_poszero_daz_enabled_check_preserve_sign_bitcast(
974-
; CHECK-NEXT: ret i1 true
975-
;
976-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
977-
%bitcast = bitcast float %canonical to i32
978-
%is.pos.zero = icmp eq i32 %bitcast, 0
979-
ret i1 %is.pos.zero
980-
}
981-
982-
define i1 @is_poszero_daz_enabled_check_positive_zero_bitcast() "denormal-fp-math"="ieee,positive-zero" {
983-
; CHECK-LABEL: @is_poszero_daz_enabled_check_positive_zero_bitcast(
984-
; CHECK-NEXT: ret i1 true
985-
;
986-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
987-
%bitcast = bitcast float %canonical to i32
988-
%is.pos.zero = icmp eq i32 %bitcast, 0
989-
ret i1 %is.pos.zero
990-
}
991-
992-
define i1 @is_poszero_daz_enabled_check_ieee_bitcast() "denormal-fp-math"="ieee,ieee" {
993-
; CHECK-LABEL: @is_poszero_daz_enabled_check_ieee_bitcast(
994-
; CHECK-NEXT: ret i1 false
995-
;
996-
%canonical = call float @llvm.canonicalize.f32(float bitcast (i32 1 to float))
997-
%bitcast = bitcast float %canonical to i32
998-
%is.pos.zero = icmp eq i32 %bitcast, 0
999-
ret i1 %is.pos.zero
1000-
}
1001-
1002770
declare bfloat @llvm.canonicalize.bf16(bfloat)
1003771
declare half @llvm.canonicalize.f16(half)
1004772
declare float @llvm.canonicalize.f32(float)
@@ -1007,4 +775,3 @@ declare double @llvm.canonicalize.f64(double)
1007775
declare fp128 @llvm.canonicalize.fp128(fp128)
1008776
declare x86_fp80 @llvm.canonicalize.f80(x86_fp80)
1009777
declare ppc_fp128 @llvm.canonicalize.ppcf128(ppc_fp128)
1010-
declare i1 @llvm.is.fpclass.f32(float, i32 immarg)

0 commit comments

Comments
 (0)