[Alignment][NFC] Optimize alignTo
authorGuillaume Chatelet <gchatelet@google.com>
Wed, 16 Oct 2019 13:06:17 +0000 (13:06 +0000)
committerGuillaume Chatelet <gchatelet@google.com>
Wed, 16 Oct 2019 13:06:17 +0000 (13:06 +0000)
Summary: A small optimization suggested by jakehehrlich@ in D64790.

Reviewers: jakehehrlich, courbet

Subscribers: llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69023

llvm-svn: 375000

llvm/include/llvm/Support/Alignment.h

index d86f4cc..6925cb5 100644 (file)
@@ -161,7 +161,17 @@ inline bool isAddrAligned(Align Lhs, const void *Addr) {
 
 /// Returns a multiple of A needed to store `Size` bytes.
 inline uint64_t alignTo(uint64_t Size, Align A) {
-  return (Size + A.value() - 1) / A.value() * A.value();
+  const uint64_t value = A.value();
+  // The following line is equivalent to `(Size + value - 1) / value * value`.
+
+  // The division followed by a multiplication can be thought of as a right
+  // shift followed by a left shift which zeros out the extra bits produced in
+  // the bump; `~(value - 1)` is a mask where all those bits being zeroed out
+  // are just zero.
+
+  // Most compilers can generate this code but the pattern may be missed when
+  // multiple functions gets inlined.
+  return (Size + value - 1) & ~(value - 1);
 }
 
 /// Returns a multiple of A needed to store `Size` bytes.