From: Jan Hubicka <hubicka@ucw.cz>
To: gcc-patches@gcc.gnu.org
Subject: Cgraph alias reorg 4/14 (ipa-pure-const and ipa-reference update)
Date: Fri, 10 Jun 2011 10:15:00 -0000 [thread overview]
Message-ID: <20110610101239.GB28776@kam.mff.cuni.cz> (raw)
Hi,
this patch updates ipa-pure-const and ipa-reference to be ready for aliases.
There is nothing difficult - the passes propagate from caller to callee and
thus all they need is to skip the aliases and be aware of the fact that body
visibility may change from the edge to edge.
Bootstrapped/regtested x86_64-linux, will commit it shortly.
Honza
* ipa-utils.c (searchc): Use cgraph_function_or_thunk_node.
* ipa-pure-const.c (analyze_function): Aliases don't need analysis.
(self_recursive_p): Use cgraph_function_node.
(propagate_pure_const): Likewise.
(propagate_nothrow): Likewise.
* ipa-reference.c (ipa_reference_get_not_read_global): Use
cgraph_function_node.
(propagate_bits): Likewise.
(propagate): Likewise.
Index: ipa-utils.c
===================================================================
--- ipa-utils.c (revision 174877)
+++ ipa-utils.c (working copy)
@@ -101,10 +101,10 @@ searchc (struct searchc_env* env, struct
for (edge = v->callees; edge; edge = edge->next_callee)
{
struct ipa_dfs_info * w_info;
- struct cgraph_node *w = edge->callee;
- enum availability avail = cgraph_function_body_availability (w);
+ enum availability avail;
+ struct cgraph_node *w = cgraph_function_or_thunk_node (edge->callee, &avail);
- if (ignore_edge && ignore_edge (edge))
+ if (!w || (ignore_edge && ignore_edge (edge)))
continue;
if (w->aux
Index: ipa-pure-const.c
===================================================================
--- ipa-pure-const.c (revision 174877)
+++ ipa-pure-const.c (working copy)
@@ -735,7 +735,7 @@ analyze_function (struct cgraph_node *fn
flags_from_decl_or_type (fn->decl),
cgraph_node_cannot_return (fn));
- if (fn->thunk.thunk_p)
+ if (fn->thunk.thunk_p || fn->alias)
{
/* Thunk gets propagated through, so nothing interesting happens. */
gcc_assert (ipa);
@@ -1070,14 +1070,16 @@ ignore_edge (struct cgraph_edge *e)
return (!e->can_throw_external);
}
-/* Return true if NODE is self recursive function. */
+/* Return true if NODE is self recursive function.
+ ??? self recursive and indirectly recursive funcions should
+ be the same, so this function seems unnecesary. */
static bool
self_recursive_p (struct cgraph_node *node)
{
struct cgraph_edge *e;
for (e = node->callees; e; e = e->next_callee)
- if (e->callee == node)
+ if (cgraph_function_node (e->callee, NULL) == node)
return true;
return false;
}
@@ -1167,7 +1169,8 @@ propagate_pure_const (void)
/* Now walk the edges and merge in callee properties. */
for (e = w->callees; e; e = e->next_callee)
{
- struct cgraph_node *y = e->callee;
+ enum availability avail;
+ struct cgraph_node *y = cgraph_function_node (e->callee, &avail);
enum pure_const_state_e edge_state = IPA_CONST;
bool edge_looping = false;
@@ -1178,7 +1181,7 @@ propagate_pure_const (void)
cgraph_node_name (e->callee),
e->callee->uid);
}
- if (cgraph_function_body_availability (y) > AVAIL_OVERWRITABLE)
+ if (avail > AVAIL_OVERWRITABLE)
{
funct_state y_l = get_function_state (y);
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -1396,9 +1399,10 @@ propagate_nothrow (void)
for (e = w->callees; e; e = e->next_callee)
{
- struct cgraph_node *y = e->callee;
+ enum availability avail;
+ struct cgraph_node *y = cgraph_function_node (e->callee, &avail);
- if (cgraph_function_body_availability (y) > AVAIL_OVERWRITABLE)
+ if (avail > AVAIL_OVERWRITABLE)
{
funct_state y_l = get_function_state (y);
Index: ipa-reference.c
===================================================================
--- ipa-reference.c (revision 174877)
+++ ipa-reference.c (working copy)
@@ -196,7 +196,7 @@ ipa_reference_get_not_read_global (struc
{
ipa_reference_optimization_summary_t info;
- info = get_reference_optimization_summary (fn);
+ info = get_reference_optimization_summary (cgraph_function_node (fn, NULL));
if (info)
return info->statics_not_read;
else if (flags_from_decl_or_type (fn->decl) & ECF_LEAF)
@@ -301,16 +301,17 @@ propagate_bits (ipa_reference_global_var
struct cgraph_edge *e;
for (e = x->callees; e; e = e->next_callee)
{
- struct cgraph_node *y = e->callee;
enum availability avail;
+ struct cgraph_node *y = cgraph_function_node (e->callee, &avail);
- avail = cgraph_function_body_availability (e->callee);
+ if (!y)
+ continue;
/* Only look into nodes we can propagate something. */
if (avail > AVAIL_OVERWRITABLE
|| (avail == AVAIL_OVERWRITABLE
- && (flags_from_decl_or_type (e->callee->decl) & ECF_LEAF)))
+ && (flags_from_decl_or_type (y->decl) & ECF_LEAF)))
{
- int flags = flags_from_decl_or_type (e->callee->decl);
+ int flags = flags_from_decl_or_type (y->decl);
if (get_reference_vars_info (y))
{
ipa_reference_vars_info_t y_info
@@ -663,8 +664,12 @@ propagate (void)
read_write_all_from_decl (node, &read_all, &write_all);
for (e = node->callees; e; e = e->next_callee)
- if (cgraph_function_body_availability (e->callee) <= AVAIL_OVERWRITABLE)
- read_write_all_from_decl (e->callee, &read_all, &write_all);
+ {
+ enum availability avail;
+ struct cgraph_node *callee = cgraph_function_node (e->callee, &avail);
+ if (!callee || avail <= AVAIL_OVERWRITABLE)
+ read_write_all_from_decl (callee, &read_all, &write_all);
+ }
for (ie = node->indirect_calls; ie; ie = ie->next_callee)
if (!(ie->indirect_info->ecf_flags & ECF_CONST))
@@ -696,8 +701,13 @@ propagate (void)
read_write_all_from_decl (w, &read_all, &write_all);
for (e = w->callees; e; e = e->next_callee)
- if (cgraph_function_body_availability (e->callee) <= AVAIL_OVERWRITABLE)
- read_write_all_from_decl (e->callee, &read_all, &write_all);
+ {
+ enum availability avail;
+ struct cgraph_node *callee = cgraph_function_node (e->callee, &avail);
+
+ if (avail <= AVAIL_OVERWRITABLE)
+ read_write_all_from_decl (callee, &read_all, &write_all);
+ }
for (ie = w->indirect_calls; ie; ie = ie->next_callee)
if (!(ie->indirect_info->ecf_flags & ECF_CONST))
reply other threads:[~2011-06-10 10:12 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110610101239.GB28776@kam.mff.cuni.cz \
--to=hubicka@ucw.cz \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).