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

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Note clang also falls over for 3 additions and swapping the order of the
addition just slightly.

```
#include <stdint.h>

int32_t f(int32_t i2, int32_t aa, int32_t aa1)
{
    return ((i2 >> 17) + (aa >> 17) + (aa1 >> 17)) << 17;
}

int32_t fa(int32_t i2, int32_t aa, int32_t aa1)
{
    return ((i2 >> 17) + (aa1 >> 17) + (aa >> 17)) << 17;
}

int32_t f2(int32_t i2, int32_t aa, int32_t aa1)
{
    return ((((i2 & -(1 << 17)) + aa) & -(1 << 17)) + aa1) & -(1 << 17);
}
int32_t f2a(int32_t i2, int32_t aa, int32_t aa1)
{
    return ((((i2 & -(1 << 17)) + aa1) & -(1 << 17)) + aa) & -(1 << 17);
}

bool f3a(int32_t i2, int32_t aa, int32_t aa1)
{
    return f(i2, aa, aa1) == fa(i2, aa, aa1);
}
bool f3(int32_t i2, int32_t aa, int32_t aa1)
{
    return f(i2, aa, aa1) == f2a(i2, aa, aa1);
}
```

So the question becomes which is more Canonical rather than anything else.

Reply via email to