[sanitizer] SizeClassMap minor improvement/correctness changes
Summary: In `ClassID`, make sure we use an unsigned as based for the `lbits` shift. The previous code resulted in spurious sign extensions like for x64: ``` add esi, 0FFFFFFFFh movsxd rcx, esi and rcx, r15 ``` The code with the `U` added is: ``` add esi, 0FFFFFFFFh and rsi, r15 ``` And for `MaxCachedHint`, use a 32-bit division instead of `64-bit`, which is faster (https://lemire.me/blog/2017/11/16/fast-exact-integer-divisions-using-floating-point-operations/) and already used in other parts of the code (64-bit `GetChunkIdx`, 32-bit `GetMetaData` enforce 32-bit divisions) Not major performance gains by any mean, but they don't hurt. Reviewers: alekseyshl Reviewed By: alekseyshl Subscribers: kubamracek, delcypher, llvm-commits, #sanitizers Differential Revision: https://reviews.llvm.org/D42916 llvm-svn: 324263
This commit is contained in:
		
							parent
							
								
									e80ce52cee
								
							
						
					
					
						commit
						d6f7a65197
					
				| 
						 | 
					@ -163,7 +163,7 @@ class SizeClassMap {
 | 
				
			||||||
      return (size + kMinSize - 1) >> kMinSizeLog;
 | 
					      return (size + kMinSize - 1) >> kMinSizeLog;
 | 
				
			||||||
    uptr l = MostSignificantSetBitIndex(size);
 | 
					    uptr l = MostSignificantSetBitIndex(size);
 | 
				
			||||||
    uptr hbits = (size >> (l - S)) & M;
 | 
					    uptr hbits = (size >> (l - S)) & M;
 | 
				
			||||||
    uptr lbits = size & ((1 << (l - S)) - 1);
 | 
					    uptr lbits = size & ((1U << (l - S)) - 1);
 | 
				
			||||||
    uptr l1 = l - kMidSizeLog;
 | 
					    uptr l1 = l - kMidSizeLog;
 | 
				
			||||||
    return kMidClass + (l1 << S) + hbits + (lbits > 0);
 | 
					    return kMidClass + (l1 << S) + hbits + (lbits > 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -176,7 +176,8 @@ class SizeClassMap {
 | 
				
			||||||
      return 16;
 | 
					      return 16;
 | 
				
			||||||
    if (UNLIKELY(class_id == 0))
 | 
					    if (UNLIKELY(class_id == 0))
 | 
				
			||||||
      return 0;
 | 
					      return 0;
 | 
				
			||||||
    uptr n = (1UL << kMaxBytesCachedLog) / Size(class_id);
 | 
					    const uptr n =
 | 
				
			||||||
 | 
					        (1U << kMaxBytesCachedLog) / static_cast<u32>(Size(class_id));
 | 
				
			||||||
    return Max<uptr>(1, Min(kMaxNumCachedHint, n));
 | 
					    return Max<uptr>(1, Min(kMaxNumCachedHint, n));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue