This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR78542
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 28 Nov 2016 13:47:28 +0100 (CET)
- Subject: [PATCH] Fix PR78542
- Authentication-results: sourceware.org; auth=none
The following fixes another issue with marrying the SSA propagator
and match-and-simplify during propagation (which is tricky at best).
Bootstrap and regtest running on x86_64-unknown-linux-gnu, I've
applied the VRP patch below as well to see if the theory works
out (VRP misses to handle simplifications to copies during
propagation). I'm considering that change for and the fix
for GCC 6 where the issue is latent.
Richard.
2016-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/78542
* tree-ssa-ccp.c (evaluate_stmt): Only valueize simplification
if allowed.
* gcc.dg/torture/pr78542.c: New testcase.
Index: gcc/tree-ssa-ccp.c
===================================================================
--- gcc/tree-ssa-ccp.c (revision 242913)
+++ gcc/tree-ssa-ccp.c (working copy)
@@ -1744,7 +1744,12 @@ evaluate_stmt (gimple *stmt)
{
fold_defer_overflow_warnings ();
simplified = ccp_fold (stmt);
- if (simplified && TREE_CODE (simplified) == SSA_NAME)
+ if (simplified
+ && TREE_CODE (simplified) == SSA_NAME
+ /* We may not use values of something that may be simulated again,
+ see valueize_op_1. */
+ && (SSA_NAME_IS_DEFAULT_DEF (simplified)
+ || ! prop_simulate_again_p (SSA_NAME_DEF_STMT (simplified))))
{
ccp_prop_value_t *val = get_value (simplified);
if (val && val->lattice_val != VARYING)
Index: gcc/testsuite/gcc.dg/torture/pr78542.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr78542.c (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr78542.c (revision 0)
@@ -0,0 +1,23 @@
+/* { dg-do run } */
+/* { dg-additional-options "-w -Wno-psabi" } */
+
+typedef unsigned V __attribute__ ((vector_size (16)));
+
+V
+foo (unsigned x, V v)
+{
+ do {
+ v %= x;
+ x = 1;
+ } while (v[1]);
+ return v;
+}
+
+int
+main ()
+{
+ V x = foo (5, (V) { 0, 1 });
+ if (x[0] || x[1] || x[2] || x[3])
+ __builtin_abort();
+ return 0;
+}
2016-11-28 Richard Biener <rguenther@suse.de>
* tree-vrp.c (vrp_visit_assignment_or_call): Handle
simplifications to SSA names via extract_range_from_ssa_name
if allowed.
Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c (revision 242913)
+++ gcc/tree-vrp.c (working copy)
@@ -7132,17 +7132,31 @@ vrp_visit_assignment_or_call (gimple *st
&& TYPE_MAX_VALUE (TREE_TYPE (lhs)))
|| POINTER_TYPE_P (TREE_TYPE (lhs))))
{
+ *output_p = lhs;
+
/* Try folding the statement to a constant first. */
tree tem = gimple_fold_stmt_to_constant_1 (stmt, vrp_valueize,
vrp_valueize_1);
- if (tem && is_gimple_min_invariant (tem))
- set_value_range_to_value (vr, tem, NULL);
+ if (tem)
+ {
+ if (TREE_CODE (tem) == SSA_NAME
+ && (SSA_NAME_IS_DEFAULT_DEF (tem)
+ || ! prop_simulate_again_p (SSA_NAME_DEF_STMT (tem))))
+ {
+ extract_range_from_ssa_name (vr, tem);
+ return;
+ }
+ else if (is_gimple_min_invariant (tem))
+ {
+ set_value_range_to_value (vr, tem, NULL);
+ return;
+ }
+ }
/* Then dispatch to value-range extracting functions. */
- else if (code == GIMPLE_CALL)
+ if (code == GIMPLE_CALL)
extract_range_basic (vr, stmt);
else
extract_range_from_assignment (vr, as_a <gassign *> (stmt));
- *output_p = lhs;
}
}