We are simply dropping PAREN_EXPRs which is of course incorrect.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/127363
* tree-vect-stmts.cc (vectorizable_assignment): Properly
code-generate PAREN_EXPRs.
* gcc.dg/vect/vect-pr127363.c: New testcase.
---
gcc/testsuite/gcc.dg/vect/vect-pr127363.c | 11 +++++++++++
gcc/tree-vect-stmts.cc | 14 ++++++++++----
2 files changed, 21 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/vect/vect-pr127363.c
diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr127363.c
b/gcc/testsuite/gcc.dg/vect/vect-pr127363.c
new file mode 100644
index 00000000000..1cb6113991e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-pr127363.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-ffast-math" } */
+
+void round_values(float* values)
+{
+ const float big = 0x1p24f;
+ for (int i = 0; i < 8; ++i)
+ values[i] = __builtin_assoc_barrier(values[i] + big) - big;
+}
+
+/* { dg-final { scan-tree-dump "\\\(\\\(vect__\[0-9._\]*\\\)\\\)" "vect" {
target vect_float } } } */
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index a0dc81f02d7..c1900f8eefe 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -6110,10 +6110,16 @@ vectorizable_assignment (vec_info *vinfo,
/* Arguments are ready. create the new vector stmt. */
FOR_EACH_VEC_ELT (vec_oprnds, i, vop)
{
- if (CONVERT_EXPR_CODE_P (code)
- || code == VIEW_CONVERT_EXPR)
- vop = build1 (VIEW_CONVERT_EXPR, vectype, vop);
- gassign *new_stmt = gimple_build_assign (vec_dest, vop);
+ gassign *new_stmt;
+ if (code == PAREN_EXPR)
+ new_stmt = gimple_build_assign (vec_dest, PAREN_EXPR, vop);
+ else
+ {
+ if (CONVERT_EXPR_CODE_P (code)
+ || code == VIEW_CONVERT_EXPR)
+ vop = build1 (VIEW_CONVERT_EXPR, vectype, vop);
+ new_stmt = gimple_build_assign (vec_dest, vop);
+ }
new_temp = make_ssa_name (vec_dest, new_stmt);
gimple_assign_set_lhs (new_stmt, new_temp);
vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
--
2.51.0