Hi,

Similar to the outermode, now we have a case where the inner mode is
unsplittable: (subreg:TI (concatn:V2DI ...)).  We don't actually need
it to be splittable so this patch just returns NULL if the size is 
non-constant.

Bootstrapped and regtested on x86, power10, and aarch64.
Regtested on riscv64.

Regards
 Robin

        PR rtl-optimization/127443

gcc/ChangeLog:

        * lower-subreg.cc (simplify_subreg_concatn): Return for
        non-constant inner mode size.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/pr127443.c: New test.
---
 gcc/lower-subreg.cc                                |  8 +++-----
 .../gcc.target/riscv/rvv/autovec/pr127443.c        | 14 ++++++++++++++
 2 files changed, 17 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr127443.c

diff --git a/gcc/lower-subreg.cc b/gcc/lower-subreg.cc
index 548f1b0d4b8..c6b206de8dc 100644
--- a/gcc/lower-subreg.cc
+++ b/gcc/lower-subreg.cc
@@ -666,7 +666,7 @@ decompose_register (unsigned int regno)
 static rtx
 simplify_subreg_concatn (machine_mode outermode, rtx op, poly_uint64 orig_byte)
 {
-  unsigned int outer_size, inner_size, inner_words;
+  unsigned int outer_size, inner_size;
   machine_mode innermode, partmode;
   rtx part;
   unsigned int final_offset;
@@ -674,10 +674,8 @@ simplify_subreg_concatn (machine_mode outermode, rtx op, 
poly_uint64 orig_byte)
 
   innermode = GET_MODE (op);
 
-  if (!interesting_mode_p (innermode, &inner_size, &inner_words))
-    gcc_unreachable ();
-
-  if (!GET_MODE_SIZE (outermode).is_constant (&outer_size))
+  if (!GET_MODE_SIZE (innermode).is_constant (&inner_size)
+      || !GET_MODE_SIZE (outermode).is_constant (&outer_size))
     return NULL_RTX;
 
   /* Must be constant if outer_size is.  */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr127443.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr127443.c
new file mode 100644
index 00000000000..e78c9a2d6a1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr127443.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O -march=rv64gcv -mabi=lp64d -g" } */
+
+typedef __attribute__((__vector_size__(16))) __int128 V;
+typedef __attribute__((__vector_size__(16))) char W;
+
+char c;
+
+void
+foo(V v)
+{
+  v &= c;
+  c = ((W)v)[1];
+}
-- 
2.55.0

Reply via email to