diff mbox

Small PRE speedup

Message ID alpine.LSU.2.20.1705081533300.20726@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener May 8, 2017, 1:33 p.m. UTC
Was sitting in my tree.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2017-05-08  Richard Biener  <rguenther@suse.de>

	* tree-ssa-pre.c (bitmap_set_and): Avoid bitmap copy.
	(bitmap_set_subtract_values): Likewise.
diff mbox

Patch

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);
 }