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

            Bug ID: 115896
           Summary: Failure to optimize shift+compare involving constants
                    to and+compare
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gabravier at gmail dot com
  Target Milestone: ---

#include <stdint.h>

bool f1(int8_t a)
{
    int8_t b = a << 4;
    return b == -128;
}

bool f2(int8_t a)
{
    return (a & 15) == 8;
}

f1 and f2 are equivalent, according to LLVM, but GCC outputs different code for
both and doesn't consider them equivalent if one does `f1(a) == f2(a)`.

This transformation would be useful for those canonicalization reasons (and
also because f2 seems at first glance better for further optimization), but
furthermore, while the emitted code is roughly equivalent on platforms like
x86, it seems faster on various other platforms such as ARM, PowerPC, RISC-V,
MIPS, 68k and AVR, and in general also results in shorter code.

Reply via email to