From: Guillaume Chatelet Date: Mon, 30 Sep 2019 09:59:31 +0000 (+0000) Subject: [Alignment][NFC] Adding a max function. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d4e791ab41f5e6fd3bc06f8958675860ab053b91;p=llvm [Alignment][NFC] Adding a max function. Summary: This is patch is part of a series to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Reviewers: courbet Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68201 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373196 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/Alignment.h b/include/llvm/Support/Alignment.h index c90d8d72d44..3d8a4235b0e 100644 --- a/include/llvm/Support/Alignment.h +++ b/include/llvm/Support/Alignment.h @@ -333,6 +333,14 @@ inline MaybeAlign operator/(MaybeAlign Lhs, uint64_t Divisor) { return Lhs ? Lhs.getValue() / Divisor : MaybeAlign(); } +inline Align max(MaybeAlign Lhs, Align Rhs) { + return Lhs && *Lhs > Rhs ? *Lhs : Rhs; +} + +inline Align max(Align Lhs, MaybeAlign Rhs) { + return Rhs && *Rhs > Lhs ? *Rhs : Lhs; +} + #undef ALIGN_CHECK_ISPOSITIVE #undef ALIGN_CHECK_ISSET diff --git a/unittests/Support/AlignmentTest.cpp b/unittests/Support/AlignmentTest.cpp index f9cc27b8f42..0b1435912b9 100644 --- a/unittests/Support/AlignmentTest.cpp +++ b/unittests/Support/AlignmentTest.cpp @@ -227,6 +227,29 @@ TEST(AlignmentTest, AlignComparisons) { } } +TEST(AlignmentTest, Max) { + // We introduce std::max here to test ADL. + using std::max; + + // Uses llvm::max. + EXPECT_EQ(max(MaybeAlign(), Align(2)), Align(2)); + EXPECT_EQ(max(Align(2), MaybeAlign()), Align(2)); + + EXPECT_EQ(max(MaybeAlign(1), Align(2)), Align(2)); + EXPECT_EQ(max(Align(2), MaybeAlign(1)), Align(2)); + + EXPECT_EQ(max(MaybeAlign(2), Align(2)), Align(2)); + EXPECT_EQ(max(Align(2), MaybeAlign(2)), Align(2)); + + EXPECT_EQ(max(MaybeAlign(4), Align(2)), Align(4)); + EXPECT_EQ(max(Align(2), MaybeAlign(4)), Align(4)); + + // Uses std::max. + EXPECT_EQ(max(Align(2), Align(4)), Align(4)); + EXPECT_EQ(max(MaybeAlign(2), MaybeAlign(4)), MaybeAlign(4)); + EXPECT_EQ(max(MaybeAlign(), MaybeAlign()), MaybeAlign()); +} + TEST(AlignmentTest, AssumeAligned) { EXPECT_EQ(assumeAligned(0), Align(1)); EXPECT_EQ(assumeAligned(0), Align());