summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-27 09:44:30 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-27 09:44:30 +0000
commit5ea601080eb8550f7226d3d9df4fa523f6161e51 (patch)
treef6e2acb576b9d9b2a9255d6a0a08d3fa74150b5a
parenta43d1001bdd83184659d83f90a8b717daad65c6b (diff)
downloadgcc-5ea601080eb8550f7226d3d9df4fa523f6161e51.tar.gz
* cgraph.c (cgraph_propagate_frequency): New function.
* cgraph.h (cgraph_propagate_frequency): Declare. * ipa-inline.c (cgraph_clone_inlined_nodes): Call cgraph_propagate_frequency. * testsuite/gcc.dg/ipa/iinline-1.c (main): Rename to... (test): ... this one. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158775 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraph.c63
-rw-r--r--gcc/cgraph.h1
-rw-r--r--gcc/ipa-inline.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/ipa/iinline-1.c4
6 files changed, 79 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fe4e26ec349..65c8feab413 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-04-27 Jan Hubicka <jh@suse.cz>
+
+ * cgraph.c (cgraph_propagate_frequency): New function.
+ * cgraph.h (cgraph_propagate_frequency): Declare.
+ * ipa-inline.c (cgraph_clone_inlined_nodes): Call
+ cgraph_propagate_frequency.
+
2010-04-27 Jakub Jelinek <jakub@redhat.com>
* unwind-dw2.c (_Unwind_DebugHook): Add used and noclone attributes.
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index b58d4ee5516..95f441132f3 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -2307,4 +2307,67 @@ cgraph_set_looping_const_or_pure_flag (struct cgraph_node *node,
DECL_LOOPING_CONST_OR_PURE_P (alias->decl) = looping_const_or_pure;
}
+/* See if the frequency of NODE can be updated based on frequencies of its
+ callers. */
+bool
+cgraph_propagate_frequency (struct cgraph_node *node)
+{
+ bool maybe_unlikely_executed = true, maybe_executed_once = true;
+ struct cgraph_edge *edge;
+ if (node->needed || node->local.externally_visible)
+ return false;
+ gcc_assert (node->analyzed);
+ if (node->frequency == NODE_FREQUENCY_HOT)
+ return false;
+ if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
+ return false;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Processing frequency %s\n", cgraph_node_name (node));
+ for (edge = node->callers;
+ edge && (maybe_unlikely_executed || maybe_executed_once);
+ edge = edge->next_caller)
+ {
+ if (!edge->frequency)
+ continue;
+ switch (edge->caller->frequency)
+ {
+ case NODE_FREQUENCY_UNLIKELY_EXECUTED:
+ break;
+ case NODE_FREQUENCY_EXECUTED_ONCE:
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Called by %s that is executed once\n", cgraph_node_name (node));
+ maybe_unlikely_executed = false;
+ if (edge->loop_nest)
+ {
+ maybe_executed_once = false;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Called in loop\n");
+ }
+ break;
+ case NODE_FREQUENCY_HOT:
+ case NODE_FREQUENCY_NORMAL:
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Called by %s that is normal or hot\n", cgraph_node_name (node));
+ maybe_unlikely_executed = false;
+ maybe_executed_once = false;
+ break;
+ }
+ }
+ if (maybe_unlikely_executed)
+ {
+ node->frequency = NODE_FREQUENCY_UNLIKELY_EXECUTED;
+ if (dump_file)
+ fprintf (dump_file, "Node %s promoted to unlikely executed.\n", cgraph_node_name (node));
+ return true;
+ }
+ if (maybe_executed_once && node->frequency != NODE_FREQUENCY_EXECUTED_ONCE)
+ {
+ node->frequency = NODE_FREQUENCY_EXECUTED_ONCE;
+ if (dump_file)
+ fprintf (dump_file, "Node %s promoted to executed once.\n", cgraph_node_name (node));
+ return true;
+ }
+ return false;
+}
+
#include "gt-cgraph.h"
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 9b9bf4d42d7..c208cfaeb63 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -557,6 +557,7 @@ struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook (cgraph_2node_ho
void cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *);
void cgraph_materialize_all_clones (void);
gimple cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *);
+bool cgraph_propagate_frequency (struct cgraph_node *node);
/* In cgraphbuild.c */
unsigned int rebuild_cgraph_edges (void);
void reset_inline_failed (struct cgraph_node *);
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index fbd695d129c..381942a5586 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -285,6 +285,7 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
+ inline_summary (e->callee)->estimated_self_stack_size;
if (e->callee->global.inlined_to->global.estimated_stack_size < peak)
e->callee->global.inlined_to->global.estimated_stack_size = peak;
+ cgraph_propagate_frequency (e->callee);
/* Recursively clone all bodies. */
for (e = e->callee->callees; e; e = e->next_callee)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e3b7527bec8..72e61c0e348 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-27 Jan Hubicka <jh@suse.cz>
+
+ * gcc.dg/ipa/iinline-1.c (main): Rename to...
+ (test): ... this one.
+
2010-04-27 Bernd Schmidt <bernds@codesourcery.com>
PR target/40657
diff --git a/gcc/testsuite/gcc.dg/ipa/iinline-1.c b/gcc/testsuite/gcc.dg/ipa/iinline-1.c
index 9f0ad68e9fa..617c484994b 100644
--- a/gcc/testsuite/gcc.dg/ipa/iinline-1.c
+++ b/gcc/testsuite/gcc.dg/ipa/iinline-1.c
@@ -16,11 +16,11 @@ static void hiphip (void (*f)())
f ();
}
-int main (int argc, int *argv[])
+int test (void)
{
hiphip (hooray);
return 0;
}
-/* { dg-final { scan-ipa-dump "hooray\[^\\n\]*inline copy in main" "inline" } } */
+/* { dg-final { scan-ipa-dump "hooray\[^\\n\]*inline copy in test" "inline" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */