https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126455
Bug ID: 126455
Summary: Wrong folding of (a < b) ^ (a > b) to a != b for FP
vectors
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: ktkachov at gcc dot gnu.org
Target Milestone: ---
Target: aarch64
Consider the testcase:
#include <stdio.h>
typedef float v4sf __attribute__((vector_size (16)));
typedef int v4si __attribute__((vector_size (16)));
__attribute__((noipa)) v4si vec_xor (v4sf a, v4sf b) { return (a < b) ^ (a >
b); }
__attribute__((noipa)) v4si vec_ior (v4sf a, v4sf b) { return (a < b) | (a >
b); }
__attribute__((noipa)) int scl_xor (float a, float b) { return (a < b) ^ (a >
b); }
int
main (void)
{
float n = __builtin_nanf ("");
v4sf a = { n, n, n, n }, b = { 1, 1, 1, 1 };
v4si x = vec_xor (a, b);
v4si o = vec_ior (a, b);
int s = scl_xor (n, 1.0f);
int bad = 0;
printf ("vector ^ : %d (must be 0)\n", x[0]);
printf ("vector | : %d (must be 0)\n", o[0]);
printf ("scalar ^ : %d (must be 0)\n", s);
if (x[0] != 0) { printf ("FAIL: vector exclusive or\n"); bad = 1; }
if (o[0] != 0) { printf ("FAIL: vector inclusive or\n"); bad = 1; }
if (s != 0) { printf ("FAIL: scalar\n"); bad = 1; }
return bad;
}
with -O2 this gives different results between GCC and LLVM.
Expected, and what the scalar version gives:
```
vector ^ : 0 (must be 0)
vector | : 0 (must be 0)
scalar ^ : 0 (must be 0)
```
Observed:
```
vector ^ : -1 (must be 0)
FAIL: vector exclusive or
```
This fold should only happen under -ffinite-math-only IMO