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

            Bug ID: 118666
           Summary: Canonicalization of `(a & CST) == CST` and `((~a) &
                    CST) == 0`
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: pinskia at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---
            Target: aarch64

Take:
```
int f(int a)
{
  return (a & 0x11) == 0x11;
}

int f1(int a)
{
  return ((~a) & 0x11) == 0;
}
```

These 2 functions should produce the same code. Right now on aarch64 (and mips)
they produce different code. (x86 produces the same code and do f1). While on
aarch64 f1 would produce better code but on mips f would produce better code.

So once we had canonicalization this there needs some code to chose between the
2 forms. One way is see if we have andn optab and use that. That would solve
aarch64. I am going to do both things.

Reply via email to