Index: llvm/trunk/include/llvm/Support/Alignment.h =================================================================== --- llvm/trunk/include/llvm/Support/Alignment.h +++ llvm/trunk/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 Index: llvm/trunk/unittests/Support/AlignmentTest.cpp =================================================================== --- llvm/trunk/unittests/Support/AlignmentTest.cpp +++ llvm/trunk/unittests/Support/AlignmentTest.cpp @@ -227,6 +227,29 @@ } } +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());