On 3/16/23 09:27, Manolis Tsamis wrote:
For this C testcase:
void g();
void f(unsigned int *a)
{
if (++*a == 1)
g();
}
GCC will currently emit a comparison with 1 by using the value
of *a after the increment. This can be improved by comparing
against 0 and using the value before the increment. As a result
there is a potentially shorter dependancy chain (no need to wait
for the result of +1) and on targets with compare zero instructions
the generated code is one instruction shorter.
Example from Aarch64:
Before
ldr w1, [x0]
add w1, w1, 1
str w1, [x0]
cmp w1, 1
beq .L4
ret
After
ldr w1, [x0]
add w2, w1, 1
str w2, [x0]
cbz w1, .L4
ret
gcc/ChangeLog:
* tree-ssa-forwprop.cc (combine_cond_expr_cond):
(forward_propagate_into_comparison_1): Optimize
for zero comparisons.
Deferring to gcc-14. Though I'm generally supportive of normalizing to
a comparison against zero when we safely can :-)
jeff