diff --git a/llvm/include/llvm/Support/Alignment.h b/llvm/include/llvm/Support/Alignment.h --- a/llvm/include/llvm/Support/Alignment.h +++ b/llvm/include/llvm/Support/Alignment.h @@ -333,6 +333,14 @@ 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/llvm/unittests/Support/AlignmentTest.cpp b/llvm/unittests/Support/AlignmentTest.cpp --- a/llvm/unittests/Support/AlignmentTest.cpp +++ b/llvm/unittests/Support/AlignmentTest.cpp @@ -227,6 +227,20 @@ } } +TEST(AlignmentTest, 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)); +} + TEST(AlignmentTest, AssumeAligned) { EXPECT_EQ(assumeAligned(0), Align(1)); EXPECT_EQ(assumeAligned(0), Align());