On Tue, Jul 4, 2017 at 2:01 PM, Richard Sandiford <richard.sandif...@linaro.org> wrote: > Richard Biener <richard.guent...@gmail.com> writes: >> On Mon, Jul 3, 2017 at 9:49 AM, Richard Sandiford >> <richard.sandif...@linaro.org> wrote: >>> @@ -2070,8 +2143,7 @@ vect_find_same_alignment_drs (struct dat >>> if (dra == drb) >>> return; >>> >>> - if (!operand_equal_p (DR_BASE_OBJECT (dra), DR_BASE_OBJECT (drb), >>> - OEP_ADDRESS_OF) >>> + if (!operand_equal_p (DR_BASE_ADDRESS (dra), DR_BASE_ADDRESS (drb), 0) >> >> Why this change? It's semantically weaker after your change. > > It's because the DR_BASE_OBJECT comes from the access_fn analysis > while the DR_BASE_ADDRESS comes from the innermost_loop_behavior. > I hadn't realised when adding the original code how different the > two were, and since all the other parts are based on the > innermost_loop_behavior, I think this check should be too. > E.g. it doesn't really make sense to compare DR_INITs based > on DR_BASE_OBJECT.
Ah ok, makes sense now. > I guess it should have been a separate patch though. No need. >>> || !operand_equal_p (DR_OFFSET (dra), DR_OFFSET (drb), 0) >>> || !operand_equal_p (DR_STEP (dra), DR_STEP (drb), 0)) >>> return; >>> @@ -2129,6 +2201,7 @@ vect_analyze_data_refs_alignment (loop_v >>> vec<data_reference_p> datarefs = vinfo->datarefs; >>> struct data_reference *dr; >>> >>> + vect_record_base_alignments (vinfo); >>> FOR_EACH_VEC_ELT (datarefs, i, dr) >>> { >>> stmt_vec_info stmt_info = vinfo_for_stmt (DR_STMT (dr)); >>> @@ -3327,7 +3400,8 @@ vect_analyze_data_refs (vec_info *vinfo, >>> { >>> struct data_reference *newdr >>> = create_data_ref (NULL, loop_containing_stmt (stmt), >>> - DR_REF (dr), stmt, maybe_scatter ? false : true); >>> + DR_REF (dr), stmt, !maybe_scatter, >>> + DR_IS_CONDITIONAL_IN_STMT (dr)); >>> gcc_assert (newdr != NULL && DR_REF (newdr)); >>> if (DR_BASE_ADDRESS (newdr) >>> && DR_OFFSET (newdr) >>> Index: gcc/tree-vect-slp.c >>> =================================================================== >>> --- gcc/tree-vect-slp.c 2017-07-03 08:20:56.404763323 +0100 >>> +++ gcc/tree-vect-slp.c 2017-07-03 08:42:51.149380545 +0100 >>> @@ -2358,6 +2358,7 @@ new_bb_vec_info (gimple_stmt_iterator re >>> gimple_stmt_iterator gsi; >>> >>> res = (bb_vec_info) xcalloc (1, sizeof (struct _bb_vec_info)); >>> + new (&res->base_alignments) vec_base_alignments (); >> >> Ick. I'd rather make this proper C++ and do >> >> res = new _bb_vec_info; >> >> and add a constructor to the vec_info base initializing the hashtable. >> The above smells fishy. > > I knew I pushing my luck with that one. I just didn't want to have to > convert the current xcalloc of loop_vec_info into a long list of explicit > zero initializers. (OK, we have a lot of explicit zero assignments already, > but certainly some fields rely on the calloc zeroing.) > >> Looks like vec<> are happy with .create () being called on a zeroed struct. >> >> Alternatively add .create () to hashtable/map. > > The difference is that vec<> is explicitly meant to be POD, whereas > hash_map isn't (and I don't think we want it to be). Ah, indeed. So your patch makes *vec_info no longer POD (no problem but then use new/delete and constructors). > Ah well. I'll do a separate pre-patch to C++-ify the structures. Thanks. Richard. > Thanks, > Richard