re PR tree-optimization/42871 (g++: Internal error: Segmentation fault (program cc1plus))
authorRichard Guenther <rguenther@suse.de>
Thu, 28 Jan 2010 14:45:09 +0000 (14:45 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 28 Jan 2010 14:45:09 +0000 (14:45 +0000)
2010-01-28  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/42871
* tree-ssa-pre.c (phi_translate_set): Make sure to retain
leaders.

* g++.dg/torture/pr42871.C: New testcase.

From-SVN: r156324

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr42871.C [new file with mode: 0644]
gcc/tree-ssa-pre.c

index 23cc57783205d83e88bac172fa25a53002d569bc..ff0e868649b5c80b683f19682e46c20ecd2dc2ad 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-28  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/42871
+       * tree-ssa-pre.c (phi_translate_set): Make sure to retain
+       leaders.
+
 2010-01-28  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-ccp.c (ccp_fold_stmt): Fold calls and propagate
index a1c2ba3aff89e973b2154f5993872dd055b7ff70..4279696234153a0c7d2b17c7fd0ff0b360b46333 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-28  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/42871
+       * g++.dg/torture/pr42871.C: New testcase.
+
 2010-01-28  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/Wobjsize-1.h: New testcase.
diff --git a/gcc/testsuite/g++.dg/torture/pr42871.C b/gcc/testsuite/g++.dg/torture/pr42871.C
new file mode 100644 (file)
index 0000000..452ad93
--- /dev/null
@@ -0,0 +1,40 @@
+struct C
+{
+  ~C ();
+  int c3;
+};
+
+C *b2;
+
+static void
+b1 (const C &x, unsigned b3, unsigned b4)
+{
+  unsigned i = 0;
+  for (; i < b3; i++)
+    if (i < b4)
+      {
+        b2[0].c3 = x.c3;
+        return;
+      }
+}
+
+int a ();
+
+void
+bar (unsigned b3, unsigned b4)
+{
+  C c[100];
+  for (int i = 0; i < 100; i++)
+    {
+      c[i].c3 = i;
+      for (int j = 0; j < b3; j++)
+        if (j < b4)
+          {
+            b2[0].c3 = 0;
+            break;
+          }
+      b1 (c[i], b3, b4);
+      a ();
+    }
+}
+
index c1e5cd7c701322527b11c6c04acce2d053b17462..285b2c8b0b3dd7b3c4013f07b325146d536a6b9e 100644 (file)
@@ -1836,10 +1836,18 @@ phi_translate_set (bitmap_set_t dest, bitmap_set_t set, basic_block pred,
       translated = phi_translate (expr, set, NULL, pred, phiblock);
 
       /* Don't add empty translations to the cache  */
-      if (translated)
-       phi_trans_add (expr, translated, pred);
+      if (!translated)
+       continue;
+
+      phi_trans_add (expr, translated, pred);
 
-      if (translated != NULL)
+      /* We might end up with multiple expressions from SET being
+        translated to the same value.  In this case we do not want
+        to retain the NARY or REFERENCE expression but prefer a NAME
+        which would be the leader.  */
+      if (translated->kind == NAME)
+       bitmap_value_replace_in_set (dest, translated);
+      else
        bitmap_value_insert_into_set (dest, translated);
     }
   VEC_free (pre_expr, heap, exprs);