diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-01-28 14:45:09 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-01-28 14:45:09 +0000 |
commit | 8341e6d9fac83d43241273a6c196387f44d5b2f4 (patch) | |
tree | c22f3dc203979f63f6b4ac2828a9ddbe793a04c3 /gcc/tree-ssa-pre.c | |
parent | 94144e6852b001bd69e74e1216438ec42aa1ce9b (diff) | |
download | gcc-8341e6d9fac83d43241273a6c196387f44d5b2f4.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156324 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 14 |
1 files changed, 11 insertions, 3 deletions
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); |