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

Reply via email to