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 */