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:
parent
7b3d1847e6
commit
bacd3fb68c
4 changed files with 67 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
19
gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c
Normal file
19
gcc/testsuite/gcc.dg/tree-ssa/restrict-4.c
Normal 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" } } */
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Reference in a new issue