diff options
author | Maxim Kuvyrkov <maxim@codesourcery.com> | 2010-07-27 19:34:55 +0000 |
---|---|---|
committer | Maxim Kuvyrkov <mkuvyrkov@gcc.gnu.org> | 2010-07-27 19:34:55 +0000 |
commit | ce4c0015a16e1126844f5feaa57bcdf0aebdcb30 (patch) | |
tree | bc917e23e29e482306b5b28d47954ead5d6531dc /gcc/gcse.c | |
parent | 2016034718e8074a6c222c71fd528846a32cfcd6 (diff) | |
download | gcc-ce4c0015a16e1126844f5feaa57bcdf0aebdcb30.zip gcc-ce4c0015a16e1126844f5feaa57bcdf0aebdcb30.tar.gz gcc-ce4c0015a16e1126844f5feaa57bcdf0aebdcb30.tar.bz2 |
re PR rtl-optimization/40956 (Constants are never candidates for hoisting)
PR rtl-optimization/40956
PR target/42495
PR middle-end/42574
* gcse.c (compute_code_hoist_vbeinout): Consider more expressions
for hoisting.
(hoist_code): Count occurences in current block too.
From-SVN: r162590
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r-- | gcc/gcse.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -4247,8 +4247,15 @@ compute_code_hoist_vbeinout (void) FOR_EACH_BB_REVERSE (bb) { if (bb->next_bb != EXIT_BLOCK_PTR) - sbitmap_intersection_of_succs (hoist_vbeout[bb->index], - hoist_vbein, bb->index); + { + sbitmap_intersection_of_succs (hoist_vbeout[bb->index], + hoist_vbein, bb->index); + + /* Include expressions in VBEout that are calculated + in BB and available at its end. */ + sbitmap_a_or_b (hoist_vbeout[bb->index], + hoist_vbeout[bb->index], comp[bb->index]); + } changed |= sbitmap_a_or_b_and_c_cg (hoist_vbein[bb->index], antloc[bb->index], @@ -4430,6 +4437,11 @@ hoist_code (void) if (TEST_BIT (hoist_vbeout[bb->index], i)) { + /* If an expression is computed in BB and is available at end of + BB, hoist all occurences dominated by BB to BB. */ + if (TEST_BIT (comp[bb->index], i)) + hoistable++; + /* We've found a potentially hoistable expression, now we look at every block BB dominates to see if it computes the expression. */ |