aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2023-02-17 15:58:12 +0100
committerUros Bizjak <ubizjak@gmail.com>2023-02-17 16:04:26 +0100
commit6ac3ebed5ffbac0d81c5a1d0cb1e345cfad202a8 (patch)
tree28465a1ced31e6a5ed45f120c7752d2779c7128f
parent593c8b73fb15683fdd1a9d85fe7e7e99540de3c8 (diff)
downloadgcc-6ac3ebed5ffbac0d81c5a1d0cb1e345cfad202a8.zip
gcc-6ac3ebed5ffbac0d81c5a1d0cb1e345cfad202a8.tar.gz
gcc-6ac3ebed5ffbac0d81c5a1d0cb1e345cfad202a8.tar.bz2
simplify-rtx: Fix VOIDmode operand handling in simplify_subreg [PR108805]
simplify_subreg can return VOIDmode const_int operand and will cause ICE in simplify_gen_subreg when this operand is passed to it. The patch uses int_outermode instead of GET_MODE of temporary as the innermode argument of simplify_gen_subreg. 2023-02-17 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/108805 * simplify-rtx.cc (simplify_context::simplify_subreg): Use int_outermode instead of GET_MODE (tem) to prevent VOIDmode from entering simplify_gen_subreg. gcc/testsuite/ChangeLog: PR target/108805 * gcc.dg/pr108805.c: New test.
-rw-r--r--gcc/simplify-rtx.cc2
-rw-r--r--gcc/testsuite/gcc.dg/pr108805.c20
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
index 0a1dd88..3955929 100644
--- a/gcc/simplify-rtx.cc
+++ b/gcc/simplify-rtx.cc
@@ -7665,7 +7665,7 @@ simplify_context::simplify_subreg (machine_mode outermode, rtx op,
{
rtx tem = simplify_subreg (int_outermode, op, innermode, byte);
if (tem)
- return simplify_gen_subreg (outermode, tem, GET_MODE (tem), 0);
+ return simplify_gen_subreg (outermode, tem, int_outermode, 0);
}
/* If OP is a vector comparison and the subreg is not changing the
diff --git a/gcc/testsuite/gcc.dg/pr108805.c b/gcc/testsuite/gcc.dg/pr108805.c
new file mode 100644
index 0000000..280d3f5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr108805.c
@@ -0,0 +1,20 @@
+/* { dg-do compile { target longlong64 } } */
+/* { dg-options "-O" } */
+/* { dg-additional-options "-msse2" { target x86_64-*-* i?86-*-* } } */
+
+typedef __INT8_TYPE__ __attribute__((__vector_size__ (4))) U;
+typedef __INT32_TYPE__ __attribute__((__vector_size__ (4))) V;
+typedef __UINT64_TYPE__ __attribute__((__vector_size__ (8))) W;
+
+int i;
+U h;
+W g;
+
+U
+foo (void)
+{
+ W w = i != g;
+ V v = __builtin_convertvector (i | w >> 2, V);
+ U u = (U) v[0] + h;
+ return u;
+}