diff options
author | Richard Guenther <rguenther@suse.de> | 2010-01-28 14:45:09 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-01-28 14:45:09 +0000 |
commit | 3ed7d068d9c79e4a5887027ca6c3f938f0fbb941 (patch) | |
tree | c22f3dc203979f63f6b4ac2828a9ddbe793a04c3 /gcc | |
parent | 830bc5507b328fa2218e57a5c500336110ce0a40 (diff) | |
download | gcc-3ed7d068d9c79e4a5887027ca6c3f938f0fbb941.zip gcc-3ed7d068d9c79e4a5887027ca6c3f938f0fbb941.tar.gz gcc-3ed7d068d9c79e4a5887027ca6c3f938f0fbb941.tar.bz2 |
re PR tree-optimization/42871 (g++: Internal error: Segmentation fault (program cc1plus))
2010-01-28 Richard Guenther <rguenther@suse.de>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr42871.C | 40 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 14 |
4 files changed, 62 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23cc577..ff0e868 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2010-01-28 Richard Guenther <rguenther@suse.de> + PR tree-optimization/42871 + * tree-ssa-pre.c (phi_translate_set): Make sure to retain + leaders. + +2010-01-28 Richard Guenther <rguenther@suse.de> + * 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 a1c2ba3..4279696 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-01-28 Richard Guenther <rguenther@suse.de> + PR tree-optimization/42871 + * g++.dg/torture/pr42871.C: New testcase. + +2010-01-28 Richard Guenther <rguenther@suse.de> + * 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 0000000..452ad93 --- /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 c1e5cd7..285b2c8 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); |