From 6bb6e2044ced33d08175361b8e39a9c5d4a868a6 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 28 Jul 2021 14:16:35 +0200 Subject: [PATCH] tree-optimization/101615 - SLP permute opt of existing vectors This fixes one issue discovered when analyzing PR101615, namely we happily push permutes to pre-existing vectors but end up not actually permuting them. In fact we don't want to, so force materialization on the external. It doesn't fix the original testcase though. 2021-07-28 Richard Biener PR tree-optimization/101615 * tree-vect-slp.c (vect_optimize_slp): Pre-existing vector external nodes cannot be permuted so make them perm_out 0. * gcc.dg/vect/bb-slp-pr101615-1.c: New testcase. --- gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c | 30 +++++++++++++++++++ gcc/tree-vect-slp.c | 6 ++-- 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c new file mode 100644 index 000000000000..d1c9c02d517a --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-additional-options "-w -Wno-psabi" } */ + +#include "tree-vect.h" + +typedef int v4si __attribute__((vector_size(16))); + +int a[4]; +int b[4]; + +void __attribute__((noipa)) +foo (v4si x) +{ + b[0] = a[3] + x[0]; + b[1] = a[2] + x[1]; + b[2] = a[1] + x[2]; + b[3] = a[0] + x[3]; +} + +int main() +{ + check_vect (); + for (int i = 0; i < 4; ++i) + a[i] = i; + v4si x = (v4si) { 8, 6, 4, 2 }; + foo (x); + if (b[0] != 11 || b[1] != 8 || b[2] != 5 || b[3] != 2) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index b9d88c2d9431..07cc24a60e1b 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -3648,8 +3648,10 @@ vect_optimize_slp (vec_info *vinfo) slp_tree node = vertices[idx].node; /* Handle externals and constants optimistically throughout the - iteration. */ - if (SLP_TREE_DEF_TYPE (node) == vect_external_def + iteration. But treat existing vectors as fixed since we + do not handle permuting them below. */ + if ((SLP_TREE_DEF_TYPE (node) == vect_external_def + && !SLP_TREE_VEC_DEFS (node).exists ()) || SLP_TREE_DEF_TYPE (node) == vect_constant_def) continue; -- 2.47.2