diff options
author | Richard Guenther <rguenther@suse.de> | 2009-08-26 09:02:01 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-08-26 09:02:01 +0000 |
commit | bacd3fb68cce3b4b7c8c8bf5acd234ef080219c0 (patch) | |
tree | 35bfe979726778b00f3f6636a9666c41bd299094 /gcc | |
parent | 7b3d1847e637cae5e6ea174718df19ceaa5ae290 (diff) | |
download | gcc-bacd3fb68cce3b4b7c8c8bf5acd234ef080219c0.zip gcc-bacd3fb68cce3b4b7c8c8bf5acd234ef080219c0.tar.gz gcc-bacd3fb68cce3b4b7c8c8bf5acd234ef080219c0.tar.bz2 |
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 <rguenther@suse.de>
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c | 19 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 41 |
4 files changed, 67 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6a67828d..85f1015 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-08-26 Richard Guenther <rguenther@suse.de> + + * 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 <ubizjak@gmail.com> * config/alpha/sync.md: Update comment about unpredictable LL/SC lock diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c2236d5..e11a926 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-08-26 Richard Guenther <rguenther@suse.de> + + * gcc.dg/tree-ssa/restrict-4.c: New testcase. + 2009-08-26 Jason Merrill <jason@redhat.com> * 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 0000000..3a36def --- /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 72e1083..a9d3132 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"); |