diff options
author | Jan Hubicka <jh@suse.cz> | 2009-10-02 01:20:15 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2009-10-01 23:20:15 +0000 |
commit | 03ec7d01e07f3477397874f01ee7da39fc93d023 (patch) | |
tree | 851bbe5f7a341f0badf18bf5a177dfbf5e290e5c /gcc/ipa-pure-const.c | |
parent | 0ecdd2aae98b931eb50dff3c8013a1b7adcfaa95 (diff) | |
download | gcc-03ec7d01e07f3477397874f01ee7da39fc93d023.tar.gz |
cgraph.c (cgraph_clone_node): Add redirect_callers parameter.
* cgraph.c (cgraph_clone_node): Add redirect_callers parameter.
(cgraph_create_virtual_clone): Just pass redirect_callers
around.
* cgraph.h (cgraph_clone_node): Update prototype.
* ipa-pure-const.c (self_recursive_p): New function.
(propagate): Use it.
* ipa-inline.c (cgraph_clone_inlined_nodes,
* cgraph_decide_recursive_inlining): Update.
* gcc.dg/tree-ssa/ipa-cp-1.c: New testcase.
From-SVN: r152388
Diffstat (limited to 'gcc/ipa-pure-const.c')
-rw-r--r-- | gcc/ipa-pure-const.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index e5ff3a77253..04d4e112ed3 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -688,6 +688,18 @@ ignore_edge (struct cgraph_edge *e) return (!e->can_throw_external); } +/* Return true if NODE is self recursive function. */ + +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) + return true; + return false; +} + /* Produce the global information by preforming a transitive closure on the local information that was produced by generate_summary. Note that there is no function_transform pass since this only @@ -776,6 +788,8 @@ propagate (void) if (w_l->state_previously_known != IPA_NEITHER && this_state > w_l->state_previously_known) this_state = w_l->state_previously_known; + if (!this_looping && self_recursive_p (w)) + this_looping = true; if (!w_l->looping_previously_known) this_looping = false; |