From b7fd1834a383b3eac23b4c5facb9bb82338113cf Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Wed, 16 Oct 2019 13:06:17 +0000 Subject: [PATCH] [Alignment][NFC] Optimize alignTo Summary: A small optimization suggested by jakehehrlich@ in D64790. Reviewers: jakehehrlich, courbet Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69023 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375000 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/Alignment.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/include/llvm/Support/Alignment.h b/include/llvm/Support/Alignment.h index d86f4cce429..6925cb52d00 100644 --- a/include/llvm/Support/Alignment.h +++ b/include/llvm/Support/Alignment.h @@ -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. -- 2.11.4.GIT