aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-threadbackward.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2016-08-07 12:50:16 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2016-08-07 10:50:16 +0000
commit27bddc4ace7dceda22968f2d89c537cb8a306302 (patch)
treeb29e66caf101d11bc66ce183e3614bd567fca32d /gcc/tree-ssa-threadbackward.c
parent4a9f8a9f7c5a75c266bba5be0c08071d18ed23c6 (diff)
downloadgcc-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.c36
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;
}