On 8/10/2026 8:26 AM, [email protected] wrote:
From: Kyrylo Tkachov <[email protected]>
profile_probability::apply uses RDIV, which adds half the denominator
before division. This does not round negative values correctly.
Multiplying the signed input by the fixed-point probability can also
overflow for large inputs.
Scale the unsigned magnitude with safe_scale_64bit, then restore the sign.
Return the input directly for a unit probability so that the minimum
gcov_type value remains representable. Preserve the existing truncation
for uninitialized probabilities.
Add selftests for signed rounding, zero and unit probabilities,
uninitialized probabilities, and the minimum and maximum gcov_type values.
Bootstrapped and tested on aarch64-none-linux and x86_64-linux.
Ok for trunk?
Thanks,
Kyrill
gcc/ChangeLog:
* profile-count.h (profile_probability::apply): Scale an unsigned
magnitude with safe_scale_64bit.
* profile-count.cc (test_profile_probability_apply): New.
(profile_count_cc_tests): New.
* selftest.h (profile_count_cc_tests): Declare.
* selftest-run-tests.cc (selftest::run_tests): Run it.
Signed-off-by: Kyrylo Tkachov <[email protected]>
OK unless Richi objects. So give him ~48hrs before committing to chime
back in.
jeff