diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3eea0bcd9d6a67f597a015f1b00229a867c6325c..eae0e16c1bd4b01a895c97dcc6b53e6407ac3a44 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-02-15 Alexandre Oliva <aoliva@redhat.com> + + PR debug/47106 + PR debug/47402 + * tree-inline.h (estimated_stack_frame_size): Take cgraph node + rather than decl. + * cfgexpand.c (estimated_stack_frame_size): Likewise. + * ipa-inline.c (compute_inline_parameters): Adjust. + 2011-02-15 Alexandre Oliva <aoliva@redhat.com> PR debug/47106 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 6fdb10d2507b9d4194a9cca2286adb7ba6ecdc53..4772fea1ebb528b48f7972e11aae815751927d83 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1366,24 +1366,25 @@ fini_vars_expansion (void) stack_vars_alloc = stack_vars_num = 0; } -/* Make a fair guess for the size of the stack frame of the decl - passed. This doesn't have to be exact, the result is only used - in the inline heuristics. So we don't want to run the full stack - var packing algorithm (which is quadratic in the number of stack - vars). Instead, we calculate the total size of all stack vars. - This turns out to be a pretty fair estimate -- packing of stack - vars doesn't happen very often. */ +/* Make a fair guess for the size of the stack frame of the function + in NODE. This doesn't have to be exact, the result is only used in + the inline heuristics. So we don't want to run the full stack var + packing algorithm (which is quadratic in the number of stack vars). + Instead, we calculate the total size of all stack vars. This turns + out to be a pretty fair estimate -- packing of stack vars doesn't + happen very often. */ HOST_WIDE_INT -estimated_stack_frame_size (tree decl) +estimated_stack_frame_size (struct cgraph_node *node) { HOST_WIDE_INT size = 0; size_t i; tree var, outer_block = DECL_INITIAL (current_function_decl); unsigned ix; tree old_cur_fun_decl = current_function_decl; - current_function_decl = decl; - push_cfun (DECL_STRUCT_FUNCTION (decl)); + + current_function_decl = node->decl; + push_cfun (DECL_STRUCT_FUNCTION (node->decl)); init_vars_expansion (); diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index d611d11fe20fade5d0365f9a0b1f37cd00ac5f7c..595d4765da636f9dd4ac5d6af3eeb599c0eee1db 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1982,9 +1982,8 @@ compute_inline_parameters (struct cgraph_node *node) gcc_assert (!node->global.inlined_to); - /* Estimate the stack size for the function. But not at -O0 - because estimated_stack_frame_size is a quadratic problem. */ - self_stack_size = optimize ? estimated_stack_frame_size (node->decl) : 0; + /* Estimate the stack size for the function if we're optimizing. */ + self_stack_size = optimize ? estimated_stack_frame_size (node) : 0; inline_summary (node)->estimated_self_stack_size = self_stack_size; node->global.estimated_stack_size = self_stack_size; node->global.stack_frame_offset = 0; diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h index 738a8667a35aa30e0c32b61271fe02f665f08d6e..66cc33484107e2bc240b70f2087b84404ff6cf04 100644 --- a/gcc/tree-inline.h +++ b/gcc/tree-inline.h @@ -188,6 +188,6 @@ extern tree remap_decl (tree decl, copy_body_data *id); extern tree remap_type (tree type, copy_body_data *id); extern gimple_seq copy_gimple_seq_and_replace_locals (gimple_seq seq); -extern HOST_WIDE_INT estimated_stack_frame_size (tree); +extern HOST_WIDE_INT estimated_stack_frame_size (struct cgraph_node *); #endif /* GCC_TREE_INLINE_H */