This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR78542


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;
     }
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]