Micro optimize bitmap_clear_bit

Jan Hubicka hubicka@ucw.cz
Tue Jun 22 12:48:00 GMT 2010


Hi,
this is small change I noticed while looking into bitmap_clear_bit (that is also
amonght top 10 most hot GCC functions).  We test if the bit was previously
clear but then we go for bitmap_element_zerop.  Since there is branch anyway
(I am still not convinced that reducing store bandwidth is worth the hard to
predict branches here), it is probably good idea to branch around the
bitmap_element_zerop too.  I also added nonzero test for !ptr->bits[word_num]
since the value will be conveniently in register.

The patch seems to save about 10% of samples on bitmap_clear_bit, but it is
within noise factor.

Bootstrapped/regtested x86_64-linux, OK?
	* bitmap.c (bitmap_clear_bit): Micro optimize.
Index: bitmap.c
===================================================================
--- bitmap.c	(revision 161163)
+++ bitmap.c	(working copy)
@@ -624,11 +624,13 @@ bitmap_clear_bit (bitmap head, int bit)
       BITMAP_WORD bit_val = ((BITMAP_WORD) 1) << bit_num;
       bool res = (ptr->bits[word_num] & bit_val) != 0;
       if (res)
-	ptr->bits[word_num] &= ~bit_val;
-
-      /* If we cleared the entire word, free up the element.  */
-      if (bitmap_element_zerop (ptr))
-	bitmap_element_free (head, ptr);
+	{
+	  ptr->bits[word_num] &= ~bit_val;
+	  /* If we cleared the entire word, free up the element.  */
+	  if (!ptr->bits[word_num]
+	      && bitmap_element_zerop (ptr))
+	    bitmap_element_free (head, ptr);
+	}
 
       return res;
     }



More information about the Gcc-patches mailing list