On 29/10/15 12:13, Richard Biener wrote:
On Wed, 28 Oct 2015, Tom de Vries wrote:
>On 28/10/15 16:35, Richard Biener wrote:
> >On Tue, 27 Oct 2015, Tom de Vries wrote:
> >
> > >On 27/10/15 13:24, Tom de Vries wrote:
> > > >Thinking it over a bit more, I realized the constraint handling started
> > > >to be messy. I've reworked the patch series to simplify that first.
> > > >
> > > > 1 Simplify constraint handling
> > > > 2 Rename make_restrict_var_constraints to
> > > >make_param_constraints
> > > > 3 Add recursion to make_param_constraints
> > > > 4 Add handle_param parameter to create_variable_info_for_1
> > > > 5 Handle recursive restrict pointer in
> > > >create_variable_info_for_1
> > > > 6 Handle restrict struct fields recursively
> > > >
> > > >Currently doing bootstrap and regtest on x86_64.
> > > >
> > > >I'll repost the patch series in reply to this message.
> > >
> > >This patch gets rid of this bit of code in intra_create_variable_infos:
> > >...
> > > if (restrict_pointer_p)
> > > make_constraint_from_global_restrict (p, "PARM_RESTRICT");
> > > else
> > >..
> > >
> > >I already proposed to remove it here (
> > >https://gcc.gnu.org/ml/gcc-patches/2015-10/msg02426.html ) but there is a
> > >problem with that approach: It can happen that restrict_pointer_p is true,
> > >but
> > >p->only_restrict_pointers is false. This happens with fipa-pta, when
> > >create_function_info_for created a varinfo for the parameter before
> > >intra_create_variable_infos was called.
> > >
> > >The patch handles that case now by setting p->only_restrict_pointers.
> >
> >Hmm, but ... restrict only has an effect in non-IPA mode.
>
>Indeed, I also realized that by now.
>
>I wrote attached patch to make that explicit and simplify fipa-pta.
>
>OK for trunk if bootstrap and reg-test succeeds?
First, there was an error in the patch, it tested for flag_ipa_pta (so
it also affected ealias), but it was supposed to test for in_ipa mode.
That is fixed in attached version.
> I don't see the patch simplifies anything but only removes spurious
> settings by adding IMHO redundant checks.
Consider testcase:
...
int __attribute__((noinline, noclone))
foo (int *__restrict__ a, int *__restrict__ b)
{
*a = 1;
*b = 2;
}
int __attribute__((noinline, noclone))
bar (int *a, int *b)
{
foo (a, b);
}
...
The impact of this patch in the pta dump (focusing on the constraints
bit) is:
...
Generating constraints for foo (foo)
-foo.arg0 = &PARM_NOALIAS(20)
-PARM_NOALIAS(20) = NONLOCAL
-foo.arg1 = &PARM_NOALIAS(21)
-PARM_NOALIAS(21) = NONLOCAL
+foo.arg0 = &NONLOCAL
+foo.arg1 = &NONLOCAL
...
That's the kind of simplifications I'm trying to achieve.
Thanks,
- Tom
Don't interpret restrict in ipa_pta_execute
2015-10-28 Tom de Vries <t...@codesourcery.com>
* tree-ssa-structalias.c (push_fields_onto_fieldstack)
(create_variable_info_for_1, create_variable_info_for)
(intra_create_variable_infos): Ignore restrict if in_ipa_mode.
---
gcc/tree-ssa-structalias.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 6f72dd3..66ff8cb 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -5384,7 +5384,8 @@ push_fields_onto_fieldstack (tree type, vec<fieldoff_s> *fieldstack,
e.must_have_pointers = must_have_pointers_p;
e.may_have_pointers = true;
e.only_restrict_pointers
- = (!has_unknown_size
+ = (!in_ipa_mode
+ && !has_unknown_size
&& POINTER_TYPE_P (field_type)
&& TYPE_RESTRICT (field_type));
fieldstack->safe_push (e);
@@ -5697,7 +5698,8 @@ create_variable_info_for_1 (tree decl, const char *name, bool add_id)
vi->fullsize = tree_to_uhwi (declsize);
vi->size = vi->fullsize;
vi->is_full_var = true;
- if (POINTER_TYPE_P (TREE_TYPE (decl))
+ if (!in_ipa_mode
+ && POINTER_TYPE_P (TREE_TYPE (decl))
&& TYPE_RESTRICT (TREE_TYPE (decl)))
vi->only_restrict_pointers = 1;
fieldstack.release ();
@@ -5767,9 +5769,10 @@ create_variable_info_for (tree decl, const char *name, bool add_id)
continue;
/* Mark global restrict qualified pointers. */
- if ((POINTER_TYPE_P (TREE_TYPE (decl))
- && TYPE_RESTRICT (TREE_TYPE (decl)))
- || vi->only_restrict_pointers)
+ if (!in_ipa_mode
+ && ((POINTER_TYPE_P (TREE_TYPE (decl))
+ && TYPE_RESTRICT (TREE_TYPE (decl)))
+ || vi->only_restrict_pointers))
{
varinfo_t rvi
= make_constraint_from_global_restrict (vi, "GLOBAL_RESTRICT",
@@ -5886,7 +5889,8 @@ intra_create_variable_infos (struct function *fn)
passed-by-reference argument. */
for (t = DECL_ARGUMENTS (fn->decl); t; t = DECL_CHAIN (t))
{
- bool restrict_pointer_p = (POINTER_TYPE_P (TREE_TYPE (t))
+ bool restrict_pointer_p = (!in_ipa_mode
+ && POINTER_TYPE_P (TREE_TYPE (t))
&& TYPE_RESTRICT (TREE_TYPE (t)));
bool recursive_restrict_p
= (restrict_pointer_p
--
1.9.1