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