ipa-cp.c (ipcp_versionable_function_p): Thunks are not versionable.

* ipa-cp.c (ipcp_versionable_function_p): Thunks are not versionable.
	(ipcp_initialize_node_lattices): Do not deal with aliases; Do not try to
	propagate through thunks.
	(ipcp_change_tops_to_bottom): Do not deal with aliases.

From-SVN: r174916
This commit is contained in:
Jan Hubicka 2011-06-10 18:49:28 +02:00 committed by Jan Hubicka
parent c8246dbe68
commit 0818c24cb0
2 changed files with 55 additions and 40 deletions

View File

@ -1,3 +1,10 @@
2011-06-10 Jan Hubicka <jh@suse.cz>
* ipa-cp.c (ipcp_versionable_function_p): Thunks are not versionable.
(ipcp_initialize_node_lattices): Do not deal with aliases; Do not try to
propagate through thunks.
(ipcp_change_tops_to_bottom): Do not deal with aliases.
2011-06-10 Jan Hubicka <jh@suse.cz> 2011-06-10 Jan Hubicka <jh@suse.cz>
* ipa-prop.c (ipa_write_node_info): Stream jump functions for indirect * ipa-prop.c (ipa_write_node_info): Stream jump functions for indirect

View File

@ -354,6 +354,10 @@ ipcp_versionable_function_p (struct cgraph_node *node)
if (node->alias) if (node->alias)
return false; return false;
/* We don't know how to clone thunks. */
if (node->thunk.thunk_p)
return false;
/* There are a number of generic reasons functions cannot be versioned. We /* There are a number of generic reasons functions cannot be versioned. We
also cannot remove parameters if there are type attributes such as fnspec also cannot remove parameters if there are type attributes such as fnspec
present. */ present. */
@ -507,9 +511,11 @@ ipcp_initialize_node_lattices (struct cgraph_node *node)
struct ipa_node_params *info = IPA_NODE_REF (node); struct ipa_node_params *info = IPA_NODE_REF (node);
enum ipa_lattice_type type; enum ipa_lattice_type type;
if (ipa_is_called_with_var_arguments (info) || node->alias) if (ipa_is_called_with_var_arguments (info))
type = IPA_BOTTOM; type = IPA_BOTTOM;
else if (node->local.local) /* We don't know how to clone thunks even when they are local. */
else if (node->local.local
&& !node->thunk.thunk_p)
type = IPA_TOP; type = IPA_TOP;
/* When cloning is allowed, we can assume that externally visible functions /* When cloning is allowed, we can assume that externally visible functions
are not called. We will compensate this by cloning later. */ are not called. We will compensate this by cloning later. */
@ -592,40 +598,41 @@ ipcp_change_tops_to_bottom (void)
prop_again = false; prop_again = false;
for (node = cgraph_nodes; node; node = node->next) for (node = cgraph_nodes; node; node = node->next)
{ if (!node->alias)
struct ipa_node_params *info = IPA_NODE_REF (node); {
count = ipa_get_param_count (info); struct ipa_node_params *info = IPA_NODE_REF (node);
for (i = 0; i < count; i++) count = ipa_get_param_count (info);
{ for (i = 0; i < count; i++)
struct ipcp_lattice *lat = ipa_get_lattice (info, i); {
if (lat->type == IPA_TOP) struct ipcp_lattice *lat = ipa_get_lattice (info, i);
{ if (lat->type == IPA_TOP)
prop_again = true; {
if (dump_file) prop_again = true;
{ if (dump_file)
fprintf (dump_file, "Forcing param "); {
print_generic_expr (dump_file, ipa_get_param (info, i), 0); fprintf (dump_file, "Forcing param ");
fprintf (dump_file, " of node %s to bottom.\n", print_generic_expr (dump_file, ipa_get_param (info, i), 0);
cgraph_node_name (node)); fprintf (dump_file, " of node %s to bottom.\n",
} cgraph_node_name (node));
lat->type = IPA_BOTTOM; }
} lat->type = IPA_BOTTOM;
if (!ipa_param_cannot_devirtualize_p (info, i) }
&& ipa_param_types_vec_empty (info, i)) if (!ipa_param_cannot_devirtualize_p (info, i)
{ && ipa_param_types_vec_empty (info, i))
prop_again = true; {
ipa_set_param_cannot_devirtualize (info, i); prop_again = true;
if (dump_file) ipa_set_param_cannot_devirtualize (info, i);
{ if (dump_file)
fprintf (dump_file, "Marking param "); {
print_generic_expr (dump_file, ipa_get_param (info, i), 0); fprintf (dump_file, "Marking param ");
fprintf (dump_file, " of node %s as unusable for " print_generic_expr (dump_file, ipa_get_param (info, i), 0);
"devirtualization.\n", fprintf (dump_file, " of node %s as unusable for "
cgraph_node_name (node)); "devirtualization.\n",
} cgraph_node_name (node));
} }
} }
} }
}
return prop_again; return prop_again;
} }
@ -813,10 +820,11 @@ ipcp_iterate_stage (void)
ipa_update_after_lto_read (); ipa_update_after_lto_read ();
for (node = cgraph_nodes; node; node = node->next) for (node = cgraph_nodes; node; node = node->next)
{ if (!node->alias)
ipcp_initialize_node_lattices (node); {
ipcp_compute_node_scale (node); ipcp_initialize_node_lattices (node);
} ipcp_compute_node_scale (node);
}
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
ipcp_print_all_lattices (dump_file); ipcp_print_all_lattices (dump_file);