From 2f6da767f13b8fd81f840c211d405fea32ac9db7 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 llvm-svn: 375000 --- llvm/include/llvm/Support/Alignment.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/Support/Alignment.h b/llvm/include/llvm/Support/Alignment.h index d86f4cc..6925cb5 100644 --- a/llvm/include/llvm/Support/Alignment.h +++ b/llvm/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.7.4