]> granicus.if.org Git - llvm/commitdiff
[Alignment][NFC] Adding a max function.
authorGuillaume Chatelet <gchatelet@google.com>
Mon, 30 Sep 2019 09:59:31 +0000 (09:59 +0000)
committerGuillaume Chatelet <gchatelet@google.com>
Mon, 30 Sep 2019 09:59:31 +0000 (09:59 +0000)
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

include/llvm/Support/Alignment.h
unittests/Support/AlignmentTest.cpp

index c90d8d72d44cbc153a5d48ca61b594eb3caf63a0..3d8a4235b0e654ad5fb677b43eb32fab82734cb3 100644 (file)
@@ -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
 
index f9cc27b8f423b3312e2d9232a246c74d84f8cf45..0b1435912b93020bd576007a89126f4645952fc9 100644 (file)
@@ -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());