Commit d0c9ca44 by Tom de Vries Committed by Tom de Vries

Add initial constraints in create_function_info_for

2015-10-31  Tom de Vries  <tom@codesourcery.com>

	* tree-ssa-structalias.c (ipa_pta_execute): Add extra arg to call to
	create_function_info_for.  Dump constraints generated during
	create_function_info_for. Move intra_create_variable_infos call and
	function-return-values-escape bit to ...
	(create_function_info_for): ... here, and merge
	intra_create_variable_infos call with argument loop.  Add and handle
	nonlocal_p parameter.

From-SVN: r229619
parent 2ce4413c
2015-10-31 Tom de Vries <tom@codesourcery.com>
* tree-ssa-structalias.c (ipa_pta_execute): Add extra arg to call to
create_function_info_for. Dump constraints generated during
create_function_info_for. Move intra_create_variable_infos call and
function-return-values-escape bit to ...
(create_function_info_for): ... here, and merge
intra_create_variable_infos call with argument loop. Add and handle
nonlocal_p parameter.
2015-10-31 Tom de Vries <tom@codesourcery.com>
* tree-ssa-structalias.c (create_function_info_for): Make sure prev_vi
updating is alap, and seperated from preceding code. Make sure
insert_vi_for_tree is seperated from surrounding code.
......@@ -5409,10 +5409,12 @@ count_num_arguments (tree decl, bool *is_varargs)
}
/* Creation function node for DECL, using NAME, and return the index
of the variable we've created for the function. */
of the variable we've created for the function. If NONLOCAL_p, create
initial constraints. */
static varinfo_t
create_function_info_for (tree decl, const char *name, bool add_id)
create_function_info_for (tree decl, const char *name, bool add_id,
bool nonlocal_p)
{
struct function *fn = DECL_STRUCT_FUNCTION (decl);
varinfo_t vi, prev_vi;
......@@ -5493,6 +5495,10 @@ create_function_info_for (tree decl, const char *name, bool add_id)
insert_vi_for_tree (fn->static_chain_decl, chainvi);
if (nonlocal_p
&& chainvi->may_have_pointers)
make_constraint_from (chainvi, nonlocal_id);
gcc_assert (prev_vi->offset < chainvi->offset);
prev_vi->next = chainvi->id;
prev_vi = chainvi;
......@@ -5530,6 +5536,18 @@ create_function_info_for (tree decl, const char *name, bool add_id)
prev_vi = resultvi;
}
/* We also need to make function return values escape. Nothing
escapes by returning from main though. */
if (nonlocal_p
&& !MAIN_NAME_P (DECL_NAME (decl)))
{
varinfo_t fi, rvi;
fi = lookup_vi_for_tree (decl);
rvi = first_vi_for_offset (fi, fi_result);
if (rvi && rvi->offset == fi_result)
make_copy_constraint (get_varinfo (escaped_id), rvi->id);
}
/* Set up variables for each argument. */
arg = DECL_ARGUMENTS (decl);
for (i = 0; i < num_args; i++)
......@@ -5557,6 +5575,10 @@ create_function_info_for (tree decl, const char *name, bool add_id)
if (arg)
insert_vi_for_tree (arg, argvi);
if (nonlocal_p
&& argvi->may_have_pointers)
make_constraint_from (argvi, nonlocal_id);
gcc_assert (prev_vi->offset < argvi->offset);
prev_vi->next = argvi->id;
prev_vi = argvi;
......@@ -5586,6 +5608,10 @@ create_function_info_for (tree decl, const char *name, bool add_id)
argvi->is_heap_var = true;
argvi->fullsize = vi->fullsize;
if (nonlocal_p
&& argvi->may_have_pointers)
make_constraint_from (argvi, nonlocal_id);
gcc_assert (prev_vi->offset < argvi->offset);
prev_vi->next = argvi->id;
prev_vi = argvi;
......@@ -7312,8 +7338,34 @@ ipa_pta_execute (void)
gcc_assert (!node->clone_of);
/* For externally visible or attribute used annotated functions use
local constraints for their arguments.
For local functions we see all callers and thus do not need initial
constraints for parameters. */
bool nonlocal_p = (node->used_from_other_partition
|| node->externally_visible
|| node->force_output
|| node->address_taken);
vi = create_function_info_for (node->decl,
alias_get_name (node->decl), false);
alias_get_name (node->decl), false,
nonlocal_p);
if (dump_file
&& from != constraints.length ())
{
fprintf (dump_file,
"Generating intial constraints for %s", node->name ());
if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
fprintf (dump_file, " (%s)",
IDENTIFIER_POINTER
(DECL_ASSEMBLER_NAME (node->decl)));
fprintf (dump_file, "\n\n");
dump_constraints (dump_file, from);
fprintf (dump_file, "\n");
from = constraints.length ();
}
node->call_for_symbol_thunks_and_aliases
(associate_varinfo_to_alias, vi, true);
}
......@@ -7360,29 +7412,6 @@ ipa_pta_execute (void)
func = DECL_STRUCT_FUNCTION (node->decl);
gcc_assert (cfun == NULL);
/* For externally visible or attribute used annotated functions use
local constraints for their arguments.
For local functions we see all callers and thus do not need initial
constraints for parameters. */
if (node->used_from_other_partition
|| node->externally_visible
|| node->force_output
|| node->address_taken)
{
intra_create_variable_infos (func);
/* We also need to make function return values escape. Nothing
escapes by returning from main though. */
if (!MAIN_NAME_P (DECL_NAME (node->decl)))
{
varinfo_t fi, rvi;
fi = lookup_vi_for_tree (node->decl);
rvi = first_vi_for_offset (fi, fi_result);
if (rvi && rvi->offset == fi_result)
make_copy_constraint (get_varinfo (escaped_id), rvi->id);
}
}
/* Build constriants for the function body. */
FOR_EACH_BB_FN (bb, func)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment