diff options
author | Jan Hubicka <jh@suse.cz> | 2008-05-05 07:31:34 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2008-05-05 05:31:34 +0000 |
commit | 24c0514153e41537c29f2680f86303dff8a0b496 (patch) | |
tree | f9eda22c81cb7bf94680355477c47aca64696b69 /gcc | |
parent | 7ffc24cee0f21151f2f18fc9186bb484c4ffa533 (diff) | |
download | gcc-24c0514153e41537c29f2680f86303dff8a0b496.zip gcc-24c0514153e41537c29f2680f86303dff8a0b496.tar.gz gcc-24c0514153e41537c29f2680f86303dff8a0b496.tar.bz2 |
tree-pass.h (pass_O0_always_inline): Declare.
tree-optimization/36100
* tree-pass.h (pass_O0_always_inline): Declare.
* ipa-inline.c (inline_transform): Remove dead code.
(cgraph_gate_O0_always_inline, cgraph_O0_always_inline,
pass_O0_always_inline): New.
* passes.c (init_optimization_passes): Add pass_O0_always_inline.
From-SVN: r134942
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ipa-inline.c | 67 | ||||
-rw-r--r-- | gcc/passes.c | 1 | ||||
-rw-r--r-- | gcc/tree-pass.h | 1 |
4 files changed, 70 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c29c26f..38ac5f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2008-06-04 Jan Hubicka <jh@suse.cz> + + tree-optimization/36100 + * tree-pass.h (pass_O0_always_inline): Declare. + * ipa-inline.c (inline_transform): Remove dead code. + (cgraph_gate_O0_always_inline, cgraph_O0_always_inline, + pass_O0_always_inline): New. + * passes.c (init_optimization_passes): Add pass_O0_always_inline. + 2008-05-04 Kai Tietz <kai.tietz@onevision.com> * config/i386/i386.c (x86_output_mi_thunk): Use movq alternative diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 81246d8..68a4201 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1588,14 +1588,6 @@ inline_transform (struct cgraph_node *node) 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 (); } @@ -1628,4 +1620,63 @@ struct ipa_opt_pass pass_ipa_inline = NULL, /* variable_transform */ }; + +/* When inlining shall be performed. */ +static bool +cgraph_gate_O0_always_inline (void) +{ + return !flag_unit_at_a_time || !flag_inline_trees; +} + +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; + inlined = cgraph_decide_inlining_incrementally (node, INLINE_SPEED, 0); + /* We might need the body of this function so that we can expand + it inline somewhere else. */ + 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 | execute_fixup_cfg (); +} + +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_verify_flow + | TODO_verify_stmts /* todo_flags_finish */ + } +}; + #include "gt-ipa-inline.h" diff --git a/gcc/passes.c b/gcc/passes.c index 0ca26fe..0958566 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -553,6 +553,7 @@ init_optimization_passes (void) /* 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; diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 4d16ed6..41fd8e5 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -501,6 +501,7 @@ extern struct rtl_opt_pass pass_final; 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; |