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> 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 PR c++/2972
* tree-ssa-uninit.c (warn_uninitialized_vars): Handle some * tree-ssa-uninit.c (warn_uninitialized_vars): Handle some
pointer-based references. pointer-based references.
......
2017-04-24 Richard Biener <rguenther@suse.de> 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 PR c++/2972
* g++.dg/warn/Wuninitialized-10.C: New testcase. * 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, ...@@ -244,7 +244,7 @@ select_best_block (basic_block early_bb,
static bool static bool
statement_sink_location (gimple *stmt, basic_block frombb, statement_sink_location (gimple *stmt, basic_block frombb,
gimple_stmt_iterator *togsi) gimple_stmt_iterator *togsi, bool *zero_uses_p)
{ {
gimple *use; gimple *use;
use_operand_p one_use = NULL_USE_OPERAND_P; use_operand_p one_use = NULL_USE_OPERAND_P;
...@@ -254,6 +254,8 @@ statement_sink_location (gimple *stmt, basic_block frombb, ...@@ -254,6 +254,8 @@ statement_sink_location (gimple *stmt, basic_block frombb,
ssa_op_iter iter; ssa_op_iter iter;
imm_use_iterator imm_iter; imm_use_iterator imm_iter;
*zero_uses_p = false;
/* We only can sink assignments. */ /* We only can sink assignments. */
if (!is_gimple_assign (stmt)) if (!is_gimple_assign (stmt))
return false; return false;
...@@ -263,10 +265,6 @@ statement_sink_location (gimple *stmt, basic_block frombb, ...@@ -263,10 +265,6 @@ statement_sink_location (gimple *stmt, basic_block frombb,
if (def_p == NULL_DEF_OPERAND_P) if (def_p == NULL_DEF_OPERAND_P)
return false; 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 /* 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 don't have code to handle it, some because it's not profitable and some
because it's not legal. because it's not legal.
...@@ -292,11 +290,17 @@ statement_sink_location (gimple *stmt, basic_block frombb, ...@@ -292,11 +290,17 @@ statement_sink_location (gimple *stmt, basic_block frombb,
*/ */
if (stmt_ends_bb_p (stmt) if (stmt_ends_bb_p (stmt)
|| gimple_has_side_effects (stmt) || gimple_has_side_effects (stmt)
|| gimple_has_volatile_ops (stmt)
|| (cfun->has_local_explicit_reg_vars || (cfun->has_local_explicit_reg_vars
&& TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))) == BLKmode)) && TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt))) == BLKmode))
return false; 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))) if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (DEF_FROM_PTR (def_p)))
return false; return false;
...@@ -483,11 +487,22 @@ sink_code_in_bb (basic_block bb) ...@@ -483,11 +487,22 @@ sink_code_in_bb (basic_block bb)
{ {
gimple *stmt = gsi_stmt (gsi); gimple *stmt = gsi_stmt (gsi);
gimple_stmt_iterator togsi; 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)) if (!gsi_end_p (gsi))
gsi_prev (&gsi); gsi_prev (&gsi);
/* 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; last = false;
continue; continue;
} }
......
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