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

            Bug ID: 115999
           Summary: a - (a>>31) should be transformed into a +
                    ((unsigned)a)>>31 (for signed a)
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Take:
```
int f0(int a)
{
        return a - (a >> (sizeof(a)*8 - 1));
}

int f(int a)
{
        int t = a >> (sizeof(a)*8 - 1);
        return a - t;
}

int f1(int a)
{
        unsigned t = ((unsigned)a) >> (sizeof(a)*8 - 1);
        return a + t;
}

int feq(int a)
{
        return f(a) == f1(a);
}
```

f0, f and f1 all should produce the same code generation but currently does
not.

feq shows that we can't figure out that f and f1 are the same even though they
are.

I saw this when reading
https://gcc.gnu.org/pipermail/gcc-patches/2024-July/657751.html .

Reply via email to