+2010-07-27 Maxim Kuvyrkov <maxim@codesourcery.com>
+
+ 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.
+
2010-07-27 Maxim Kuvyrkov <maxim@codesourcery.com>
* gcse.c (struct expr:max_distance): New field.
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],
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. */