]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: simplify hashmap tooManyOverflowBuckets
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 10 Aug 2017 15:11:46 +0000 (08:11 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 14 Aug 2017 00:51:48 +0000 (00:51 +0000)
This generates better code.

Masking B in the return statement should be unnecessary,
but the compiler is understandably not yet clever enough to see that.

Someday, it'd also be nice for the compiler to generate
a CMOV for the saturation if statement.

Change-Id: Ie1c157b21f5212610da1f3c7823a93816b3b61b9
Reviewed-on: https://go-review.googlesource.com/54656
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Martin Möhrmann <moehrmann@google.com>
src/runtime/hashmap.go

index c36ff470d6bd0c6d7844d813b901d9b6c2e7d209..676f04efd5cc33e49755bd90e2112d40952ef423 100644 (file)
@@ -995,10 +995,11 @@ func tooManyOverflowBuckets(noverflow uint16, B uint8) bool {
        // If the threshold is too high, maps that grow and shrink can hold on to lots of unused memory.
        // "too many" means (approximately) as many overflow buckets as regular buckets.
        // See incrnoverflow for more details.
-       if B < 16 {
-               return noverflow >= uint16(1)<<B
+       if B > 15 {
+               B = 15
        }
-       return noverflow >= 1<<15
+       // The compiler doesn't see here that B < 16; mask B to generate shorter shift code.
+       return noverflow >= uint16(1)<<(B&15)
 }
 
 // growing reports whether h is growing. The growth may be to the same size or bigger.