On December 17, 2019 1:40:47 PM GMT+01:00, Martin Jambor <mjam...@suse.cz> wrote: >Hi, > >because the follow-up patches perform some non-trivial operations on >SRA patches, I wrote myself a verifier. And sure enough, it has >spotted two issues, one of which is fixed in this patch too - we did >not correctly set the parent link when creating artificial accesses >for propagation across assignments. The second one is the (not) >setting of reverse flag when creating accesses for total scalarization >but since the following patch removes the offending function, this >patch does not fix it. > >Bootstrapped and tested on x86_64, I consider this a pre-requisite for >the followup patches (and the parent link fix really is).
OK. Thanks Richard. >Thanks, > >Martin > >2019-12-10 Martin Jambor <mjam...@suse.cz> > > * tree-sra.c (verify_sra_access_forest): New function. > (verify_all_sra_access_forests): Likewise. > (create_artificial_child_access): Set parent. > (analyze_all_variable_accesses): Call the verifier. >--- > gcc/tree-sra.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 86 insertions(+) > >diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c >index 87c156f2f54..e077a811da9 100644 >--- a/gcc/tree-sra.c >+++ b/gcc/tree-sra.c >@@ -2321,6 +2321,88 @@ build_access_trees (struct access *access) > return true; > } > >+/* Traverse the access forest where ROOT is the first root and verify >that >+ various important invariants hold true. */ >+ >+DEBUG_FUNCTION void >+verify_sra_access_forest (struct access *root) >+{ >+ struct access *access = root; >+ tree first_base = root->base; >+ gcc_assert (DECL_P (first_base)); >+ do >+ { >+ gcc_assert (access->base == first_base); >+ if (access->parent) >+ gcc_assert (access->offset >= access->parent->offset >+ && access->size <= access->parent->size); >+ if (access->next_sibling) >+ gcc_assert (access->next_sibling->offset >+ >= access->offset + access->size); >+ >+ poly_int64 poffset, psize, pmax_size; >+ bool reverse; >+ tree base = get_ref_base_and_extent (access->expr, &poffset, >&psize, >+ &pmax_size, &reverse); >+ HOST_WIDE_INT offset, size, max_size; >+ if (!poffset.is_constant (&offset) >+ || !psize.is_constant (&size) >+ || !pmax_size.is_constant (&max_size)) >+ gcc_unreachable (); >+ gcc_assert (base == first_base); >+ gcc_assert (offset == access->offset); >+ gcc_assert (access->grp_unscalarizable_region >+ || size == max_size); >+ gcc_assert (max_size == access->size); >+ gcc_assert (reverse == access->reverse); >+ >+ if (access->first_child) >+ { >+ gcc_assert (access->first_child->parent == access); >+ access = access->first_child; >+ } >+ else if (access->next_sibling) >+ { >+ gcc_assert (access->next_sibling->parent == access->parent); >+ access = access->next_sibling; >+ } >+ else >+ { >+ while (access->parent && !access->next_sibling) >+ access = access->parent; >+ if (access->next_sibling) >+ access = access->next_sibling; >+ else >+ { >+ gcc_assert (access == root); >+ root = root->next_grp; >+ access = root; >+ } >+ } >+ } >+ while (access); >+} >+ >+/* Verify access forests of all candidates with accesses by calling >+ verify_access_forest on each on them. */ >+ >+DEBUG_FUNCTION void >+verify_all_sra_access_forests (void) >+{ >+ bitmap_iterator bi; >+ unsigned i; >+ EXECUTE_IF_SET_IN_BITMAP (candidate_bitmap, 0, i, bi) >+ { >+ tree var = candidate (i); >+ struct access *access = get_first_repr_for_decl (var); >+ if (access) >+ { >+ gcc_assert (access->base == var); >+ verify_sra_access_forest (access); >+ } >+ } >+} >+ >/* Return true if expr contains some ARRAY_REFs into a variable bounded > array. */ > >@@ -2566,6 +2648,7 @@ create_artificial_child_access (struct access >*parent, struct access *model, > access->offset = new_offset; > access->size = model->size; > access->type = model->type; >+ access->parent = parent; > access->grp_write = set_grp_write; > access->grp_read = false; > access->reverse = model->reverse; >@@ -2850,6 +2933,9 @@ analyze_all_variable_accesses (void) > > propagate_all_subaccesses (); > >+ if (flag_checking) >+ verify_all_sra_access_forests (); >+ > bitmap_copy (tmp, candidate_bitmap); > EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, bi) > {