diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ed23714c4b..af309768113 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,9 @@ * cfgrtl.c (try_redirect_by_replacing_jump): Speed up the check that tests if all edges go to the same destination. + * bitmap.c (bitmap_find_bit): Speed up by traversing from + head->first if that seems profitable. + 2004-11-25 Jeff Law * timevar.def (TV_TREE_LOOP_INIT, TV_TREE_LOOP_FINI): New timevars. diff --git a/gcc/bitmap.c b/gcc/bitmap.c index f633505eeba..140dd007e79 100644 --- a/gcc/bitmap.c +++ b/gcc/bitmap.c @@ -401,14 +401,26 @@ bitmap_find_bit (bitmap head, unsigned int bit) || head->indx == indx) return head->current; - if (head->indx > indx) + if (head->indx < indx) + /* INDX is beyond head->indx. Search from head->current + forward. */ + for (element = head->current; + element->next != 0 && element->indx < indx; + element = element->next) + ; + + else if (head->indx / 2 < indx) + /* INDX is less than head->indx and closer to head->indx than to + 0. Search from head->current backward. */ for (element = head->current; element->prev != 0 && element->indx > indx; element = element->prev) ; else - for (element = head->current; + /* INDX is less than head->indx and closer to 0 than to + head->indx. Search from head->first forward. */ + for (element = head->first; element->next != 0 && element->indx < indx; element = element->next) ;