From bd51dea6934d5c583fe9c8bc806e6287cac43f90 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 28 Feb 2021 23:51:30 -0800 Subject: [PATCH] Change twice used large const table to static This table is used twice in core::num::dec2flt::algorithm::power_of_ten. According to the semantics of const, a separate huge definition of the table is inlined at both places. fn power_of_ten(e: i16) -> Fp { assert!(e >= table::MIN_E); let i = e - table::MIN_E; let sig = table::POWERS.0[i as usize]; let exp = table::POWERS.1[i as usize]; Fp { f: sig, e: exp } } Theoretically this gets cleaned up by optimization passes, but in practice I am experiencing a miscompile from LTO on this code. Making the table a static, which would only be defined a single time and not require attention from LTO, eliminates the miscompile and seems semantically more appropriate anyway. A separate bug report on the LTO bug is forthcoming. --- library/core/src/num/dec2flt/table.rs | 2 +- src/etc/dec2flt_table.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/num/dec2flt/table.rs b/library/core/src/num/dec2flt/table.rs index 1bd94ffa04e0e..97b497e81e070 100644 --- a/library/core/src/num/dec2flt/table.rs +++ b/library/core/src/num/dec2flt/table.rs @@ -5,7 +5,7 @@ pub const MIN_E: i16 = -305; pub const MAX_E: i16 = 305; #[rustfmt::skip] -pub const POWERS: ([u64; 611], [i16; 611]) = ( +pub static POWERS: ([u64; 611], [i16; 611]) = ( [ 0xe0b62e2929aba83c, 0x8c71dcd9ba0b4926, diff --git a/src/etc/dec2flt_table.py b/src/etc/dec2flt_table.py index 9bbcaf7c4cc49..ad2292e857186 100755 --- a/src/etc/dec2flt_table.py +++ b/src/etc/dec2flt_table.py @@ -113,7 +113,7 @@ def print_proper_powers(): print() print("#[rustfmt::skip]") typ = "([u64; {0}], [i16; {0}])".format(len(powers)) - print("pub const POWERS: ", typ, " = (", sep='') + print("pub static POWERS: ", typ, " = (", sep='') print(" [") for z in powers: print(" 0x{:x},".format(z.sig))