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
This commit is contained in:
Jan Hubicka 2016-08-07 12:50:16 +02:00 committed by Jan Hubicka
parent 4a9f8a9f7c
commit 27bddc4ace
4 changed files with 37 additions and 15 deletions

View file

@ -1,3 +1,11 @@
2016-08-07 Jan Hubicka <hubicka@ucw.cz>
* 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.
2016-08-07 Jakub Jelinek <jakub@redhat.com>
PR c/72816

View file

@ -1,3 +1,7 @@
2016-08-07 Jan Hubicka <hubicka@ucw.cz>
* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Update testcase.
2016-08-07 Jakub Jelinek <jakub@redhat.com>
PR c/72816

View file

@ -1,7 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-thread1-stats -fdump-tree-thread2-stats -fdump-tree-thread3-stats -fdump-tree-dom3-stats -fdump-tree-vrp2-stats" } */
/* { dg-options "-O2 -fdump-tree-thread1-stats -fdump-tree-thread2-stats -fdump-tree-thread3-stats -fdump-tree-dom3-stats -fdump-tree-vrp2-stats -fno-guess-branch-probability" } */
/* { dg-final { scan-tree-dump "Jumps threaded: 16" "thread1" } } */
/* { dg-final { scan-tree-dump "Jumps threaded: 11" "thread2" } } */
/* { dg-final { scan-tree-dump "Jumps threaded: 6" "thread2" } } */
/* { dg-final { scan-tree-dump "Jumps threaded: 3" "thread3" } } */
/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom3" } } */
/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp2" } } */

View file

@ -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;
}