On Fri, 23 Oct 2009, Eric Botcazou wrote: > > I didn't find (or could construct) a single C or C++ testcase that > > wasn't fine with the new default, so I switched it (IIRC the default > > is disambiguating the most cases). > > Yes, the default is the optimistic answer and a few tests rely on it: > > FAIL: gcc.dg/tree-ssa/alias-18.c scan-tree-dump fre "with 1" > FAIL: gcc.dg/tree-ssa/pr13146.c scan-tree-dump optimized "return 0;" > FAIL: gcc.dg/tree-ssa/pr27799.c (test for excess errors) > FAIL: gcc.dg/tree-ssa/pr38895.c scan-tree-dump optimized "return 1;"
Indeed, I added them for this reason. > For alias-18.c: > > struct A { > int i; > int j; > float x; > }; > struct B { > struct A a; > int k; > }; > > int test1 (struct A *p, struct B *q) > { > p->i = 1; > q->k = -1; > return p->i; > } > > the 1 is expected to be propagated but isn't if the default is changed. > > IIUC the key here is that 'struct A' is a sub-structure of 'struct B' so, if > *p is not in the access path of *q, the references cannot alias. So I can > propose this for the end of nonaliasing_component_refs_p: btw, aliasing_component_refs_p would be a fine name. > /* We haven't found any common base to apply offset-based disambiguation. > There are two cases: > 1. The base access types have the same alias set. This can happen > in Ada when a function with an unconstrained parameter passed by > reference is called on a constrained object and inlined: the types > have the same alias set but aren't equivalent. The references may > alias in this case. > 2. The base access types don't have the same alias set, i.e. one set > is a subset of the other. We have proved that B1 is not in the > access path B2.path and that B2 is not in the access path B1.path > so the references may not alias. */ > return get_alias_set (type1) == get_alias_set (type2); That works for me. A patch along this line is pre-approved. Thanks, Richard.