On 7/24/2026 6:27 AM, Kyrylo Tkachov wrote:
Ping.
Thanks,
Kyrill
On 17 Jul 2026, at 15:25, Kyrylo Tkachov <[email protected]> wrote:
From: Kyrylo Tkachov <[email protected]>
average_cost computes
ELSE_COST + P * (THEN_COST - ELSE_COST)
profile_probability::apply now rounds signed initialized values to the nearest
integer, with halfway values away from zero. That signed rounding can still
give different integer costs when equivalent CFG arms are reversed. Unknown
probabilities have the same issue for odd cost differences because apply
truncates them toward zero.
Write the documented weighted average as
ELSE_COST + P * (THEN_COST - ELSE_COST)
when THEN_COST is at least ELSE_COST, and as
THEN_COST + (1 - P) * (ELSE_COST - THEN_COST)
otherwise. Both forms start with the cheaper arm and scale a nonnegative
cost difference by the probability of the costlier arm. Reversing the CFG
arms therefore keeps the same base, magnitude, probability, and rounded
result. Cast the costlier arm to gcov_type before subtraction.
Add an x86 test with the same costs and probabilities represented using
reversed CFG arms. The scaled cost difference is an exact halfway value.
The apply-only compiler makes opposite profitability decisions for the two
orientations. With this change both forms convert to conditional moves.
Bootstrapped and tested on aarch64-linux-gnu and x86_64-linux.
Ok for trunk?
Thanks,
Kyrill
gcc/ChangeLog:
PR tree-optimization/125557
* ifcvt.cc (average_cost): Scale a nonnegative cost difference using
the probability of the more expensive arm.
gcc/testsuite/ChangeLog:
PR tree-optimization/125557
* gcc.target/i386/ifcvt-average-cost-1.c: New test.
Signed-off-by: Kyrylo Tkachov <[email protected]>
OK.
jeff