https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111807
--- Comment #10 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Martin Jambor <jamb...@gcc.gnu.org>: https://gcc.gnu.org/g:96e1978b213482fc4c25693b91ae2ead481af620 commit r14-6535-g96e1978b213482fc4c25693b91ae2ead481af620 Author: Martin Jambor <mjam...@suse.cz> Date: Thu Dec 14 11:09:06 2023 +0100 SRA: Relax requirements to use build_reconstructed_reference (PR 111807) This patch half-reverts 3aaf704bca3e and replaces it with a fix with relaxed requiremets for invoking build_reconstructed_reference in build_ref_for_model. build_ref_for_model/build_ref_for_offset is used in two slightly different contexts. The first is when we are looking at an assignmernt like p->field_A.field_B = s.field_B; and we have a replacements for e.g. s.field_B.field_C.field_D and we want to store them directly to p->field_A.field_B.field_C.field_D (as opposed to going through s or using a MEM_REF based in p->field_A.field_B). In this case, the offset of the "model" (s.field_B.field_C.field_D) within this can be different than offset within the LHS that we want to reach (field_C.field_D within the "base" p->field_A.field_B). Patch 3aaf704bca3e has caused us to unnecessarily create MEM_REFs for these situations. These uses of build_ref_for_model work with the relaxed condition just fine. The second, problematic, context is when somewhere in the function we have an assignment s.field_A = t.field_A.field_B; and we are creating an access structure to represent s.field_A.field_B even if it is not actually accessed in the original input. This is done after scanning the entire function body and we need to construct a "universal" reference to s.field_A.field_B. In this case the "base" is "s" and it has to be the DECL itself and not some reference for it because for arbitrary references we need a GSI pointing to a statement which we don't have, the reference is supposed to be universal. But then using build_ref_for_model and within it build_reconstructed_reference misbihaves if the expression contains any ARRAY_REFs. In the first case those are fine because as we eventually reach the aggregate type that matches a real LHS or RHS, we know we we can just bolt the rest of the references onto it and end up with the correct overall reference. However when dealing with s.array[1].field_A = s.array[2].field_B; we cannot just bolt array[2] reference when we want array[1] but that is exactly what happens when we use build_reconstructed_reference and keep it walking all the way to s. I was consiering making all users of the second kind use directly build_ref_for_offset instead of build_ref_for_model but the latter also handles COMPONENT_REFs to bit-fields which the former does not. THerefore I have deided to use the NULL-ness of GSI as an indicator how strict we need to be. I have changed the function comment to reflect that. I have been able to observe diambiguation improvements with this patch over currenct master, we do successfuly manage a few more aliasing_component_refs_p disambiguations when compiling cc1, going from: Alias oracle query stats: refs_may_alias_p: 94354287 disambiguations, 106279231 queries ref_maybe_used_by_call_p: 1572511 disambiguations, 95618222 queries call_may_clobber_ref_p: 649273 disambiguations, 659371 queries stmt_kills_ref_p: 142342 kills, 8407309 queries nonoverlapping_component_refs_p: 19 disambiguations, 10227 queries nonoverlapping_refs_since_match_p: 15665 disambiguations, 52585 must overlaps, 68893 queries aliasing_component_refs_p: 67090 disambiguations, 3081766 queries TBAA oracle: 22675296 disambiguations 61781978 queries 14045969 are in alias set 0 10997085 queries asked about the same object 153 queries asked about the same alias set 0 access volatile 12485774 are dependent in the DAG 1577701 are aritificially in conflict with void * Modref stats: modref kill: 832 kills, 19399 queries modref use: 50760 disambiguations, 1825109 queries modref clobber: 1371014 disambiguations, 40152535 queries 5190238 tbaa queries (0.129263 per modref query) 1341663 base compares (0.033414 per modref query) PTA query stats: pt_solution_includes: 36784427 disambiguations, 46141175 queries pt_solutions_intersect: 4519387 disambiguations, 17081996 queries to: Alias oracle query stats: refs_may_alias_p: 94354083 disambiguations, 106278948 queries ref_maybe_used_by_call_p: 1572511 disambiguations, 95618018 queries call_may_clobber_ref_p: 649273 disambiguations, 659371 queries stmt_kills_ref_p: 142342 kills, 8407310 queries nonoverlapping_component_refs_p: 19 disambiguations, 10227 queries nonoverlapping_refs_since_match_p: 15665 disambiguations, 52585 must overlaps, 68893 queries aliasing_component_refs_p: 67104 disambiguations, 3081781 queries TBAA oracle: 22676608 disambiguations 61782455 queries 14044948 are in alias set 0 10998619 queries asked about the same object 153 queries asked about the same alias set 0 access volatile 12484882 are dependent in the DAG 1577245 are aritificially in conflict with void * Modref stats: modref kill: 832 kills, 19399 queries modref use: 50760 disambiguations, 1825106 queries modref clobber: 1371028 disambiguations, 40152504 queries 5190319 tbaa queries (0.129265 per modref query) 1341403 base compares (0.033408 per modref query) PTA query stats: pt_solution_includes: 36784449 disambiguations, 46141210 queries pt_solutions_intersect: 4519320 disambiguations, 17082083 queries gcc/ChangeLog: 2023-12-13 Martin Jambor <mjam...@suse.cz> PR tree-optimization/111807 * tree-sra.cc (build_ref_for_model): Allow offset smaller than model->offset when gsi is non-NULL. Adjust function comment.