diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2016-08-07 12:50:16 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2016-08-07 10:50:16 +0000 |
commit | 27bddc4ace7dceda22968f2d89c537cb8a306302 (patch) | |
tree | b29e66caf101d11bc66ce183e3614bd567fca32d /gcc/tree-ssa-threadbackward.c | |
parent | 4a9f8a9f7c5a75c266bba5be0c08071d18ed23c6 (diff) | |
download | gcc-27bddc4ace7dceda22968f2d89c537cb8a306302.zip gcc-27bddc4ace7dceda22968f2d89c537cb8a306302.tar.gz gcc-27bddc4ace7dceda22968f2d89c537cb8a306302.tar.bz2 |
tree-ssa-threadbackward.c: Include tree-inline.h
* tree-ssa-threadbackward.c: Include tree-inline.h
(profitable_jump_thread_path): Use estimate_num_insns to estimate
size of copied block; for cold paths reduce duplication.
(find_jump_threads_backwards): Remove redundant tests.
(pass_thread_jumps::gate): Enable for -Os.
* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Update testcase.
From-SVN: r239219
Diffstat (limited to 'gcc/tree-ssa-threadbackward.c')
-rw-r--r-- | gcc/tree-ssa-threadbackward.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/gcc/tree-ssa-threadbackward.c b/gcc/tree-ssa-threadbackward.c index 9dd37ad..234ce50 100644 --- a/gcc/tree-ssa-threadbackward.c +++ b/gcc/tree-ssa-threadbackward.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "gimple-ssa.h" #include "tree-phinodes.h" +#include "tree-inline.h" static int max_threaded_paths; @@ -223,7 +224,7 @@ profitable_jump_thread_path (vec<basic_block, va_gc> *&path, && !(gimple_code (stmt) == GIMPLE_ASSIGN && gimple_assign_rhs_code (stmt) == ASSERT_EXPR) && !is_gimple_debug (stmt)) - ++n_insns; + n_insns += estimate_num_insns (stmt, &eni_size_weights); } /* We do not look at the block with the threaded branch @@ -251,13 +252,15 @@ profitable_jump_thread_path (vec<basic_block, va_gc> *&path, threaded_through_latch = true; } + gimple *stmt = get_gimple_control_stmt ((*path)[0]); + gcc_assert (stmt); + /* We are going to remove the control statement at the end of the last block in the threading path. So don't count it against our statement count. */ - n_insns--; - gimple *stmt = get_gimple_control_stmt ((*path)[0]); - gcc_assert (stmt); + n_insns-= estimate_num_insns (stmt, &eni_size_weights); + /* We have found a constant value for ARG. For GIMPLE_SWITCH and GIMPLE_GOTO, we use it as-is. However, for a GIMPLE_COND we need to substitute, fold and simplify so we can determine @@ -303,12 +306,24 @@ profitable_jump_thread_path (vec<basic_block, va_gc> *&path, return NULL; } - if (n_insns >= PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATH_INSNS)) + if (optimize_edge_for_speed_p (taken_edge)) + { + if (n_insns >= PARAM_VALUE (PARAM_MAX_FSM_THREAD_PATH_INSNS)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "FSM jump-thread path not considered: " + "the number of instructions on the path " + "exceeds PARAM_MAX_FSM_THREAD_PATH_INSNS.\n"); + path->pop (); + return NULL; + } + } + else if (n_insns > 1) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "FSM jump-thread path not considered: " - "the number of instructions on the path " - "exceeds PARAM_MAX_FSM_THREAD_PATH_INSNS.\n"); + "duplication of %i insns is needed and optimizing for size.\n", + n_insns); path->pop (); return NULL; } @@ -612,10 +627,6 @@ fsm_find_control_statement_thread_paths (tree name, void find_jump_threads_backwards (basic_block bb) { - if (!flag_expensive_optimizations - || optimize_function_for_size_p (cfun)) - return; - gimple *stmt = get_gimple_control_stmt (bb); if (!stmt) return; @@ -680,8 +691,7 @@ public: bool pass_thread_jumps::gate (function *fun ATTRIBUTE_UNUSED) { - return (flag_expensive_optimizations - && ! optimize_function_for_size_p (cfun)); + return flag_expensive_optimizations; } |