Commit 8a7c91cd by Richard Biener Committed by Richard Biener

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

	* tree-ssa-propagate.c
	(substitute_and_fold_dom_walker::before_dom_children): Do not
	ignore ASSERT_EXPRs but only preserve them.
	* tree-vrp.c (remove_range_assertions): Deal with ASSERT_EXPRs
	that have been propagated into.
	(vrp_finalize): Enable DCE for substitute_and_fold.

	* gcc.dg/tree-ssa/vrp35.c: Adjust.
	* gcc.dg/tree-ssa/vrp36.c: Likewise.
	* gcc.dg/tree-ssa/vrp46.c: Likewise.

From-SVN: r241021
parent 7dc2f5f1
2016-10-12 Richard Biener <rguenther@suse.de> 2016-10-12 Richard Biener <rguenther@suse.de>
* tree-ssa-propagate.c
(substitute_and_fold_dom_walker::before_dom_children): Do not
ignore ASSERT_EXPRs but only preserve them.
* tree-vrp.c (remove_range_assertions): Deal with ASSERT_EXPRs
that have been propagated into.
(vrp_finalize): Enable DCE for substitute_and_fold.
2016-10-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/77920 PR tree-optimization/77920
* tree-vrp.c (simplify_div_or_mod_using_ranges): Simplify. * tree-vrp.c (simplify_div_or_mod_using_ranges): Simplify.
(simplify_min_or_max_using_ranges): Pass in gsi and use it. (simplify_min_or_max_using_ranges): Pass in gsi and use it.
......
2016-10-12 Richard Biener <rguenther@suse.de> 2016-10-12 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/vrp35.c: Adjust.
* gcc.dg/tree-ssa/vrp36.c: Likewise.
* gcc.dg/tree-ssa/vrp46.c: Likewise.
2016-10-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/77920 PR tree-optimization/77920
* gcc.dg/torture/pr77920.c: New testcase. * gcc.dg/torture/pr77920.c: New testcase.
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp1" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
int test1(int i, int k) int test1(int i, int k)
{ {
...@@ -11,4 +11,4 @@ int test1(int i, int k) ...@@ -11,4 +11,4 @@ int test1(int i, int k)
return 1; return 1;
} }
/* { dg-final { scan-tree-dump "Folding predicate j_.* == 10 to 0" "vrp1" } } */ /* { dg-final { scan-tree-dump "Removing dead stmt \[^\r\n\]* = j_.* == 10" "vrp1" } } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp1" } */ /* { dg-options "-O2 -fdump-tree-vrp1-details" } */
int foo(int i) int foo(int i)
{ {
...@@ -8,4 +8,4 @@ int foo(int i) ...@@ -8,4 +8,4 @@ int foo(int i)
return 1; return 1;
} }
/* { dg-final { scan-tree-dump "Folding predicate i_.* == 1 to 0" "vrp1" } } */ /* { dg-final { scan-tree-dump "Removing dead stmt \[^\r\n\]* = i_.* == 1" "vrp1" } } */
...@@ -27,6 +27,6 @@ func_18 ( int t ) ...@@ -27,6 +27,6 @@ func_18 ( int t )
} }
} }
/* There should be a single if left. */ /* There should be no if left. */
/* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "if" 0 "vrp1" } } */
...@@ -1035,15 +1035,6 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb) ...@@ -1035,15 +1035,6 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb)
{ {
bool did_replace; bool did_replace;
gimple *stmt = gsi_stmt (i); gimple *stmt = gsi_stmt (i);
enum gimple_code code = gimple_code (stmt);
/* Ignore ASSERT_EXPRs. They are used by VRP to generate
range information for names and they are discarded
afterwards. */
if (code == GIMPLE_ASSIGN
&& TREE_CODE (gimple_assign_rhs1 (stmt)) == ASSERT_EXPR)
continue;
/* No point propagating into a stmt we have a value for we /* No point propagating into a stmt we have a value for we
can propagate into all uses. Mark it for removal instead. */ can propagate into all uses. Mark it for removal instead. */
...@@ -1056,7 +1047,10 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb) ...@@ -1056,7 +1047,10 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb)
&& sprime != lhs && sprime != lhs
&& may_propagate_copy (lhs, sprime) && may_propagate_copy (lhs, sprime)
&& !stmt_could_throw_p (stmt) && !stmt_could_throw_p (stmt)
&& !gimple_has_side_effects (stmt)) && !gimple_has_side_effects (stmt)
/* We have to leave ASSERT_EXPRs around for jump-threading. */
&& (!is_gimple_assign (stmt)
|| gimple_assign_rhs_code (stmt) != ASSERT_EXPR))
{ {
stmts_to_remove.safe_push (stmt); stmts_to_remove.safe_push (stmt);
continue; continue;
......
...@@ -6894,9 +6894,9 @@ remove_range_assertions (void) ...@@ -6894,9 +6894,9 @@ remove_range_assertions (void)
imm_use_iterator iter; imm_use_iterator iter;
var = ASSERT_EXPR_VAR (rhs); var = ASSERT_EXPR_VAR (rhs);
gcc_assert (TREE_CODE (var) == SSA_NAME);
if (!POINTER_TYPE_P (TREE_TYPE (lhs)) if (TREE_CODE (var) == SSA_NAME
&& !POINTER_TYPE_P (TREE_TYPE (lhs))
&& SSA_NAME_RANGE_INFO (lhs)) && SSA_NAME_RANGE_INFO (lhs))
{ {
if (is_unreachable == -1) if (is_unreachable == -1)
...@@ -6928,8 +6928,11 @@ remove_range_assertions (void) ...@@ -6928,8 +6928,11 @@ remove_range_assertions (void)
/* Propagate the RHS into every use of the LHS. */ /* Propagate the RHS into every use of the LHS. */
FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs) FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
FOR_EACH_IMM_USE_ON_STMT (use_p, iter) {
SET_USE (use_p, var); FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
SET_USE (use_p, var);
update_stmt (use_stmt);
}
/* And finally, remove the copy, it is not needed. */ /* And finally, remove the copy, it is not needed. */
gsi_remove (&si, true); gsi_remove (&si, true);
...@@ -10611,7 +10614,7 @@ vrp_finalize (bool warn_array_bounds_p) ...@@ -10611,7 +10614,7 @@ vrp_finalize (bool warn_array_bounds_p)
} }
substitute_and_fold (op_with_constant_singleton_value_range, substitute_and_fold (op_with_constant_singleton_value_range,
vrp_fold_stmt, false); vrp_fold_stmt, true);
if (warn_array_bounds && warn_array_bounds_p) if (warn_array_bounds && warn_array_bounds_p)
check_all_array_refs (); check_all_array_refs ();
......
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