]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
simplify-rtx: Fix VOIDmode operand handling in simplify_subreg [PR108805]
authorUros Bizjak <ubizjak@gmail.com>
Fri, 17 Feb 2023 14:58:12 +0000 (15:58 +0100)
committerUros Bizjak <ubizjak@gmail.com>
Fri, 17 Feb 2023 15:04:26 +0000 (16:04 +0100)
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.

gcc/simplify-rtx.cc
gcc/testsuite/gcc.dg/pr108805.c [new file with mode: 0644]

index 0a1dd88b0a8adc343c7a2ae213fb4dca193f20cc..3955929bb7072701c07e18da1eb007680403e3d4 100644 (file)
@@ -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 (file)
index 0000000..280d3f5
--- /dev/null
@@ -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;
+}