From 7dbf8cfeb75e438365fbf27aee788cda98aea293 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Mon, 20 Jun 2022 14:09:55 +0000 Subject: [PATCH] [NFC] Implement alignTo with skew in terms of alignTo --- llvm/include/llvm/Support/Alignment.h | 2 +- llvm/include/llvm/Support/MathExtras.h | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/Support/Alignment.h b/llvm/include/llvm/Support/Alignment.h index f12d8ed..abc1284 100644 --- a/llvm/include/llvm/Support/Alignment.h +++ b/llvm/include/llvm/Support/Alignment.h @@ -181,7 +181,7 @@ inline uint64_t alignTo(uint64_t Size, Align A) { inline uint64_t alignTo(uint64_t Size, Align A, uint64_t Skew) { const uint64_t Value = A.value(); Skew %= Value; - return ((Size + Value - 1 - Skew) & ~(Value - 1U)) + Skew; + return alignTo(Size - Skew, A) + Skew; } /// Returns a multiple of A needed to store `Size` bytes. diff --git a/llvm/include/llvm/Support/MathExtras.h b/llvm/include/llvm/Support/MathExtras.h index 8c2f2af1..8079aa4 100644 --- a/llvm/include/llvm/Support/MathExtras.h +++ b/llvm/include/llvm/Support/MathExtras.h @@ -735,27 +735,34 @@ inline uint64_t PowerOf2Ceil(uint64_t A) { /// Returns the next integer (mod 2**64) that is greater than or equal to /// \p Value and is a multiple of \p Align. \p Align must be non-zero. /// -/// If non-zero \p Skew is specified, the return value will be a minimal -/// integer that is greater than or equal to \p Value and equal to -/// \p Align * N + \p Skew for some integer N. If \p Skew is larger than -/// \p Align, its value is adjusted to '\p Skew mod \p Align'. -/// /// Examples: /// \code /// alignTo(5, 8) = 8 /// alignTo(17, 8) = 24 /// alignTo(~0LL, 8) = 0 /// alignTo(321, 255) = 510 +/// \endcode +inline uint64_t alignTo(uint64_t Value, uint64_t Align) { + assert(Align != 0u && "Align can't be 0."); + return (Value + Align - 1) / Align * Align; +} + +/// If non-zero \p Skew is specified, the return value will be a minimal integer +/// that is greater than or equal to \p Size and equal to \p A * N + \p Skew for +/// some integer N. If \p Skew is larger than \p A, its value is adjusted to '\p +/// Skew mod \p A'. \p Align must be non-zero. /// +/// Examples: +/// \code /// alignTo(5, 8, 7) = 7 /// alignTo(17, 8, 1) = 17 /// alignTo(~0LL, 8, 3) = 3 /// alignTo(321, 255, 42) = 552 /// \endcode -inline uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew = 0) { +inline uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew) { assert(Align != 0u && "Align can't be 0."); Skew %= Align; - return (Value + Align - 1 - Skew) / Align * Align + Skew; + return alignTo(Value - Skew, Align) + Skew; } /// Returns the next integer (mod 2**64) that is greater than or equal to -- 2.7.4