[Bug tree-optimization/68294] New: gcc cannot deduce (a | b) != 0 from (a != 0 && b != 0)

fuz at fuz dot su gcc-bugzilla@gcc.gnu.org
Wed Nov 11 11:57:00 GMT 2015


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68294

            Bug ID: 68294
           Summary: gcc cannot deduce (a | b) != 0 from (a != 0 && b != 0)
           Product: gcc
           Version: 5.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fuz at fuz dot su
  Target Milestone: ---

I implemented Stein's binary gcd algorithm, which contains code like this:

        int u, v, k;

        /* ... */

        if (u == 0 || v == 0)
                return (u | v);

        k = ffs(u | v) - 1;

Sadly, for the ffs() call, gcc emits (on x86 where behaviour of bsf is unclear
if the operand is zero) code for the case when u | v is zero, even though this
possibility has been ruled out in the if-statement before. Adding a redundant
clause

        if ((u | v) == 0 || u == 0 || v == 0)

to the if-statement makes the compiler omit the extra code it emits above, but
then it emits an extra unneeded test for (u | v) == 0.

It would be great if gcc would catch this.


More information about the Gcc-bugs mailing list