re PR tree-optimization/48271 (ICE: SIGSEGV in tree_ssa_dominator_optimize (tree...
authorRichard Guenther <rguenther@suse.de>
Thu, 24 Mar 2011 14:43:16 +0000 (14:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 24 Mar 2011 14:43:16 +0000 (14:43 +0000)
2011-03-24  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48271
* tree-ssa-dom.c (tree_ssa_dominator_optimize): Only cleanup
blocks that still exist.

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

From-SVN: r171395

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

index edf923cbea6b05ec7f9892d0f629920524f8fc30..4c00adc8d9490feae9963483bddeb18422a8283e 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-24  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48271
+       * tree-ssa-dom.c (tree_ssa_dominator_optimize): Only cleanup
+       blocks that still exist.
+
 2011-03-24  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/48270
index 472002622638e029809f8119f75dd00be868821b..1bed864420e409f238e156487472d99422d9f042 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-24  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48271
+       * g++.dg/torture/pr48271.C: New testcase.
+
 2011-03-24  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/array15.ad[sb]: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr48271.C b/gcc/testsuite/g++.dg/torture/pr48271.C
new file mode 100644 (file)
index 0000000..5b60ccd
--- /dev/null
@@ -0,0 +1,119 @@
+// { dg-do compile }
+// { dg-options "-ftree-vrp -fno-guess-branch-probability -fnon-call-exceptions" }
+
+void *xalloc ();
+void xfree (void *);
+void error ();
+
+static inline void *
+MallocT ()
+{
+  void *p = xalloc ();
+  if (!p)
+    error ();
+  return p;
+}
+
+
+struct ByteBlob
+{
+  int *header;
+
+  ByteBlob();
+
+  ~ByteBlob ()
+  {
+    Free ();
+  }
+
+  int RawFree (int * p)
+  {
+    if (!p)
+      error ();
+    xfree (p);
+  }
+
+  int *LengthRef ();
+
+  void Free ()
+  {
+    if (*header)
+      RawFree (header);
+  }
+
+  int Append (int num_ints)
+  {
+    if (*header)
+      MallocT ();
+    *LengthRef () += num_ints;
+  }
+};
+
+struct CBlobT:ByteBlob
+{
+  ~CBlobT ()
+  {
+    Free ();
+  }
+};
+
+template < class T > struct FixedSizeArray
+{
+  int HeaderSize;
+  T *data;
+  FixedSizeArray ();
+  int RefCnt ()
+  {
+    return *(int *) MallocT ();
+  }
+   ~FixedSizeArray ()
+  {
+    if (RefCnt ())
+      for (T * pItem = data + Length (); pItem != data; pItem--)
+       T ();
+  }
+  int Length ();
+};
+
+class SmallArray
+{
+  typedef FixedSizeArray < int > SubArray;
+  typedef FixedSizeArray < SubArray > SuperArray;
+  SuperArray data;
+};
+
+struct CHashTableT
+{
+  int *m_slots;
+  ~CHashTableT ()
+  {
+    delete m_slots;
+  }
+};
+
+struct CYapfBaseT
+{
+  int *PfGetSettings ();
+  SmallArray m_arr;
+  CHashTableT m_closed;
+  CYapfBaseT ()
+  {
+    MallocT ();
+  }
+};
+
+struct CYapfCostRailT:CYapfBaseT
+{
+  CBlobT m_sig_look_ahead_costs;
+  CYapfCostRailT ()
+  {
+    m_sig_look_ahead_costs.Append (*Yapf ()->PfGetSettings ());
+    Yapf ()->PfGetSettings ();
+  }
+  CYapfBaseT *Yapf ();
+};
+
+void stCheckReverseTrain ()
+{
+  CYapfCostRailT pf1;
+}
index fc87c4604c730473f1b518fb5a0c2b873bf91333..0f649f3cfed9f9fcf15b5aa62ee25a203872ad40 100644 (file)
@@ -701,7 +701,8 @@ tree_ssa_dominator_optimize (void)
     gimple_stmt_iterator gsi;
     basic_block bb;
     FOR_EACH_BB (bb)
-      {for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+      {
+       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
          update_stmt_if_modified (gsi_stmt (gsi));
       }
   }
@@ -734,7 +735,8 @@ tree_ssa_dominator_optimize (void)
       EXECUTE_IF_SET_IN_BITMAP (need_eh_cleanup, 0, i, bi)
        {
          basic_block bb = BASIC_BLOCK (i);
-         if (single_succ_p (bb) == 1
+         if (bb
+             && single_succ_p (bb)
              && (single_succ_edge (bb)->flags & EDGE_EH) == 0)
            {
              bitmap_clear_bit (need_eh_cleanup, i);