On Fri, 23 Oct 2015, Tom de Vries wrote: > [ was: Re: [PATCH][PR67671] Handle restrict pointer references as restrict in > AA ] > > On 22/09/15 16:02, Richard Biener wrote: > > On Tue, 22 Sep 2015, Tom de Vries wrote: > > > > > >Hi, > > > > > > > >Consider this test-case: > > > >... > > > >struct ps > > > >{ > > > > int *__restrict__ p; > > > >}; > > > > > > > >f (struct ps &__restrict__ ps1) > > > >{ > > > > *(ps1.p) = 1; > > > >} > > > >... > > > > > > > >Atm (meaning after the fix for PR67666) for this test-case, we register > > > two > > > >clique/base annotations, one for the load of pointer ps1.p and one for > > > the > > > >store to that pointer: > > > >... > > > >void f(ps&) (struct psD.2252 & restrict ps1D.2255) > > > >{ > > > > intD.9 * _3; > > > > > > > > # VUSE <.MEM_1(D)> > > > > # PT = { D.2262 } (nonlocal) > > > > _3 = MEM[(struct psD.2252 &)ps1_2(D) clique 1 base 1].pD.2254; > > > > > > > > # .MEM_4 = VDEF <.MEM_1(D)> > > > > MEM[(intD.9 *)_3 clique 1 base 2] = 1; > > > >... > > > > > > > > > > > >If we rewrite the test-case by replacing the struct with its only field, > > > we > > > >get: > > > >... > > > >f (int *__restrict__ &__restrict__ p) > > > >{ > > > > *p = 1; > > > >} > > > >... > > > > > > > >However, in this case, we register only one clique/base annotation, for > > > the > > > >load of pointer p, but not for the store to pointer p: > > > >... > > > >void f(int* __restrict__&) (intD.9 * restrict & restrict pD.2255) > > > >{ > > > > intD.9 * _3; > > > > > > > > # VUSE <.MEM_1(D)> > > > > # PT = nonlocal escaped > > > > _3 = MEM[(intD.9 * restrict &)p_2(D) clique 1 base 1]; > > > > > > > > # .MEM_4 = VDEF <.MEM_1(D)> > > > > *_3 = 1; > > > >... > > > > > > > > > > > >This patch makes sure we register both clique/base annotations for the > > > the > > > >second example. > > > > > > > >Bootstrapped and reg-tested on x86_64. > > > > > > > >OK for trunk? > > Ok. > > Hi, > > I think that after the committed change for PR67671, we arrive here in > intra_create_variable_infos with p->only_restrict_pointers == 1 and p->next == > 0: > ... > if (POINTER_TYPE_P (TREE_TYPE (t)) > && TYPE_RESTRICT (TREE_TYPE (t))) > make_constraint_from_global_restrict (p, "PARM_RESTRICT"); > ... > > In other words, we get the same effect if we enter the else branch: > ... > else > { > for (; p; p = vi_next (p)) > { > if (p->only_restrict_pointers) > make_constraint_from_global_restrict (p, "PARM_RESTRICT"); > else if (p->may_have_pointers) > make_constraint_from (p, nonlocal_id); > } > } > ... > > So, I think we can remove the if branch. Attached patch implements that. > > OK for trunk if bootstrap/reg-test succeeds?
Ok Richard. > Thanks, > - Tom > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)