X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fipa-inline.c;h=e1de7ce25cc8a579dc11ae2c6d6a49f92564ac25;hb=485e90919e0fb95cd148aa1dc43000aeb68abc2e;hp=3bab2059cf37896724895cf296a3d9bcde6a9c92;hpb=c5fcb1091eb9af20411562379d917de344a68ff4;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 3bab2059cf3..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));