aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbart <bart@a5019735-40e9-0310-863c-91ae7b9d1cf9>2009-04-24 14:49:50 +0000
committerbart <bart@a5019735-40e9-0310-863c-91ae7b9d1cf9>2009-04-24 14:49:50 +0000
commit25a439a019a91500666e54e8b8f5a6a9c820ab30 (patch)
treee7435516676aa9790b1bd62c7b42311ff692b16c
parentb9acfbed9322db02f0a5d6171326390c730a6bd8 (diff)
downloadvalgrind-25a439a019a91500666e54e8b8f5a6a9c820ab30.tar.gz
Minor optimization: eliminated one if statement from each bm_clear*() function.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9609 a5019735-40e9-0310-863c-91ae7b9d1cf9
-rw-r--r--drd/drd_bitmap.c134
-rw-r--r--drd/drd_bitmap.h4
2 files changed, 68 insertions, 70 deletions
diff --git a/drd/drd_bitmap.c b/drd/drd_bitmap.c
index a70a7e07f..75ad65833 100644
--- a/drd/drd_bitmap.c
+++ b/drd/drd_bitmap.c
@@ -489,38 +489,42 @@ void DRD_(bm_clear)(struct bitmap* const bm, const Addr a1, const Addr a2)
/* start on an UWord boundary, start clearing the first addresses. */
if (UWORD_LSB(c))
{
- Addr c_next = UWORD_MSB(c) + BITS_PER_UWORD;
- if (c_next > b_next)
- c_next = b_next;
- bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, c_next - c);
- bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, c_next - c);
- c = c_next;
+ Addr c_next = UWORD_MSB(c) + BITS_PER_UWORD;
+ if (c_next > b_next)
+ c_next = b_next;
+#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
+ tl_assert(a1 <= b && b <= c && c <= c_next && c_next <= b_next
+ && b_next <= a2);
+#endif
+ bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, c_next - c);
+ bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, c_next - c);
+ c = c_next;
}
/* If some UWords have to be cleared entirely, do this now. */
if (UWORD_LSB(c) == 0)
{
- const Addr c_next = UWORD_MSB(b_next);
+ const Addr c_next = UWORD_MSB(b_next);
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
- tl_assert(UWORD_LSB(c) == 0);
- tl_assert(UWORD_LSB(c_next) == 0);
- tl_assert(c_next <= b_next);
- tl_assert(c <= c_next);
+ tl_assert(UWORD_LSB(c) == 0);
+ tl_assert(UWORD_LSB(c_next) == 0);
+ tl_assert(c_next <= b_next);
+ tl_assert(c <= c_next);
#endif
- if (c_next > c)
- {
- UWord idx = (c & ADDR0_MASK) >> BITS_PER_BITS_PER_UWORD;
- VG_(memset)(&p2->bm1.bm0_r[idx], 0, (c_next - c) / 8);
- VG_(memset)(&p2->bm1.bm0_w[idx], 0, (c_next - c) / 8);
- c = c_next;
- }
+ if (c_next > c)
+ {
+ UWord idx = (c & ADDR0_MASK) >> BITS_PER_BITS_PER_UWORD;
+ VG_(memset)(&p2->bm1.bm0_r[idx], 0, (c_next - c) / 8);
+ VG_(memset)(&p2->bm1.bm0_w[idx], 0, (c_next - c) / 8);
+ c = c_next;
+ }
}
/* If the last address in the bitmap that must be cleared does not */
/* fall on an UWord boundary, clear the last addresses. */
- if (c < b_next)
- {
- bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, b_next - c);
- bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, b_next - c);
- }
+#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
+ tl_assert(a1 <= b && b <= c && c <= b_next && b_next <= a2);
+#endif
+ bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, b_next - c);
+ bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, b_next - c);
}
}
@@ -570,15 +574,15 @@ void DRD_(bm_clear_load)(struct bitmap* const bm, const Addr a1, const Addr a2)
#endif
if (UWORD_LSB(c))
{
- Addr c_next = UWORD_MSB(c) + BITS_PER_UWORD;
- if (c_next > b_next)
- c_next = b_next;
+ Addr c_next = UWORD_MSB(c) + BITS_PER_UWORD;
+ if (c_next > b_next)
+ c_next = b_next;
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
- tl_assert(a1 <= b && b <= c && c < c_next && c_next <= b_next
- && b_next <= a2);
+ tl_assert(a1 <= b && b <= c && c < c_next && c_next <= b_next
+ && b_next <= a2);
#endif
- bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, c_next - c);
- c = c_next;
+ bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, c_next - c);
+ c = c_next;
}
/* If some UWords have to be cleared entirely, do this now. */
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
@@ -586,29 +590,26 @@ void DRD_(bm_clear_load)(struct bitmap* const bm, const Addr a1, const Addr a2)
#endif
if (UWORD_LSB(c) == 0)
{
- const Addr c_next = UWORD_MSB(b_next);
+ const Addr c_next = UWORD_MSB(b_next);
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
- tl_assert(UWORD_LSB(c) == 0);
- tl_assert(UWORD_LSB(c_next) == 0);
- tl_assert(a1 <= b && b <= c && c <= c_next && c_next <= b_next
- && b_next <= a2);
+ tl_assert(UWORD_LSB(c) == 0);
+ tl_assert(UWORD_LSB(c_next) == 0);
+ tl_assert(a1 <= b && b <= c && c <= c_next && c_next <= b_next
+ && b_next <= a2);
#endif
- if (c_next > c)
- {
- UWord idx = (c & ADDR0_MASK) >> BITS_PER_BITS_PER_UWORD;
- VG_(memset)(&p2->bm1.bm0_r[idx], 0, (c_next - c) / 8);
- c = c_next;
- }
+ if (c_next > c)
+ {
+ UWord idx = (c & ADDR0_MASK) >> BITS_PER_BITS_PER_UWORD;
+ VG_(memset)(&p2->bm1.bm0_r[idx], 0, (c_next - c) / 8);
+ c = c_next;
+ }
}
/* If the last address in the bitmap that must be cleared does not */
/* fall on an UWord boundary, clear the last addresses. */
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
tl_assert(a1 <= b && b <= c && c <= b_next && b_next <= a2);
#endif
- if (c < b_next)
- {
- bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, b_next - c);
- }
+ bm0_clear_range(p2->bm1.bm0_r, c & ADDR0_MASK, b_next - c);
}
}
@@ -645,7 +646,7 @@ void DRD_(bm_clear_store)(struct bitmap* const bm,
b_next = (b & ~ADDR0_MASK) + ADDR0_COUNT;
if (b_next > a2)
{
- b_next = a2;
+ b_next = a2;
}
if (p2 == 0)
@@ -659,15 +660,15 @@ void DRD_(bm_clear_store)(struct bitmap* const bm,
#endif
if (UWORD_LSB(c))
{
- Addr c_next = UWORD_MSB(c) + BITS_PER_UWORD;
- if (c_next > b_next)
- c_next = b_next;
+ Addr c_next = UWORD_MSB(c) + BITS_PER_UWORD;
+ if (c_next > b_next)
+ c_next = b_next;
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
- tl_assert(a1 <= b && b <= c && c < c_next && c_next <= b_next
- && b_next <= a2);
+ tl_assert(a1 <= b && b <= c && c < c_next && c_next <= b_next
+ && b_next <= a2);
#endif
- bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, c_next - c);
- c = c_next;
+ bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, c_next - c);
+ c = c_next;
}
/* If some UWords have to be cleared entirely, do this now. */
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
@@ -675,29 +676,26 @@ void DRD_(bm_clear_store)(struct bitmap* const bm,
#endif
if (UWORD_LSB(c) == 0)
{
- const Addr c_next = UWORD_MSB(b_next);
+ const Addr c_next = UWORD_MSB(b_next);
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
- tl_assert(UWORD_LSB(c) == 0);
- tl_assert(UWORD_LSB(c_next) == 0);
- tl_assert(a1 <= b && b <= c && c <= c_next && c_next <= b_next
- && b_next <= a2);
+ tl_assert(UWORD_LSB(c) == 0);
+ tl_assert(UWORD_LSB(c_next) == 0);
+ tl_assert(a1 <= b && b <= c && c <= c_next && c_next <= b_next
+ && b_next <= a2);
#endif
- if (c_next > c)
- {
- UWord idx = (c & ADDR0_MASK) >> BITS_PER_BITS_PER_UWORD;
- VG_(memset)(&p2->bm1.bm0_w[idx], 0, (c_next - c) / 8);
- c = c_next;
- }
+ if (c_next > c)
+ {
+ UWord idx = (c & ADDR0_MASK) >> BITS_PER_BITS_PER_UWORD;
+ VG_(memset)(&p2->bm1.bm0_w[idx], 0, (c_next - c) / 8);
+ c = c_next;
+ }
}
/* If the last address in the bitmap that must be cleared does not */
/* fall on an UWord boundary, clear the last addresses. */
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
tl_assert(a1 <= b && b <= c && c <= b_next && b_next <= a2);
#endif
- if (c < b_next)
- {
- bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, b_next - c);
- }
+ bm0_clear_range(p2->bm1.bm0_w, c & ADDR0_MASK, b_next - c);
}
}
diff --git a/drd/drd_bitmap.h b/drd/drd_bitmap.h
index 1689435df..0043cdcad 100644
--- a/drd/drd_bitmap.h
+++ b/drd/drd_bitmap.h
@@ -137,9 +137,9 @@ static __inline__ void bm0_clear_range(UWord* bm0,
{
#ifdef ENABLE_DRD_CONSISTENCY_CHECKS
tl_assert(a1 < ADDR0_COUNT);
- tl_assert(size > 0);
+ tl_assert(size >= 0);
tl_assert(a1 + size <= ADDR0_COUNT);
- tl_assert(UWORD_MSB(a1) == UWORD_MSB(a1 + size - 1));
+ tl_assert(size == 0 || UWORD_MSB(a1) == UWORD_MSB(a1 + size - 1));
#endif
bm0[a1 >> BITS_PER_BITS_PER_UWORD]
&= ~((((UWord)1 << size) - 1) << UWORD_LSB(a1));