From: Richard Guenther Date: Wed, 26 Aug 2009 09:02:01 +0000 (+0000) Subject: tree-ssa-structalias.c (create_variable_info_for): Remove strange whole-program condi... X-Git-Tag: releases/gcc-4.5.0~3835 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bacd3fb68cce3b4b7c8c8bf5acd234ef080219c0;p=thirdparty%2Fgcc.git tree-ssa-structalias.c (create_variable_info_for): Remove strange whole-program condition, prepare to be called for non-globals. 2009-08-26 Richard Guenther * tree-ssa-structalias.c (create_variable_info_for): Remove strange whole-program condition, prepare to be called for non-globals. (intra_create_variable_infos): For restrict qualified DECL_BY_REFERENCE params build a representative with known type and track its fields. * gcc.dg/tree-ssa/restrict-4.c: New testcase. From-SVN: r151117 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6a67828d7ae0..85f1015f7b99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-08-26 Richard Guenther + + * tree-ssa-structalias.c (create_variable_info_for): Remove + strange whole-program condition, prepare to be called for non-globals. + (intra_create_variable_infos): For restrict qualified DECL_BY_REFERENCE + params build a representative with known type and track its fields. + 2009-08-26 Uros Bizjak * config/alpha/sync.md: Update comment about unpredictable LL/SC lock diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c2236d54f19c..e11a926dda95 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-08-26 Richard Guenther + + * gcc.dg/tree-ssa/restrict-4.c: New testcase. + 2009-08-26 Jason Merrill * g++.dg/cpp0x/explicit3.C: New. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c b/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c new file mode 100644 index 000000000000..3a36def25ccb --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim1-details" } */ + +struct Foo +{ + int n; + int * __restrict__ p; +}; +void bar(struct Foo f, int * __restrict__ q) +{ + int i; + for (i = 0; i < f.n; ++i) + { + *q += f.p[i]; + } +} + +/* { dg-final { scan-tree-dump "Executing store motion" "lim1" } } */ +/* { dg-final { cleanup-tree-dump "lim1" } } */ diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 72e10835bb56..a9d31325b574 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -4548,13 +4548,13 @@ create_variable_info_for (tree decl, const char *name) newvi->fullsize = vi->fullsize; newvi->may_have_pointers = fo->may_have_pointers; insert_into_field_list (vi, newvi); - if (newvi->is_global_var - && (!flag_whole_program || !in_ipa_mode) + if ((newvi->is_global_var || TREE_CODE (decl) == PARM_DECL) && newvi->may_have_pointers) { if (fo->only_restrict_pointers) make_constraint_from_restrict (newvi, "GLOBAL_RESTRICT"); - make_copy_constraint (newvi, nonlocal_id); + if (newvi->is_global_var && !in_ipa_mode) + make_copy_constraint (newvi, nonlocal_id); } stats.total_vars++; @@ -4618,8 +4618,41 @@ intra_create_variable_infos (void) if (!could_have_pointers (t)) continue; + /* For restrict qualified pointers to objects passed by + reference build a real representative for the pointed-to object. */ + if (DECL_BY_REFERENCE (t) + && POINTER_TYPE_P (TREE_TYPE (t)) + && TYPE_RESTRICT (TREE_TYPE (t))) + { + struct constraint_expr lhsc, rhsc; + varinfo_t vi; + tree heapvar = heapvar_lookup (t, 0); + if (heapvar == NULL_TREE) + { + var_ann_t ann; + heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)), + "PARM_NOALIAS"); + DECL_EXTERNAL (heapvar) = 1; + heapvar_insert (t, 0, heapvar); + ann = get_var_ann (heapvar); + ann->is_heapvar = 1; + } + if (gimple_referenced_vars (cfun)) + add_referenced_var (heapvar); + lhsc.var = get_vi_for_tree (t)->id; + lhsc.type = SCALAR; + lhsc.offset = 0; + rhsc.var = (vi = get_vi_for_tree (heapvar))->id; + rhsc.type = ADDRESSOF; + rhsc.offset = 0; + process_constraint (new_constraint (lhsc, rhsc)); + vi->is_restrict_var = 1; + continue; + } + for (p = get_vi_for_tree (t); p; p = p->next) - make_constraint_from (p, nonlocal_id); + if (p->may_have_pointers) + make_constraint_from (p, nonlocal_id); if (POINTER_TYPE_P (TREE_TYPE (t)) && TYPE_RESTRICT (TREE_TYPE (t))) make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT");