------- Comment #4 from hubicka at ucw dot cz 2008-05-02 11:11 -------
Subject: Re: [4.4 Regression] always_inline attribute is broken at -O0
Hi,
I am testing the following patch that restores inlining at -O0.
Index: tree-pass.h
===================================================================
*** tree-pass.h (revision 134885)
--- tree-pass.h (working copy)
*************** extern struct rtl_opt_pass pass_final;
*** 501,506 ****
--- 501,507 ----
extern struct rtl_opt_pass pass_rtl_seqabstr;
extern struct gimple_opt_pass pass_release_ssa_names;
extern struct gimple_opt_pass pass_early_inline;
+ extern struct gimple_opt_pass pass_O0_always_inline;
extern struct gimple_opt_pass pass_inline_parameters;
extern struct gimple_opt_pass pass_all_early_optimizations;
extern struct gimple_opt_pass pass_update_address_taken;
Index: ipa-inline.c
===================================================================
*** ipa-inline.c (revision 134885)
--- ipa-inline.c (working copy)
*************** inline_transform (struct cgraph_node *no
*** 1588,1601 ****
todo = optimize_inline_calls (current_function_decl);
timevar_pop (TV_INTEGRATION);
}
- /* In non-unit-at-a-time we must mark all referenced functions as needed.
*/
- if (!flag_unit_at_a_time)
- {
- struct cgraph_edge *e;
- for (e = node->callees; e; e = e->next_callee)
- if (e->callee->analyzed)
- cgraph_mark_needed_node (e->callee);
- }
return todo | execute_fixup_cfg ();
}
--- 1588,1593 ----
*************** struct ipa_opt_pass pass_ipa_inline =
*** 1628,1631 ****
--- 1620,1681 ----
NULL, /* variable_transform */
};
+
+ /* When inlining shall be performed. */
+ static bool
+ cgraph_gate_O0_always_inline (void)
+ {
+ return !optimize || !flag_unit_at_a_time;
+ }
+
+ static unsigned int
+ cgraph_O0_always_inline (void)
+ {
+ struct cgraph_node *node = cgraph_node (current_function_decl);
+ unsigned int todo = 0;
+ bool inlined;
+
+ if (sorrycount || errorcount)
+ return 0;
+ /* We might need the body of this function so that we can expand
+ it inline somewhere else. */
+ inlined = cgraph_decide_inlining_incrementally (node, INLINE_SPEED, 0);
+ if (cgraph_preserve_function_body_p (current_function_decl))
+ save_inline_function_body (node);
+ if (inlined || warn_inline)
+ {
+ timevar_push (TV_INTEGRATION);
+ todo = optimize_inline_calls (current_function_decl);
+ timevar_pop (TV_INTEGRATION);
+ }
+ /* In non-unit-at-a-time we must mark all referenced functions as needed.
*/
+ if (!flag_unit_at_a_time)
+ {
+ struct cgraph_edge *e;
+ for (e = node->callees; e; e = e->next_callee)
+ if (e->callee->analyzed)
+ cgraph_mark_needed_node (e->callee);
+ }
+ return todo;
+ }
+
+ struct gimple_opt_pass pass_O0_always_inline =
+ {
+ {
+ GIMPLE_PASS,
+ "always_inline", /* name */
+ cgraph_gate_O0_always_inline, /* gate */
+ cgraph_O0_always_inline, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_INLINE_HEURISTICS, /* tv_id */
+ 0, /* properties_required */
+ PROP_cfg, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func /* todo_flags_finish */
+ }
+ };
+
#include "gt-ipa-inline.h"
Index: passes.c
===================================================================
*** passes.c (revision 134885)
--- passes.c (working copy)
*************** init_optimization_passes (void)
*** 553,558 ****
--- 553,559 ----
/* These passes are run after IPA passes on every function that is being
output to the assembler file. */
p = &all_passes;
+ NEXT_PASS (pass_O0_always_inline);
NEXT_PASS (pass_all_optimizations);
{
struct opt_pass **p = &pass_all_optimizations.pass.sub;
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36100