aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-08-26 09:02:01 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-08-26 09:02:01 +0000
commitbacd3fb68cce3b4b7c8c8bf5acd234ef080219c0 (patch)
tree35bfe979726778b00f3f6636a9666c41bd299094 /gcc
parent7b3d1847e637cae5e6ea174718df19ceaa5ae290 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c19
-rw-r--r--gcc/tree-ssa-structalias.c41
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");