From patchwork Tue Jun 22 12:30:03 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Micro optimize bitmap_clear_bit Date: Tue, 22 Jun 2010 02:30:03 -0000 From: Jan Hubicka X-Patchwork-Id: 56467 Message-Id: <20100622123003.GB15547@kam.mff.cuni.cz> To: gcc-patches@gcc.gnu.org, rguenther@suse.de 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; }