Commit d9700bdb by Richard Biener Committed by Richard Biener

tree-vrp.c (evrp_dom_walker::evrp_dom_walker): Initialize stmts_to_remove.

2016-10-19  Richard Biener  <rguenther@suse.de>

	* tree-vrp.c (evrp_dom_walker::evrp_dom_walker): Initialize
	stmts_to_remove.
	(evrp_dom_walker::~evrp_dom_walker): Free it.
	(evrp_dom_walker::stmts_to_remove): Add.
	(evrp_dom_walker::before_dom_children): Mark PHIs and stmts
	whose output we fully propagate for removal.  Propagate
	into BB destination PHI arguments.
	(execute_early_vrp): Remove queued stmts.  Dump value ranges
	before stmt removal.

	* gcc.dg/tree-ssa/pr61839_2.c: Fix testcase.

From-SVN: r241327
parent ae4206cb
2016-10-19 Richard Biener <rguenther@suse.de>
* tree-vrp.c (evrp_dom_walker::evrp_dom_walker): Initialize
stmts_to_remove.
(evrp_dom_walker::~evrp_dom_walker): Free it.
(evrp_dom_walker::stmts_to_remove): Add.
(evrp_dom_walker::before_dom_children): Mark PHIs and stmts
whose output we fully propagate for removal. Propagate
into BB destination PHI arguments.
(execute_early_vrp): Remove queued stmts. Dump value ranges
before stmt removal.
2016-10-18 Aldy Hernandez <aldyh@redhat.com> 2016-10-18 Aldy Hernandez <aldyh@redhat.com>
* Makefile.in (OBJS): Add gimple-ssa-warn-alloca.o. * Makefile.in (OBJS): Add gimple-ssa-warn-alloca.o.
......
2016-10-19 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/pr61839_2.c: Fix testcase.
2016-10-18 Kelvin Nilsen <kelvin@gcc.gnu.org> 2016-10-18 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/vsu/vec-all-ne-0.c: New test. * gcc.target/powerpc/vsu/vec-all-ne-0.c: New test.
......
...@@ -9,8 +9,8 @@ int foo () ...@@ -9,8 +9,8 @@ int foo ()
int a = -1; int a = -1;
volatile unsigned b = 1U; volatile unsigned b = 1U;
int c = 1; int c = 1;
c = (a + 972195718) / (b ? 1 : 0); c = (a + 972195718) / (b ? 2 : 0);
if (c == 972195717) if (c == 486097858)
; ;
else else
__builtin_abort (); __builtin_abort ();
...@@ -23,8 +23,8 @@ int bar () ...@@ -23,8 +23,8 @@ int bar ()
int a = -1; int a = -1;
volatile unsigned b = 1U; volatile unsigned b = 1U;
int c = 1; int c = 1;
c = (a + 972195718) % (b ? 1 : 0); c = (a + 972195718) % (b ? 2 : 0);
if (c == 972195717) if (c == 1)
; ;
else else
__builtin_abort (); __builtin_abort ();
...@@ -38,7 +38,7 @@ int bar2 () ...@@ -38,7 +38,7 @@ int bar2 ()
volatile unsigned b = 1U; volatile unsigned b = 1U;
int c = 1; int c = 1;
c = (a + 972195716) % (b ? 1 : 2); c = (a + 972195716) % (b ? 1 : 2);
if (c == 972195715) if (c == 0)
; ;
else else
__builtin_abort (); __builtin_abort ();
...@@ -47,8 +47,8 @@ int bar2 () ...@@ -47,8 +47,8 @@ int bar2 ()
/* Dont optimize 972195717 / 0 in function foo. */ /* Dont optimize 972195717 / 0 in function foo. */
/* { dg-final { scan-tree-dump-times "972195717 / _" 1 "evrp" } } */ /* { dg-final { scan-tree-dump-times "972195717 / " 1 "evrp" } } */
/* Dont optimize 972195717 % 0 in function bar. */ /* Dont optimize 972195717 % 0 in function bar. */
/* { dg-final { scan-tree-dump-times "972195717 % _" 1 "evrp" } } */ /* { dg-final { scan-tree-dump-times "972195717 % " 1 "evrp" } } */
/* Optimize in function bar2. */ /* May optimize in function bar2, but EVRP doesn't perform this yet. */
/* { dg-final { scan-tree-dump-times "972195715 % _" 0 "evrp" } } */ /* { dg-final { scan-tree-dump-times "972195715 % " 0 "evrp" { xfail *-*-* } } } */
...@@ -10642,12 +10642,10 @@ public: ...@@ -10642,12 +10642,10 @@ public:
evrp_dom_walker () evrp_dom_walker ()
: dom_walker (CDI_DOMINATORS), stack (10) : dom_walker (CDI_DOMINATORS), stack (10)
{ {
stmts_to_fixup.create (0);
need_eh_cleanup = BITMAP_ALLOC (NULL); need_eh_cleanup = BITMAP_ALLOC (NULL);
} }
~evrp_dom_walker () ~evrp_dom_walker ()
{ {
stmts_to_fixup.release ();
BITMAP_FREE (need_eh_cleanup); BITMAP_FREE (need_eh_cleanup);
} }
virtual edge before_dom_children (basic_block); virtual edge before_dom_children (basic_block);
...@@ -10659,7 +10657,8 @@ public: ...@@ -10659,7 +10657,8 @@ public:
/* Cond_stack holds the old VR. */ /* Cond_stack holds the old VR. */
auto_vec<std::pair <const_tree, value_range*> > stack; auto_vec<std::pair <const_tree, value_range*> > stack;
bitmap need_eh_cleanup; bitmap need_eh_cleanup;
vec<gimple *> stmts_to_fixup; auto_vec<gimple *> stmts_to_fixup;
auto_vec<gimple *> stmts_to_remove;
}; };
...@@ -10769,6 +10768,11 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -10769,6 +10768,11 @@ evrp_dom_walker::before_dom_children (basic_block bb)
else else
set_value_range_to_varying (&vr_result); set_value_range_to_varying (&vr_result);
update_value_range (lhs, &vr_result); update_value_range (lhs, &vr_result);
/* Mark PHIs whose lhs we fully propagate for removal. */
tree val = op_with_constant_singleton_value_range (lhs);
if (val && may_propagate_copy (lhs, val))
stmts_to_remove.safe_push (phi);
} }
edge taken_edge = NULL; edge taken_edge = NULL;
...@@ -10806,7 +10810,6 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -10806,7 +10810,6 @@ evrp_dom_walker::before_dom_children (basic_block bb)
update_value_range (output, &vr); update_value_range (output, &vr);
vr = *get_value_range (output); vr = *get_value_range (output);
/* Set the SSA with the value range. */ /* Set the SSA with the value range. */
if (INTEGRAL_TYPE_P (TREE_TYPE (output))) if (INTEGRAL_TYPE_P (TREE_TYPE (output)))
{ {
...@@ -10824,6 +10827,17 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -10824,6 +10827,17 @@ evrp_dom_walker::before_dom_children (basic_block bb)
&& range_includes_zero_p (vr.min, && range_includes_zero_p (vr.min,
vr.max) == 1))) vr.max) == 1)))
set_ptr_nonnull (output); set_ptr_nonnull (output);
/* Mark stmts whose output we fully propagate for removal. */
tree val;
if ((val = op_with_constant_singleton_value_range (output))
&& may_propagate_copy (output, val)
&& !stmt_could_throw_p (stmt)
&& !gimple_has_side_effects (stmt))
{
stmts_to_remove.safe_push (stmt);
continue;
}
} }
else else
set_defs_to_varying (stmt); set_defs_to_varying (stmt);
...@@ -10860,6 +10874,25 @@ evrp_dom_walker::before_dom_children (basic_block bb) ...@@ -10860,6 +10874,25 @@ evrp_dom_walker::before_dom_children (basic_block bb)
} }
} }
} }
/* Visit BB successor PHI nodes and replace PHI args. */
FOR_EACH_EDGE (e, ei, bb->succs)
{
for (gphi_iterator gpi = gsi_start_phis (e->dest);
!gsi_end_p (gpi); gsi_next (&gpi))
{
gphi *phi = gpi.phi ();
use_operand_p use_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
tree arg = USE_FROM_PTR (use_p);
if (TREE_CODE (arg) != SSA_NAME
|| virtual_operand_p (arg))
continue;
tree val = op_with_constant_singleton_value_range (arg);
if (val && may_propagate_copy (arg, val))
propagate_value (use_p, val);
}
}
bb->flags |= BB_VISITED; bb->flags |= BB_VISITED;
return taken_edge; return taken_edge;
...@@ -10941,6 +10974,34 @@ execute_early_vrp () ...@@ -10941,6 +10974,34 @@ execute_early_vrp ()
evrp_dom_walker walker; evrp_dom_walker walker;
walker.walk (ENTRY_BLOCK_PTR_FOR_FN (cfun)); walker.walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
if (dump_file)
{
fprintf (dump_file, "\nValue ranges after Early VRP:\n\n");
dump_all_value_ranges (dump_file);
fprintf (dump_file, "\n");
}
/* Remove stmts in reverse order to make debug stmt creation possible. */
while (! walker.stmts_to_remove.is_empty ())
{
gimple *stmt = walker.stmts_to_remove.pop ();
if (dump_file && dump_flags & TDF_DETAILS)
{
fprintf (dump_file, "Removing dead stmt ");
print_gimple_stmt (dump_file, stmt, 0, 0);
fprintf (dump_file, "\n");
}
gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
if (gimple_code (stmt) == GIMPLE_PHI)
remove_phi_node (&gsi, true);
else
{
unlink_stmt_vdef (stmt);
gsi_remove (&gsi, true);
release_defs (stmt);
}
}
if (!bitmap_empty_p (walker.need_eh_cleanup)) if (!bitmap_empty_p (walker.need_eh_cleanup))
gimple_purge_all_dead_eh_edges (walker.need_eh_cleanup); gimple_purge_all_dead_eh_edges (walker.need_eh_cleanup);
...@@ -10954,12 +11015,6 @@ execute_early_vrp () ...@@ -10954,12 +11015,6 @@ execute_early_vrp ()
fixup_noreturn_call (stmt); fixup_noreturn_call (stmt);
} }
if (dump_file)
{
fprintf (dump_file, "\nValue ranges after Early VRP:\n\n");
dump_all_value_ranges (dump_file);
fprintf (dump_file, "\n");
}
vrp_free_lattice (); vrp_free_lattice ();
scev_finalize (); scev_finalize ();
loop_optimizer_finalize (); loop_optimizer_finalize ();
......
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