diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-03-15 10:46:47 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2024-03-15 11:04:29 +0100 |
commit | ab2da8fb67b1aa0557a16b62689a888730dba610 (patch) | |
tree | 32ae3b821516aaccd8fff27538184ca0611d5934 | |
parent | 7dd3b2b09cbeb6712ec680a0445cb0ad41070423 (diff) | |
download | gcc-ab2da8fb67b1aa0557a16b62689a888730dba610.zip gcc-ab2da8fb67b1aa0557a16b62689a888730dba610.tar.gz gcc-ab2da8fb67b1aa0557a16b62689a888730dba610.tar.bz2 |
i386: Fix a pasto in ix86_expand_int_sse_cmp [PR114339]
In r13-3803-gfa271afb58 I've added an optimization for LE/LEU/GE/GEU
comparison against CONST_VECTOR. As the comments say:
/* x <= cst can be handled as x < cst + 1 unless there is
wrap around in cst + 1. */
...
/* For LE punt if some element is signed maximum. */
...
/* For LEU punt if some element is unsigned maximum. */
and
/* x >= cst can be handled as x > cst - 1 unless there is
wrap around in cst - 1. */
...
/* For GE punt if some element is signed minimum. */
...
/* For GEU punt if some element is zero. */
Apparently I wrote the GE/GEU (second case) first and then
copied/adjusted it for LE/LEU, most of the adjustments look correct, but
I've left if (code == GE) comparison when testing if it should punt for
signed maximum. That condition is never true, because this is in
switch (code) { ... case LE: case LEU: block and we really meant to
be what the comment says, for LE punt if some element is signed maximum,
as then cst + 1 wraps around.
The following patch fixes the pasto.
2024-03-15 Jakub Jelinek <jakub@redhat.com>
PR target/114339
* config/i386/i386-expand.cc (ix86_expand_int_sse_cmp) <case LE>: Fix
a pasto, compare code against LE rather than GE.
* gcc.target/i386/pr114339.c: New test.
-rw-r--r-- | gcc/config/i386/i386-expand.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr114339.c | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc index 2210e6f..8bb8f21 100644 --- a/gcc/config/i386/i386-expand.cc +++ b/gcc/config/i386/i386-expand.cc @@ -4690,7 +4690,7 @@ ix86_expand_int_sse_cmp (rtx dest, enum rtx_code code, rtx cop0, rtx cop1, rtx elt = CONST_VECTOR_ELT (cop1, i); if (!CONST_INT_P (elt)) break; - if (code == GE) + if (code == LE) { /* For LE punt if some element is signed maximum. */ if ((INTVAL (elt) & (GET_MODE_MASK (eltmode) >> 1)) diff --git a/gcc/testsuite/gcc.target/i386/pr114339.c b/gcc/testsuite/gcc.target/i386/pr114339.c new file mode 100644 index 0000000..8fba374 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr114339.c @@ -0,0 +1,20 @@ +/* PR target/114339 */ +/* { dg-do run } */ +/* { dg-options "-O2 -Wno-psabi" } */ +/* { dg-additional-options "-mavx" { target avx_runtime } } */ + +typedef long long V __attribute__((vector_size (16))); + +__attribute__((noipa)) V +foo (V a) +{ + return a <= (V) {0, __LONG_LONG_MAX__ }; +} + +int +main () +{ + V t = foo ((V) { 0, 0 }); + if (t[0] != -1LL || t[1] != -1LL) + __builtin_abort (); +} |