[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
This commit is contained in:
Guillaume Chatelet 2019-10-16 13:06:17 +00:00
parent 0caee27620
commit 2f6da767f1
1 changed files with 11 additions and 1 deletions

View 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.