[ 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?
Thanks,
- Tom
Remove superfluous code in intra_create_variable_infos
2015-10-23 Tom de Vries <t...@codesourcery.com>
* tree-ssa-structalias.c (intra_create_variable_infos): Remove
superfluous code.
---
gcc/tree-ssa-structalias.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 66a04b2..19db7f5 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -5885,18 +5885,12 @@ intra_create_variable_infos (struct function *fn)
continue;
}
- if (POINTER_TYPE_P (TREE_TYPE (t))
- && TYPE_RESTRICT (TREE_TYPE (t)))
- make_constraint_from_global_restrict (p, "PARM_RESTRICT");
- else
+ for (; p; p = vi_next (p))
{
- 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);
- }
+ 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);
}
}
--
1.9.1