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
This commit is contained in:
Richard Guenther 2009-08-26 09:02:01 +00:00 committed by Richard Biener
parent 7b3d1847e6
commit bacd3fb68c
4 changed files with 67 additions and 4 deletions

View File

@ -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

View File

@ -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.

View File

@ -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" } } */

View File

@ -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");