rust/library
León Orell Valerian Liehr 4f7d9d4ad8
Rollup merge of #125038 - ivan-shrimp:checked_sub, r=joboet
Invert comparison in `uN::checked_sub`

After #124114, LLVM no longer combines the comparison and subtraction in `uN::checked_sub` when either operand is a constant (demo: https://rust.godbolt.org/z/MaeoYbsP1). The difference is more pronounced when the expression is slightly more complex (https://rust.godbolt.org/z/4rPavsYdc).

This is due to the use of `>=` here:

ee97564e3a/library/core/src/num/uint_macros.rs (L581-L593)

For constant `C`, LLVM eagerly converts `a >= C` into `a > C - 1`, but the backend can only combine `a < C` with `a - C`, not `C - 1 < a` and `a - C`: e586556e37/llvm/lib/CodeGen/CodeGenPrepare.cpp (L1697-L1742)

This PR[^1] simply inverts the `>=` into `<` to restore the LLVM magic, and somewhat align this with the implementation of `uN::overflowing_sub` from #103299.

When the result is stored as an `Option` (rather than being branched/cmoved on), the discriminant is `self >= rhs`. This PR doesn't affect the codegen (and relevant tests) of that since LLVM will negate `self < rhs` to `self >= rhs` when necessary.

[^1]: Note to `self`: My very first contribution to publicly-used code. Hopefully like what I should learn to always be, tiny and humble.
2024-05-15 14:21:38 +02:00
..
alloc Auto merge of #125012 - RalfJung:format-error, r=Mark-Simulacrum,workingjubilee 2024-05-12 08:34:32 +00:00
backtrace@e151306182 Update backtrace submodule 2024-04-12 16:28:19 -07:00
core Rollup merge of #125038 - ivan-shrimp:checked_sub, r=joboet 2024-05-15 14:21:38 +02:00
panic_abort Add support for Arm64EC to the Standard Library 2024-04-15 16:05:16 -07:00
panic_unwind Replace libc::c_int with core::ffi::c_int 2024-04-14 07:11:51 +00:00
portable-simd Stabilise inline_const 2024-04-24 13:12:25 +01:00
proc_macro Replace version placeholders for 1.79 2024-05-01 21:01:51 -04:00
profiler_builtins Update cc crate to v1.0.97 2024-05-08 15:06:35 +00:00
rtstartup library: Fix warnings in rtstartup 2024-01-06 01:32:03 +03:00
rustc-std-workspace-alloc Replace libstd, libcore, liballoc in line comments. 2022-12-30 14:00:42 +01:00
rustc-std-workspace-core
rustc-std-workspace-std
std Rollup merge of #123817 - slanterns:seek_relative, r=dtolnay 2024-05-13 20:29:18 +02:00
stdarch@c0257c1660 Update stdarch submodule 2024-04-21 21:35:17 -04:00
sysroot Expose compiler-builtins-weak-intrinsics feature for -Zbuild-std 2023-06-23 11:15:34 +01:00
test emit fractional benchmark nanoseconds in libtest's JSON output format 2024-05-06 00:25:00 +02:00
unwind Fix unwinding on 32-bit watchOS ARM 2024-05-05 15:41:55 +02:00