X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fipa-inline.c;h=e1de7ce25cc8a579dc11ae2c6d6a49f92564ac25;hb=485e90919e0fb95cd148aa1dc43000aeb68abc2e;hp=5146c3c3cadb95e3b4009e38a87bc0d40579ee46;hpb=9956d53e0b9f48b15c8470ad3173e161e4bc5d11;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 5146c3c3cad..e1de7ce25cc 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -268,7 +268,8 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, else { struct cgraph_node *n; - n = cgraph_clone_node (e->callee, e->count, e->frequency, e->loop_nest, + n = cgraph_clone_node (e->callee, e->callee->decl, + e->count, e->frequency, e->loop_nest, update_original, NULL); cgraph_redirect_edge_callee (e, n); } @@ -310,10 +311,7 @@ cgraph_mark_inline_edge (struct cgraph_edge *e, bool update_original, gcc_assert (e->inline_failed); e->inline_failed = CIF_OK; - - if (!e->callee->global.inlined) - DECL_POSSIBLY_INLINED (e->callee->decl) = true; - e->callee->global.inlined = true; + DECL_POSSIBLY_INLINED (e->callee->decl) = true; cgraph_clone_inlined_nodes (e, true, update_original); @@ -544,6 +542,9 @@ cgraph_edge_badness (struct cgraph_edge *edge, bool dump) (cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee) - edge->caller->global.size); + if (edge->callee->local.disregard_inline_limits) + return INT_MIN; + if (dump) { fprintf (dump_file, " Badness calculcation for %s -> %s\n", @@ -667,7 +668,7 @@ update_caller_keys (fibheap_t heap, struct cgraph_node *node, struct cgraph_edge *edge; cgraph_inline_failed_t failed_reason; - if (!node->local.inlinable || node->local.disregard_inline_limits + if (!node->local.inlinable || node->global.inlined_to) return; if (bitmap_bit_p (updated_nodes, node->uid)) @@ -808,7 +809,8 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node, cgraph_node_name (node)); /* We need original clone to copy around. */ - master_clone = cgraph_clone_node (node, node->count, CGRAPH_FREQ_BASE, 1, + master_clone = cgraph_clone_node (node, node->decl, + node->count, CGRAPH_FREQ_BASE, 1, false, NULL); master_clone->needed = true; for (e = master_clone->callees; e; e = e->next_callee) @@ -1071,12 +1073,14 @@ cgraph_decide_inlining_of_small_functions (void) } } - if (!cgraph_maybe_hot_edge_p (edge)) + if (edge->callee->local.disregard_inline_limits) + ; + else if (!cgraph_maybe_hot_edge_p (edge)) not_good = CIF_UNLIKELY_CALL; - if (!flag_inline_functions + else if (!flag_inline_functions && !DECL_DECLARED_INLINE_P (edge->callee->decl)) not_good = CIF_NOT_DECLARED_INLINED; - if (optimize_function_for_size_p (DECL_STRUCT_FUNCTION(edge->caller->decl))) + else if (optimize_function_for_size_p (DECL_STRUCT_FUNCTION(edge->caller->decl))) not_good = CIF_OPTIMIZING_FOR_SIZE; if (not_good && growth > 0 && cgraph_estimate_growth (edge->callee) > 0) { @@ -1836,14 +1840,6 @@ estimate_function_body_sizes (struct cgraph_node *node) int freq; tree funtype = TREE_TYPE (node->decl); - if (node->local.disregard_inline_limits) - { - inline_summary (node)->self_time = 0; - inline_summary (node)->self_size = 0; - inline_summary (node)->time_inlining_benefit = 0; - inline_summary (node)->size_inlining_benefit = 0; - } - if (dump_file) fprintf (dump_file, "Analyzing function body size: %s\n", cgraph_node_name (node)); @@ -2134,7 +2130,7 @@ struct ipa_opt_pass_d pass_ipa_inline = 0, /* properties_destroyed */ TODO_remove_functions, /* todo_flags_finish */ TODO_dump_cgraph | TODO_dump_func - | TODO_remove_functions /* todo_flags_finish */ + | TODO_remove_functions | TODO_ggc_collect /* todo_flags_finish */ }, inline_generate_summary, /* generate_summary */ inline_write_summary, /* write_summary */