From: Richard Biener Date: Wed, 12 Oct 2016 07:10:07 +0000 (+0000) Subject: 2016-10-12 Richard Biener X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8a7c91cd629edc20ddefe13bc8d0872a18a9ad9a;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 92a45d90cdc..30c186a9b27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ebd9bd01d9..1c4d4cf8de2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp35.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp35.c index 1cf310bbffd..20112eafd53 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 873a7c9de91..3933254474a 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 d3c9ed144f3..ebdc2e3eedb 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 cd1cbd28325..0f940cc56b5 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 e46f7fcf085..8d5fa66e084 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 ();