Commit 4c7c437c by Richard Biener Committed by Richard Biener

re PR tree-optimization/79725 (Sinking opportunity missed if blocked by dead stmt)

2017-04-24  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/79725
	* tree-ssa-sink.c (statement_sink_location): Return whether
	failure reason was zero uses.  Move that check later.
	(sink_code_in_bb): Deal with zero uses by removing the stmt
	if possible.

	* gcc.dg/tree-ssa/ssa-sink-15.c: New testcase.

From-SVN: r247091
parent d21a8e3b
2017-04-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/79725
* tree-ssa-sink.c (statement_sink_location): Return whether
failure reason was zero uses. Move that check later.
(sink_code_in_bb): Deal with zero uses by removing the stmt
if possible.
2017-04-24 Richard Biener <rguenther@suse.de>
PR c++/2972
* tree-ssa-uninit.c (warn_uninitialized_vars): Handle some
pointer-based references.
......
2017-04-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/79725
* gcc.dg/tree-ssa/ssa-sink-15.c: New testcase.
2017-04-24 Richard Biener <rguenther@suse.de>
PR c++/2972
* g++.dg/warn/Wuninitialized-10.C: New testcase.
......
/* PR79725 */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
_Complex double f(_Complex double x[])
{
_Complex float p = 1.0;
for (int i = 0; i < 1000000; i++)
p = x[i];
return p;
}
/* Verify we end up with a single BB and no loop. */
/* { dg-final { scan-tree-dump-times "goto" 0 "optimized" } } */
......@@ -244,7 +244,7 @@ select_best_block (basic_block early_bb,
static bool
statement_sink_location (gimple *stmt, basic_block frombb,
gimple_stmt_iterator *togsi)
gimple_stmt_iterator *togsi, bool *zero_uses_p)
{
gimple *use;
use_operand_p one_use = NULL_USE_OPERAND_P;
......@@ -254,6 +254,8 @@ statement_sink_location (gimple *stmt, basic_block frombb,
ssa_op_iter iter;
imm_use_iterator imm_iter;
*zero_uses_p = false;
/* We only can sink assignments. */
if (!is_gimple_assign (stmt))
return false;
......@@ -263,10 +265,6 @@ statement_sink_location (gimple *stmt, basic_block frombb,
if (def_p == NULL_DEF_OPERAND_P)
return false;
/* Return if there are no immediate uses of this stmt. */
if (has_zero_uses (DEF_FROM_PTR (def_p)))
return false;
/* There are a few classes of things we can't or don't move, some because we
don't have code to handle it, some because it's not profitable and some
because it's not legal.
......@@ -292,11 +290,17 @@ statement_sink_location (gimple *stmt, basic_block frombb,
*/
if (stmt_ends_bb_p (stmt)
|| gimple_has_side_effects (stmt)
|| gimple_has_volatile_ops (stmt)
|| (cfun->has_local_explicit_reg_vars
&& TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))) == BLKmode))
return false;
/* Return if there are no immediate uses of this stmt. */
if (has_zero_uses (DEF_FROM_PTR (def_p)))
{
*zero_uses_p = true;
return false;
}
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (DEF_FROM_PTR (def_p)))
return false;
......@@ -483,12 +487,23 @@ sink_code_in_bb (basic_block bb)
{
gimple *stmt = gsi_stmt (gsi);
gimple_stmt_iterator togsi;
bool zero_uses_p;
if (!statement_sink_location (stmt, bb, &togsi))
if (!statement_sink_location (stmt, bb, &togsi, &zero_uses_p))
{
gimple_stmt_iterator saved = gsi;
if (!gsi_end_p (gsi))
gsi_prev (&gsi);
last = false;
/* If we face a dead stmt remove it as it possibly blocks
sinking of uses. */
if (zero_uses_p
&& ! gimple_vdef (stmt))
{
gsi_remove (&saved, true);
release_defs (stmt);
}
else
last = false;
continue;
}
if (dump_file)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment