summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-05-11 13:40:37 +0200
committerRichard Biener <rguenther@suse.de>2020-05-11 17:56:31 +0200
commit84f4954c38228e4cb3e6f0b5471883e6c2523631 (patch)
tree364d1acb8ce08b1b24fed30f89e6bc8fc716b75d
parentd8bd9d32e8b3e7c2a1bb6fc920efe6691fb5e8b6 (diff)
tree-optimization/95049 - fix not terminating RPO VN iteration
This rejects lattice changes from one constant to another. 2020-05-11 Richard Biener <rguenther@suse.de> PR tree-optimization/95049 * tree-ssa-sccvn.c (set_ssa_val_to): Reject lattice transition between different constants. * gcc.dg/torture/pr95049.c: New testcase.
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr95049.c7
-rw-r--r--gcc/tree-ssa-sccvn.c27
4 files changed, 40 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cf6eafd1a15..9ddd08505c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-05-11 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/95049
+ * tree-ssa-sccvn.c (set_ssa_val_to): Reject lattice transition
+ between different constants.
+
2020-05-11 Richard Sandiford <richard.sandiford@arm.com>
* tree-pretty-print.c (dump_generic_node): Handle BOOLEAN_TYPEs.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65feee50c8b..92e1d409304 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-11 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/95049
+ * gcc.dg/torture/pr95049.c: New testcase.
+
2020-05-11 Kelvin Nilsen <kelvin@gcc.gnu.org>
Bill Schmidt <wschmidt@linux.ibm.com>
diff --git a/gcc/testsuite/gcc.dg/torture/pr95049.c b/gcc/testsuite/gcc.dg/torture/pr95049.c
new file mode 100644
index 00000000000..164bfdbdcfc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr95049.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+void a()
+{
+ for (int b; b; b = !b)
+ ;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 39e99007c7e..4b3f31c12cb 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -4472,6 +4472,8 @@ set_ssa_val_to (tree from, tree to)
vn_ssa_aux_t from_info = VN_INFO (from);
tree currval = from_info->valnum; // SSA_VAL (from)
poly_int64 toff, coff;
+ bool curr_undefined = false;
+ bool curr_invariant = false;
/* The only thing we allow as value numbers are ssa_names
and invariants. So assert that here. We don't allow VN_TOP
@@ -4514,9 +4516,9 @@ set_ssa_val_to (tree from, tree to)
}
return false;
}
- bool curr_invariant = is_gimple_min_invariant (currval);
- bool curr_undefined = (TREE_CODE (currval) == SSA_NAME
- && ssa_undefined_value_p (currval, false));
+ curr_invariant = is_gimple_min_invariant (currval);
+ curr_undefined = (TREE_CODE (currval) == SSA_NAME
+ && ssa_undefined_value_p (currval, false));
if (currval != VN_TOP
&& !curr_invariant
&& !curr_undefined
@@ -4571,9 +4573,8 @@ set_and_exit:
&& !operand_equal_p (currval, to, 0)
/* Different undefined SSA names are not actually different. See
PR82320 for a testcase were we'd otherwise not terminate iteration. */
- && !(TREE_CODE (currval) == SSA_NAME
+ && !(curr_undefined
&& TREE_CODE (to) == SSA_NAME
- && ssa_undefined_value_p (currval, false)
&& ssa_undefined_value_p (to, false))
/* ??? For addresses involving volatile objects or types operand_equal_p
does not reliably detect ADDR_EXPRs as equal. We know we are only
@@ -4585,6 +4586,22 @@ set_and_exit:
== get_addr_base_and_unit_offset (TREE_OPERAND (to, 0), &toff))
&& known_eq (coff, toff)))
{
+ if (to != from
+ && currval != VN_TOP
+ && !curr_undefined
+ /* We do not want to allow lattice transitions from one value
+ to another since that may lead to not terminating iteration
+ (see PR95049). Since there's no convenient way to check
+ for the allowed transition of VAL -> PHI (loop entry value,
+ same on two PHIs, to same PHI result) we restrict the check
+ to invariants. */
+ && curr_invariant
+ && is_gimple_min_invariant (to))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " forced VARYING");
+ to = from;
+ }
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " (changed)\n");
from_info->valnum = to;