From: Richard Guenther Date: Thu, 28 Jan 2010 14:45:09 +0000 (+0000) Subject: re PR tree-optimization/42871 (g++: Internal error: Segmentation fault (program cc1plus)) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3ed7d068d9c79e4a5887027ca6c3f938f0fbb941;p=gcc.git re PR tree-optimization/42871 (g++: Internal error: Segmentation fault (program cc1plus)) 2010-01-28 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23cc5778320..ff0e868649b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-28 Richard Guenther + + PR tree-optimization/42871 + * tree-ssa-pre.c (phi_translate_set): Make sure to retain + leaders. + 2010-01-28 Richard Guenther * tree-ssa-ccp.c (ccp_fold_stmt): Fold calls and propagate diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1c2ba3aff8..42796962341 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-28 Richard Guenther + + PR tree-optimization/42871 + * g++.dg/torture/pr42871.C: New testcase. + 2010-01-28 Richard Guenther * 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 index 00000000000..452ad9319fe --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42871.C @@ -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 (); + } +} + diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index c1e5cd7c701..285b2c8b0b3 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -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);