Skip to content

Commit cb7efc0

Browse files
Rollup merge of #141676 - tgross35:f16-disable-total-cmp, r=workingjubilee
float: Disable `total_cmp` sNaN tests for `f16` There is an LLVM bug with lowering of basic `f16` operations that mean a round trip via `__extendhfsf2` and `__truncsfhf2` may happen for simple `abs` calls or bitcasts [1]. This is problematic because the round trip quiets signaling NaNs. For most operations this is acceptable, but it is causing `total_cmp` tests to fail unless optimizations are enabled. Disable `total_cmp` tests involving signaling NaNs until this issue is resolved. Fixes: rust-lang/rustc_codegen_cranelift#1578 Fixes: #141503 [1]: llvm/llvm-project#104915
2 parents 2b08e4d + 19fd098 commit cb7efc0

File tree

1 file changed

+40
-37
lines changed
  • library/coretests/tests/floats

1 file changed

+40
-37
lines changed

library/coretests/tests/floats/f16.rs

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -596,12 +596,15 @@ fn test_total_cmp() {
596596
f16::from_bits(f16::NAN.to_bits() | quiet_bit_mask())
597597
}
598598

599-
fn s_nan() -> f16 {
600-
f16::from_bits((f16::NAN.to_bits() & !quiet_bit_mask()) + 42)
601-
}
599+
// FIXME(f16_f128): Tests involving sNaN are disabled because without optimizations,
600+
// `total_cmp` is getting incorrectly lowered to code that includes a `extend`/`trunc` round
601+
// trip, which quiets sNaNs. See: https://github.com/llvm/llvm-project/issues/104915
602+
// fn s_nan() -> f16 {
603+
// f16::from_bits((f16::NAN.to_bits() & !quiet_bit_mask()) + 42)
604+
// }
602605

603606
assert_eq!(Ordering::Equal, (-q_nan()).total_cmp(&-q_nan()));
604-
assert_eq!(Ordering::Equal, (-s_nan()).total_cmp(&-s_nan()));
607+
// assert_eq!(Ordering::Equal, (-s_nan()).total_cmp(&-s_nan()));
605608
assert_eq!(Ordering::Equal, (-f16::INFINITY).total_cmp(&-f16::INFINITY));
606609
assert_eq!(Ordering::Equal, (-f16::MAX).total_cmp(&-f16::MAX));
607610
assert_eq!(Ordering::Equal, (-2.5_f16).total_cmp(&-2.5));
@@ -622,11 +625,11 @@ fn test_total_cmp() {
622625
assert_eq!(Ordering::Equal, 2.5_f16.total_cmp(&2.5));
623626
assert_eq!(Ordering::Equal, f16::MAX.total_cmp(&f16::MAX));
624627
assert_eq!(Ordering::Equal, f16::INFINITY.total_cmp(&f16::INFINITY));
625-
assert_eq!(Ordering::Equal, s_nan().total_cmp(&s_nan()));
628+
// assert_eq!(Ordering::Equal, s_nan().total_cmp(&s_nan()));
626629
assert_eq!(Ordering::Equal, q_nan().total_cmp(&q_nan()));
627630

628-
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-s_nan()));
629-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::INFINITY));
631+
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-s_nan()));
632+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::INFINITY));
630633
assert_eq!(Ordering::Less, (-f16::INFINITY).total_cmp(&-f16::MAX));
631634
assert_eq!(Ordering::Less, (-f16::MAX).total_cmp(&-2.5));
632635
assert_eq!(Ordering::Less, (-2.5_f16).total_cmp(&-1.5));
@@ -646,11 +649,11 @@ fn test_total_cmp() {
646649
assert_eq!(Ordering::Less, 1.5_f16.total_cmp(&2.5));
647650
assert_eq!(Ordering::Less, 2.5_f16.total_cmp(&f16::MAX));
648651
assert_eq!(Ordering::Less, f16::MAX.total_cmp(&f16::INFINITY));
649-
assert_eq!(Ordering::Less, f16::INFINITY.total_cmp(&s_nan()));
650-
assert_eq!(Ordering::Less, s_nan().total_cmp(&q_nan()));
652+
// assert_eq!(Ordering::Less, f16::INFINITY.total_cmp(&s_nan()));
653+
// assert_eq!(Ordering::Less, s_nan().total_cmp(&q_nan()));
651654

652-
assert_eq!(Ordering::Greater, (-s_nan()).total_cmp(&-q_nan()));
653-
assert_eq!(Ordering::Greater, (-f16::INFINITY).total_cmp(&-s_nan()));
655+
// assert_eq!(Ordering::Greater, (-s_nan()).total_cmp(&-q_nan()));
656+
// assert_eq!(Ordering::Greater, (-f16::INFINITY).total_cmp(&-s_nan()));
654657
assert_eq!(Ordering::Greater, (-f16::MAX).total_cmp(&-f16::INFINITY));
655658
assert_eq!(Ordering::Greater, (-2.5_f16).total_cmp(&-f16::MAX));
656659
assert_eq!(Ordering::Greater, (-1.5_f16).total_cmp(&-2.5));
@@ -670,10 +673,10 @@ fn test_total_cmp() {
670673
assert_eq!(Ordering::Greater, 2.5_f16.total_cmp(&1.5));
671674
assert_eq!(Ordering::Greater, f16::MAX.total_cmp(&2.5));
672675
assert_eq!(Ordering::Greater, f16::INFINITY.total_cmp(&f16::MAX));
673-
assert_eq!(Ordering::Greater, s_nan().total_cmp(&f16::INFINITY));
674-
assert_eq!(Ordering::Greater, q_nan().total_cmp(&s_nan()));
676+
// assert_eq!(Ordering::Greater, s_nan().total_cmp(&f16::INFINITY));
677+
// assert_eq!(Ordering::Greater, q_nan().total_cmp(&s_nan()));
675678

676-
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-s_nan()));
679+
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-s_nan()));
677680
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-f16::INFINITY));
678681
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-f16::MAX));
679682
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-2.5));
@@ -694,29 +697,29 @@ fn test_total_cmp() {
694697
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&2.5));
695698
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&f16::MAX));
696699
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&f16::INFINITY));
697-
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&s_nan()));
698-
699-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::INFINITY));
700-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::MAX));
701-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-2.5));
702-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-1.5));
703-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-1.0));
704-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-0.5));
705-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::MIN_POSITIVE));
706-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-max_subnorm()));
707-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-min_subnorm()));
708-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-0.0));
709-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&0.0));
710-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&min_subnorm()));
711-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&max_subnorm()));
712-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::MIN_POSITIVE));
713-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&0.5));
714-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&1.0));
715-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&1.5));
716-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&2.5));
717-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::MAX));
718-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::INFINITY));
719-
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&s_nan()));
700+
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&s_nan()));
701+
702+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::INFINITY));
703+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::MAX));
704+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-2.5));
705+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-1.5));
706+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-1.0));
707+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-0.5));
708+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::MIN_POSITIVE));
709+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-max_subnorm()));
710+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-min_subnorm()));
711+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-0.0));
712+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&0.0));
713+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&min_subnorm()));
714+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&max_subnorm()));
715+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::MIN_POSITIVE));
716+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&0.5));
717+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&1.0));
718+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&1.5));
719+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&2.5));
720+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::MAX));
721+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::INFINITY));
722+
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&s_nan()));
720723
}
721724

722725
#[test]

0 commit comments

Comments
 (0)