forked from OSchip/llvm-project
[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:
parent
0caee27620
commit
2f6da767f1
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue