On Tue, 24 Sep 2024, Tamar Christina wrote: > > Can you explain how you get to see constant/external defs with > > astmt_vec_info? That's somehow a violation of some inherentinvariant in > > the vectorizer. > > I'm not sure I actually get any. It could be the condition is never hit > with a stmt_vec_info. I had assumed however since the condition is part > of a gimple_cond and if one of the arguments of the gimple_cond is loop > bound, that the condition would be analyzed too. > > So if you're saying you never get a stmt_vec_info for invariants at this > point (I assume you could see you see them in the corresponding slp > tree) then maybe checking for the stmt_vec_info is enough. > > However, when I was looking around for how to check for externals I > noticed other patterns also check for externals and constants. So I > assumed that you could indeed get them.
You usually check that after doing vect_is_simple_use on the SSA name or constant which internally makes all stmts with a stmt_vec_info one of the internal def kinds. So I guess you could do vect_is_simple_use on 'var' as well and check the 'dt' it will populate Richard. > Kind regards, > Tamar > > > ________________________________ > From: Richard Biener <rguent...@suse.de> > Sent: Tuesday, September 24, 2024 7:45 AM > To: Tamar Christina <tamar.christ...@arm.com> > Cc: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>; nd <n...@arm.com>; > j...@ventanamicro.com <j...@ventanamicro.com> > Subject: RE: [PATCH]middle-end: check explicitly for external or constants > when checking for loop invariant [PR116817] > > On Mon, 23 Sep 2024, Tamar Christina wrote: > > > I had made the condition to strict before, here's an updated patch: > > > > Hi All, > > > > The previous check if a value was external was checking > > !vect_get_internal_def (vinfo, var) but this of course isn't completely > > right > > as they could reductions etc. > > > > This changes the check to just explicitly look at externals and constants. > > Note that reductions remain unhandled here, but we don't support codegen of > > boolean reductions today anyway. > > Can you explain how you get to see constant/external defs with a > stmt_vec_info? That's somehow a violation of some inherent > invariant in the vectorizer. > > Richard. > > > So at the time we do then this would have the be handled as well in > > lowering. > > > > Bootstrapped Regtested on aarch64-none-linux-gnu, arm-none-linux-gnueabihf, > > x86_64-pc-linux-gnu -m32, -m64 and no issues. > > > > Ok for master? > > > > Thanks, > > Tamar > > > > gcc/ChangeLog: > > > > PR tree-optimization/116817 > > * tree-vect-patterns.cc (vect_recog_bool_pattern): Check for const or > > externals. > > > > gcc/testsuite/ChangeLog: > > > > PR tree-optimization/116817 > > * g++.dg/vect/pr116817.cc: New test. > > > > -- inline copy of patch -- > > > > diff --git a/gcc/testsuite/g++.dg/vect/pr116817.cc > > b/gcc/testsuite/g++.dg/vect/pr116817.cc > > new file mode 100644 > > index > > 0000000000000000000000000000000000000000..7e28982fb138c2cccc4f956aedb03fa454d9d858 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/vect/pr116817.cc > > @@ -0,0 +1,16 @@ > > +/* { dg-do compile } */ > > +/* { dg-additional-options "-O3" } */ > > + > > +int main_ulData0; > > +unsigned *main_pSrcBuffer; > > +int main(void) { > > + int iSrc = 0; > > + bool bData0; > > + for (; iSrc < 4; iSrc++) { > > + if (bData0) > > + main_pSrcBuffer[iSrc] = main_ulData0; > > + else > > + main_pSrcBuffer[iSrc] = 0; > > + bData0 = !bData0; > > + } > > +} > > diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc > > index > > e7e877dd2adb55262822f1660f8d92b42d44e6d0..f0298b2ab97a1e7dd0d943340e1389c3c0fa796e > > 100644 > > --- a/gcc/tree-vect-patterns.cc > > +++ b/gcc/tree-vect-patterns.cc > > @@ -6062,12 +6062,15 @@ vect_recog_bool_pattern (vec_info *vinfo, > > if (get_vectype_for_scalar_type (vinfo, type) == NULL_TREE) > > return NULL; > > > > + stmt_vec_info var_def_info = vinfo->lookup_def (var); > > if (check_bool_pattern (var, vinfo, bool_stmts)) > > var = adjust_bool_stmts (vinfo, bool_stmts, type, stmt_vinfo); > > else if (integer_type_for_mask (var, vinfo)) > > return NULL; > > else if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE > > - && !vect_get_internal_def (vinfo, var)) > > + && (!var_def_info > > + || STMT_VINFO_DEF_TYPE (var_def_info) == vect_external_def > > + || STMT_VINFO_DEF_TYPE (var_def_info) == > > vect_constant_def)) > > { > > /* If the condition is already a boolean then manually convert it > > to a > > mask of the given integer type but don't set a vectype. */ > > > > -- > Richard Biener <rguent...@suse.de> > SUSE Software Solutions Germany GmbH, > Frankenstrasse 146, 90461 Nuernberg, Germany; > GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg) > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)