re PR tree-optimization/53163 (crash due to null ptr deref)
authorJakub Jelinek <jakub@redhat.com>
Wed, 2 May 2012 09:55:32 +0000 (11:55 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 2 May 2012 09:55:32 +0000 (11:55 +0200)
PR tree-optimization/53163
* tree-ssa-phiopt.c (cond_if_else_store_replacement): Don't ignore
return value from compute_all_dependences.

* gcc.c-torture/compile/pr53163.c: New test.

From-SVN: r187038

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr53163.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index 972f3cc0b5eaa261dcf7834eb004c822ff9d1e4d..f9b8a6e84f260e14d65d5ac6a9de07f9201a7f82 100644 (file)
@@ -1,5 +1,9 @@
 2012-05-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/53163
+       * tree-ssa-phiopt.c (cond_if_else_store_replacement): Don't ignore
+       return value from compute_all_dependences.
+
        PR rtl-optimization/53160
        * ree.c (combine_reaching_defs): Handle the case where cand->insn
        has been modified by ree pass already.
index 72d9379d0d9085250a9901b4fe52cf840e086101..b2055433beb19b302a0ae0f846ff5be2cdacc077 100644 (file)
@@ -1,5 +1,8 @@
 2012-05-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/53163
+       * gcc.c-torture/compile/pr53163.c: New test.
+
        PR rtl-optimization/53160
        * gcc.c-torture/execute/pr53160.c: New test.
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr53163.c b/gcc/testsuite/gcc.c-torture/compile/pr53163.c
new file mode 100644 (file)
index 0000000..990b113
--- /dev/null
@@ -0,0 +1,34 @@
+/* PR tree-optimization/53163 */
+
+struct S { int s; } b, f;
+int a, c;
+
+void
+foo (void)
+{
+  int d, e;
+  for (d = 4; d < 19; ++d)
+    for (e = 2; e >= 0; e--)
+      {
+       a = 0;
+       a = 1;
+      }
+}
+
+void
+bar (void)
+{
+  int g, h, i;
+  for (i = 1; i >= 0; i--)
+    {
+      b = f;
+      for (g = 0; g <= 1; g++)
+       {
+         if (c)
+           break;
+         for (h = 0; h <= 1; h++)
+           foo ();
+         foo ();
+       }
+    }
+}
index 88c16e683733968faf519ef0a36e5f436bd20035..1cfa0f512bc4bca4e17da11319f5f0ca0cb388c2 100644 (file)
@@ -1624,8 +1624,17 @@ cond_if_else_store_replacement (basic_block then_bb, basic_block else_bb,
   /* Compute and check data dependencies in both basic blocks.  */
   then_ddrs = VEC_alloc (ddr_p, heap, 1);
   else_ddrs = VEC_alloc (ddr_p, heap, 1);
-  compute_all_dependences (then_datarefs, &then_ddrs, NULL, false);
-  compute_all_dependences (else_datarefs, &else_ddrs, NULL, false);
+  if (!compute_all_dependences (then_datarefs, &then_ddrs, NULL, false)
+      || !compute_all_dependences (else_datarefs, &else_ddrs, NULL, false))
+    {
+      free_dependence_relations (then_ddrs);
+      free_dependence_relations (else_ddrs);
+      free_data_refs (then_datarefs);
+      free_data_refs (else_datarefs);
+      VEC_free (gimple, heap, then_stores);
+      VEC_free (gimple, heap, else_stores);
+      return false;
+    }
   blocks[0] = then_bb;
   blocks[1] = else_bb;
   blocks[2] = join_bb;