From 8341e6d9fac83d43241273a6c196387f44d5b2f4 Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 28 Jan 2010 14:45:09 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156324 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr42871.C | 40 ++++++++++++++++++++++++++++++++++ gcc/tree-ssa-pre.c | 14 +++++++++--- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr42871.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23cc5778320..ff0e868649b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 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 into call arguments. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a1c2ba3aff8..42796962341 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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. * gcc.dg/Wobjsize-1.c: Likewise. 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); -- 2.11.4.GIT