diff mbox series

tree-optimization/116258 - do not lower PAREN_EXPR of vectors

Message ID 20240807124347.34545385AC29@sourceware.org
State New
Headers show
Series tree-optimization/116258 - do not lower PAREN_EXPR of vectors | expand

Commit Message

Richard Biener Aug. 7, 2024, 12:43 p.m. UTC
The following avoids lowering of PAREN_EXPR of vectors as unsupported
to scalars.  Instead PAREN_EXPR is like a plain move or a VIEW_CONVERT.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.  I plan
to push to branches, __builtin_assoc_barrier is new in GCC 12.

	PR tree-optimization/116258
	* tree-vect-generic.cc (expand_vector_operations_1): Do not
	lower PAREN_EXPR.

	* gcc.target/i386/pr116258.c: New testcase.
---
 gcc/testsuite/gcc.target/i386/pr116258.c | 14 ++++++++++++++
 gcc/tree-vect-generic.cc                 |  9 +++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr116258.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.target/i386/pr116258.c b/gcc/testsuite/gcc.target/i386/pr116258.c
new file mode 100644
index 00000000000..bd7d3a97b2c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr116258.c
@@ -0,0 +1,14 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse2" } */
+
+#define vect16 __attribute__((vector_size(16)))
+#define h(a) __builtin_assoc_barrier((a))
+
+ vect16 float  f( vect16 float  x, vect16 float vconstants0)
+{
+  vect16 float  t = (x * (vconstants0[0]));
+  return (x + h(t));
+}
+
+/* { dg-final { scan-assembler-times "shufps" 1 } } */
+/* { dg-final { scan-assembler-not "unpck" } } */
diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc
index 8336cbb8c73..4bcab71c168 100644
--- a/gcc/tree-vect-generic.cc
+++ b/gcc/tree-vect-generic.cc
@@ -2206,10 +2206,15 @@  expand_vector_operations_1 (gimple_stmt_iterator *gsi,
 	}
     }
 
+  /* Plain moves do not need lowering.  */
+  if (code == SSA_NAME
+      || code == VIEW_CONVERT_EXPR
+      || code == PAREN_EXPR)
+    return;
+
   if (CONVERT_EXPR_CODE_P (code)
       || code == FLOAT_EXPR
-      || code == FIX_TRUNC_EXPR
-      || code == VIEW_CONVERT_EXPR)
+      || code == FIX_TRUNC_EXPR)
     return;
 
   /* The signedness is determined from input argument.  */