diff options
| author | David Tolnay <dtolnay@gmail.com> | 2021-02-28 23:51:30 -0800 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2021-03-01 10:41:16 -0800 |
| commit | bd51dea6934d5c583fe9c8bc806e6287cac43f90 (patch) | |
| tree | ec469a4d71b592f20362607c4d738848fe8e61de | |
| parent | 3b150b7a8f77874f26c617666f5608fe4a3e58df (diff) | |
| download | rust-bd51dea6934d5c583fe9c8bc806e6287cac43f90.tar.gz rust-bd51dea6934d5c583fe9c8bc806e6287cac43f90.zip | |
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.
| -rw-r--r-- | library/core/src/num/dec2flt/table.rs | 2 | ||||
| -rwxr-xr-x | 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 1bd94ffa04e..97b497e81e0 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 9bbcaf7c4cc..ad2292e8571 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)) |
