summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr48271.C119
-rw-r--r--gcc/tree-ssa-dom.c6
4 files changed, 134 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index edf923cbea6..4c00adc8d94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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
* tree-ssa-phiopt.c (cond_if_else_store_replacement): Do
not free datarefs before ddrs.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 47200262263..1bed864420e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..5b60ccd768c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr48271.C
@@ -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;
+}
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index fc87c4604c7..0f649f3cfed 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -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);