Was sitting in my tree. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2017-05-08 Richard Biener <rguent...@suse.de> * tree-ssa-pre.c (bitmap_set_and): Avoid bitmap copy. (bitmap_set_subtract_values): Likewise. Index: gcc/tree-ssa-pre.c =================================================================== --- gcc/tree-ssa-pre.c (revision 247733) +++ gcc/tree-ssa-pre.c (working copy) @@ -817,19 +818,23 @@ bitmap_set_and (bitmap_set_t dest, bitma if (dest != orig) { - bitmap_head temp; - bitmap_initialize (&temp, &grand_bitmap_obstack); - bitmap_and_into (&dest->values, &orig->values); - bitmap_copy (&temp, &dest->expressions); - EXECUTE_IF_SET_IN_BITMAP (&temp, 0, i, bi) + + unsigned int to_clear = -1U; + FOR_EACH_EXPR_ID_IN_SET (dest, i, bi) { + if (to_clear != -1U) + { + bitmap_clear_bit (&dest->expressions, to_clear); + to_clear = -1U; + } pre_expr expr = expression_for_id (i); unsigned int value_id = get_expr_value_id (expr); if (!bitmap_bit_p (&dest->values, value_id)) - bitmap_clear_bit (&dest->expressions, i); + to_clear = i; } - bitmap_clear (&temp); + if (to_clear != -1U) + bitmap_clear_bit (&dest->expressions, to_clear); } } @@ -862,18 +867,20 @@ bitmap_set_subtract_values (bitmap_set_t { unsigned int i; bitmap_iterator bi; - bitmap_head temp; - - bitmap_initialize (&temp, &grand_bitmap_obstack); - - bitmap_copy (&temp, &a->expressions); - EXECUTE_IF_SET_IN_BITMAP (&temp, 0, i, bi) + pre_expr to_remove = NULL; + FOR_EACH_EXPR_ID_IN_SET (a, i, bi) { + if (to_remove) + { + bitmap_remove_from_set (a, to_remove); + to_remove = NULL; + } pre_expr expr = expression_for_id (i); if (bitmap_set_contains_value (b, get_expr_value_id (expr))) - bitmap_remove_from_set (a, expr); + to_remove = expr; } - bitmap_clear (&temp); + if (to_remove) + bitmap_remove_from_set (a, to_remove); }