diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr42773.C | 54 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 8 |
4 files changed, 70 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3da75ca..547c4bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-17 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/42773 + * tree-ssa-pre.c (phi_translate_set): Fix check for PHI node existence. + (compute_antic_aux): Likewise. + (compute_partial_antic_aux): Likewise. + 2010-01-17 Jie Zhang <jie.zhang@analog.com> PR debug/42767 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f92f6c5..d5249fd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-17 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/42773 + * g++.dg/torture/pr42773.C: New testcase. + 2010-01-17 Janus Weil <janus@gcc.gnu.org> PR fortran/42677 diff --git a/gcc/testsuite/g++.dg/torture/pr42773.C b/gcc/testsuite/g++.dg/torture/pr42773.C new file mode 100644 index 0000000..478ad27 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42773.C @@ -0,0 +1,54 @@ +// { dg-do compile } +// { dg-options "-fno-exceptions" } + +typedef unsigned int uint; +struct QShared { + bool deref() { + return !--count; + } + uint count; +}; +template <class T> class QValueListNode { +public: + QValueListNode<T>* next; + QValueListNode<T>* prev; +}; +template <class T> class QValueListPrivate : public QShared { +public: + typedef QValueListNode<T> Node; + typedef QValueListNode<T>* NodePtr; + QValueListPrivate(); + void derefAndDelete() { + if ( deref() ) delete this; + } + ~QValueListPrivate(); + NodePtr node; +}; +template <class T> QValueListPrivate<T>::QValueListPrivate() { + node = new Node; + node->next = node->prev = node; +} +template <class T> QValueListPrivate<T>::~QValueListPrivate() { + NodePtr p = node->next; + while( p != node ) { + NodePtr x = p->next; + delete p; + p = x; + } +} +template <class T> class QValueList { +public: + QValueList() { + sh = new QValueListPrivate<T>; + } + ~QValueList() { + sh->derefAndDelete(); + } + QValueListPrivate<T>* sh; +}; +class Cell { + QValueList<Cell*> obscuringCells() const; +}; +QValueList<Cell*> Cell::obscuringCells() const { + QValueList<Cell*> empty; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index cafebe6..c1e5cd7 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1823,7 +1823,7 @@ phi_translate_set (bitmap_set_t dest, bitmap_set_t set, basic_block pred, pre_expr expr; int i; - if (!phi_nodes (phiblock)) + if (gimple_seq_empty_p (phi_nodes (phiblock))) { bitmap_set_copy (dest, set); return; @@ -2269,14 +2269,14 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge) goto maybe_dump_sets; } - if (phi_nodes (first)) + if (!gimple_seq_empty_p (phi_nodes (first))) phi_translate_set (ANTIC_OUT, ANTIC_IN (first), block, first); else bitmap_set_copy (ANTIC_OUT, ANTIC_IN (first)); for (i = 0; VEC_iterate (basic_block, worklist, i, bprime); i++) { - if (phi_nodes (bprime)) + if (!gimple_seq_empty_p (phi_nodes (bprime))) { bitmap_set_t tmp = bitmap_set_new (); phi_translate_set (tmp, ANTIC_IN (bprime), block, bprime); @@ -2426,7 +2426,7 @@ compute_partial_antic_aux (basic_block block, FOR_EACH_EXPR_ID_IN_SET (ANTIC_IN (bprime), i, bi) bitmap_value_insert_into_set (PA_OUT, expression_for_id (i)); - if (phi_nodes (bprime)) + if (!gimple_seq_empty_p (phi_nodes (bprime))) { bitmap_set_t pa_in = bitmap_set_new (); phi_translate_set (pa_in, PA_IN (bprime), block, bprime); |