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, CHKP, PR middle-end/66581] Fix internal compiler error: SSA corruption


Hi,

This patch doesn't allow to reuse bounds created for abnormal ssa name to avoid coalescing issues.  Bootstrapped and regtested for x86_64-unknown-linux-gnu.  Applied to trunk.  Is it OK for gcc-5-branch?

Thanks,
Ilya
--
gcc/

2015-06-19  Ilya Enkovich  <enkovich.gnu@gmail.com>

	* tree-chkp.c (chkp_compute_bounds_for_assignment): Don't
	reuse bounds created for abnormal ssa names.

gcc/testsuite/

2015-06-19  Ilya Enkovich  <enkovich.gnu@gmail.com>

	* gcc.target/i386/mpx/pr66581.c: New test.


diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr66581.c b/gcc/testsuite/gcc.target/i386/mpx/pr66581.c
new file mode 100755
index 0000000..015faae
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mpx/pr66581.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
+
+void *a;
+int b;
+
+void
+fn1 (void)
+{
+  void *c = &&l_nop;
+l_nop:
+    for (; b;)
+    ;
+  int *d = c;
+  c = fn1;
+  *d = 1;
+  goto *a;
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index 8edef48..f06451d 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -2513,6 +2513,7 @@ chkp_compute_bounds_for_assignment (tree node, gimple assign)
   tree rhs1 = gimple_assign_rhs1 (assign);
   tree bounds = NULL_TREE;
   gimple_stmt_iterator iter = gsi_for_stmt (assign);
+  tree base = NULL;
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
@@ -2539,6 +2540,7 @@ chkp_compute_bounds_for_assignment (tree node, gimple assign)
     case INTEGER_CST:
       /* Bounds are just propagated from RHS.  */
       bounds = chkp_find_bounds (rhs1, &iter);
+      base = rhs1;
       break;
 
     case VIEW_CONVERT_EXPR:
@@ -2609,6 +2611,8 @@ chkp_compute_bounds_for_assignment (tree node, gimple assign)
 	     (e.g. pointer minus pointer).  In such case
 	     use default invalid op bounds.  */
 	  bounds = chkp_get_invalid_op_bounds ();
+
+	base = (bounds == bnd1) ? rhs1 : (bounds == bnd2) ? rhs2 : NULL;
       }
       break;
 
@@ -2704,6 +2708,19 @@ chkp_compute_bounds_for_assignment (tree node, gimple assign)
 
   gcc_assert (bounds);
 
+  /* We may reuse bounds of other pointer we copy/modify.  But it is not
+     allowed for abnormal ssa names.  If we produced a pointer using
+     abnormal ssa name, we better make a bounds copy to avoid coalescing
+     issues.  */
+  if (base
+      && TREE_CODE (base) == SSA_NAME
+      && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (base))
+    {
+      gimple stmt = gimple_build_assign (chkp_get_tmp_reg (NULL), bounds);
+      gsi_insert_after (&iter, stmt, GSI_SAME_STMT);
+      bounds = gimple_assign_lhs (stmt);
+    }
+
   if (node)
     bounds = chkp_maybe_copy_and_register_bounds (node, bounds);
 


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