From: Richard Guenther Date: Sun, 17 Jan 2010 15:58:08 +0000 (+0000) Subject: re PR tree-optimization/42773 (ICE with g++ from 4.4.3 20100112 (prerelease)) X-Git-Tag: releases/gcc-4.5.0~1176 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9adf0570ff15ff5e3df45426bf159e6f4e5a8b3e;p=thirdparty%2Fgcc.git re PR tree-optimization/42773 (ICE with g++ from 4.4.3 20100112 (prerelease)) 2010-01-17 Richard Guenther 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. * g++.dg/torture/pr42773.C: New testcase. From-SVN: r155982 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3da75caf6673..547c4bfd4b2d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-17 Richard Guenther + + 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 PR debug/42767 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f92f6c55d075..d5249fdbf94e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-17 Richard Guenther + + PR tree-optimization/42773 + * g++.dg/torture/pr42773.C: New testcase. + 2010-01-17 Janus Weil 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 000000000000..478ad278aa6c --- /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 QValueListNode { +public: + QValueListNode* next; + QValueListNode* prev; +}; +template class QValueListPrivate : public QShared { +public: + typedef QValueListNode Node; + typedef QValueListNode* NodePtr; + QValueListPrivate(); + void derefAndDelete() { + if ( deref() ) delete this; + } + ~QValueListPrivate(); + NodePtr node; +}; +template QValueListPrivate::QValueListPrivate() { + node = new Node; + node->next = node->prev = node; +} +template QValueListPrivate::~QValueListPrivate() { + NodePtr p = node->next; + while( p != node ) { + NodePtr x = p->next; + delete p; + p = x; + } +} +template class QValueList { +public: + QValueList() { + sh = new QValueListPrivate; + } + ~QValueList() { + sh->derefAndDelete(); + } + QValueListPrivate* sh; +}; +class Cell { + QValueList obscuringCells() const; +}; +QValueList Cell::obscuringCells() const { + QValueList empty; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index cafebe677702..c1e5cd7c7013 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);