Hi Richi, > -----Original Message----- > From: Gcc-patches <gcc-patches- > bounces+tamar.christina=arm....@gcc.gnu.org> On Behalf Of Richard > Biener > Sent: Wednesday, June 9, 2021 1:53 PM > To: gcc-patches@gcc.gnu.org > Cc: Richard Sandiford <richard.sandif...@arm.com> > Subject: [PATCH] tree-optimization/100981 - fix SLP patterns involving > reductions > > The following fixes the SLP FMA patterns to preserve reduction info and the > reduction vectorization to consider internal function call defs for the > reduction stmt. > > Bootstrap & regtest running on x86_64-unknown-linux-gnu, Andre verified > we're not turning an ICE into a wrong-code bug (.COMPLEX_MUL now > appears in the reduction chain). > > Note there's a testcase for the ICE which adds -march=armv8.3-a and a > testcase for correctness which doesn't since I didn't find any dg effective > target verifying armv8.3-a code can run.
It's called arm_v8_3a_complex_neon_hw Regards, Tamar > > 2021-06-09 Richard Biener <rguent...@suse.de> > > PR tree-optimization/100981 > * tree-vect-loop.c (vect_create_epilog_for_reduction): Use > gimple_get_lhs to also handle calls. > * tree-vect-slp-patterns.c (complex_pattern::build): Transfer > reduction info. > > * gfortran.dg/vect/pr100981-1.f90: New testcase. > * gfortran.dg/vect/pr100981-2.f90: Likewise. > --- > gcc/tree-vect-loop.c | 2 +- > gcc/tree-vect-slp-patterns.c | 5 ++++- > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index > ba36348b835..ee79808472c 100644 > --- a/gcc/tree-vect-loop.c > +++ b/gcc/tree-vect-loop.c > @@ -5247,7 +5247,7 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > gcc_assert (STMT_VINFO_RELATED_STMT (orig_stmt_info) == stmt_info); > } > > - scalar_dest = gimple_assign_lhs (orig_stmt_info->stmt); > + scalar_dest = gimple_get_lhs (orig_stmt_info->stmt); > scalar_type = TREE_TYPE (scalar_dest); > scalar_results.create (group_size); > new_scalar_dest = vect_create_destination_var (scalar_dest, NULL); diff -- > git a/gcc/tree-vect-slp-patterns.c b/gcc/tree-vect-slp-patterns.c index > b25655c9876..2ed49cd9edc 100644 > --- a/gcc/tree-vect-slp-patterns.c > +++ b/gcc/tree-vect-slp-patterns.c > @@ -544,6 +544,8 @@ complex_pattern::build (vec_info *vinfo) > { > /* Calculate the location of the statement in NODE to replace. */ > stmt_info = SLP_TREE_REPRESENTATIVE (node); > + stmt_vec_info reduc_def > + = STMT_VINFO_REDUC_DEF (vect_orig_stmt (stmt_info)); > gimple* old_stmt = STMT_VINFO_STMT (stmt_info); > tree lhs_old_stmt = gimple_get_lhs (old_stmt); > tree type = TREE_TYPE (lhs_old_stmt); @@ -568,9 +570,10 @@ > complex_pattern::build (vec_info *vinfo) > = vinfo->add_pattern_stmt (call_stmt, stmt_info); > > /* Make sure to mark the representative statement pure_slp and > - relevant. */ > + relevant and transfer reduction info. */ > STMT_VINFO_RELEVANT (call_stmt_info) = vect_used_in_scope; > STMT_SLP_TYPE (call_stmt_info) = pure_slp; > + STMT_VINFO_REDUC_DEF (call_stmt_info) = reduc_def; > > gimple_set_bb (call_stmt, gimple_bb (stmt_info->stmt)); > STMT_VINFO_VECTYPE (call_stmt_info) = SLP_TREE_VECTYPE (node); > -- > 2.26.2