https://gcc.gnu.org/g:6f99989ed7e2540a900d6431f9e477d427aef446
commit r14-12077-g6f99989ed7e2540a900d6431f9e477d427aef446 Author: Richard Biener <[email protected]> Date: Mon Jul 7 15:13:38 2025 +0200 tree-optimization/120358 - bogus PTA with structure access When we compute the constraint for something like MEM[(const struct QStringView &)&tok2 + 32] we go and compute what (const struct QStringView &)&tok2 + 32 points to and then add subvariables to its dereference that possibly fall in the range of the access according to the original refs size. In doing that we disregarded that the subvariable the starting address points to might not be aligned to it and thus the access might start at any point within that variable. The following conservatively adjusts the pruning of adjacent sub-variables to honor this. PR tree-optimization/120358 * tree-ssa-structalias.cc (get_constraint_for_1): Adjust pruning of sub-variables according to the imprecise known start offset. (cherry picked from commit aa5ae523e84a97bf3a582ea0fa73d959afa9b9c7) Diff: --- gcc/tree-ssa-structalias.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc index b6a5de1a8f6b..ab44a28235f4 100644 --- a/gcc/tree-ssa-structalias.cc +++ b/gcc/tree-ssa-structalias.cc @@ -3615,7 +3615,10 @@ get_constraint_for_1 (tree t, vec<ce_s> *results, bool address_p, size = -1; for (; curr; curr = vi_next (curr)) { - if (curr->offset - vi->offset < size) + /* The start of the access might happen anywhere + within vi, so conservatively assume it was + at its end. */ + if (curr->offset - (vi->offset + vi->size - 1) < size) { cs.var = curr->id; results->safe_push (cs);
