From 8a7c91cd629edc20ddefe13bc8d0872a18a9ad9a Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 12 Oct 2016 07:10:07 +0000 Subject: [PATCH] 2016-10-12 Richard Biener * 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 --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/tree-ssa/vrp35.c | 4 ++-- gcc/testsuite/gcc.dg/tree-ssa/vrp36.c | 4 ++-- gcc/testsuite/gcc.dg/tree-ssa/vrp46.c | 4 ++-- gcc/tree-ssa-propagate.c | 14 ++++---------- gcc/tree-vrp.c | 13 ++++++++----- 7 files changed, 33 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 92a45d9..30c186a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2016-10-12 Richard Biener + * 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 + PR tree-optimization/77920 * tree-vrp.c (simplify_div_or_mod_using_ranges): Simplify. (simplify_min_or_max_using_ranges): Pass in gsi and use it. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ebd9bd..1c4d4cf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2016-10-12 Richard Biener + * 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 + PR tree-optimization/77920 * gcc.dg/torture/pr77920.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp35.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp35.c index 1cf310b..20112ea 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp35.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp35.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ int test1(int i, int k) { @@ -11,4 +11,4 @@ int test1(int i, int k) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp36.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp36.c index 873a7c9..3933254 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp36.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp36.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1-details" } */ int foo(int i) { @@ -8,4 +8,4 @@ int foo(int i) 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" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp46.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp46.c index d3c9ed1..ebdc2e3 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp46.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp46.c @@ -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" } } */ diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index cd1cbd2..0f940cc 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -1035,15 +1035,6 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb) { bool did_replace; 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 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) && sprime != lhs && may_propagate_copy (lhs, sprime) && !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); continue; diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index e46f7fc..8d5fa66 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -6894,9 +6894,9 @@ remove_range_assertions (void) imm_use_iterator iter; 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)) { if (is_unreachable == -1) @@ -6928,8 +6928,11 @@ remove_range_assertions (void) /* Propagate the RHS into every use of the 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. */ gsi_remove (&si, true); @@ -10611,7 +10614,7 @@ vrp_finalize (bool warn_array_bounds_p) } 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) check_all_array_refs (); -- 2.7.4