diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-03 04:21:50 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-03 04:21:50 +0000 |
commit | d2c6c2b47e025c9c5667c0286bc4f9bc04c25671 (patch) | |
tree | 14b99dc78c37ecb7da84bf142c792eb85acbb9cb /gcc/ipa-pure-const.c | |
parent | 355c1f40950cd4c07a600cdc7e5258252cd22b7d (diff) | |
download | gcc-d2c6c2b47e025c9c5667c0286bc4f9bc04c25671.tar.gz |
* ipa-pure-const.c (ignore_edge_for_pure_const): New function.
(propagate_pure_const): Use it; fix comments and optimize loops.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231219 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-pure-const.c')
-rw-r--r-- | gcc/ipa-pure-const.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 654791ad42d..4cf09183f3a 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1164,6 +1164,17 @@ cdtor_p (cgraph_node *n, void *) return false; } +/* We only propagate across edges with non-interposable callee. */ + +static bool +ignore_edge_for_pure_const (struct cgraph_edge *e) +{ + enum availability avail; + e->callee->function_or_virtual_thunk_symbol (&avail); + return (avail <= AVAIL_INTERPOSABLE); +} + + /* Produce transitive closure over the callgraph and compute pure/const attributes. */ @@ -1179,7 +1190,8 @@ propagate_pure_const (void) struct ipa_dfs_info * w_info; bool remove_p = false; - order_pos = ipa_reduced_postorder (order, true, false, NULL); + order_pos = ipa_reduced_postorder (order, true, false, + ignore_edge_for_pure_const); if (dump_file) { cgraph_node::dump_cgraph (dump_file); @@ -1226,7 +1238,7 @@ propagate_pure_const (void) if (pure_const_state == IPA_NEITHER) break; - /* For overwritable nodes we can not assume anything. */ + /* For interposable nodes we can not assume anything. */ if (w->get_availability () == AVAIL_INTERPOSABLE) { worse_state (&pure_const_state, &looping, @@ -1235,7 +1247,7 @@ propagate_pure_const (void) if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, - " Overwritable. state %s looping %i\n", + " Interposable. state %s looping %i\n", pure_const_names[w_l->state_previously_known], w_l->looping_previously_known); } @@ -1251,7 +1263,8 @@ propagate_pure_const (void) looping = true; /* Now walk the edges and merge in callee properties. */ - for (e = w->callees; e; e = e->next_callee) + for (e = w->callees; e && pure_const_state != IPA_NEITHER; + e = e->next_callee) { enum availability avail; struct cgraph_node *y = e->callee-> @@ -1309,11 +1322,10 @@ propagate_pure_const (void) if (pure_const_state == IPA_NEITHER) break; } - if (pure_const_state == IPA_NEITHER) - break; /* Now process the indirect call. */ - for (ie = w->indirect_calls; ie; ie = ie->next_callee) + for (ie = w->indirect_calls; + ie && pure_const_state != IPA_NEITHER; ie = ie->next_callee) { enum pure_const_state_e edge_state = IPA_CONST; bool edge_looping = false; @@ -1332,11 +1344,10 @@ propagate_pure_const (void) if (pure_const_state == IPA_NEITHER) break; } - if (pure_const_state == IPA_NEITHER) - break; /* And finally all loads and stores. */ - for (i = 0; w->iterate_reference (i, ref); i++) + for (i = 0; w->iterate_reference (i, ref) + && pure_const_state != IPA_NEITHER; i++) { enum pure_const_state_e ref_state = IPA_CONST; bool ref_looping = false; @@ -1426,7 +1437,8 @@ propagate_pure_const (void) && this_state > w_l->state_previously_known) { this_state = w_l->state_previously_known; - this_looping |= w_l->looping_previously_known; + if (this_state == IPA_NEITHER) + this_looping = w_l->looping_previously_known; } if (!this_looping && self_recursive_p (w)) this_looping = true; |