aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-10-12 07:10:07 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-10-12 07:10:07 +0000
commit8a7c91cd629edc20ddefe13bc8d0872a18a9ad9a (patch)
tree3d395f1318b558b7474c2796923f9da4f2bd0a23 /gcc
parent7dc2f5f1236a0f1544c756c46a5cd06491e96934 (diff)
downloadgcc-8a7c91cd629edc20ddefe13bc8d0872a18a9ad9a.zip
gcc-8a7c91cd629edc20ddefe13bc8d0872a18a9ad9a.tar.gz
gcc-8a7c91cd629edc20ddefe13bc8d0872a18a9ad9a.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp35.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp36.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp46.c4
-rw-r--r--gcc/tree-ssa-propagate.c14
-rw-r--r--gcc/tree-vrp.c13
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 <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
* 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 <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
* 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 ();