LowLevelTypeTest.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. //===- llvm/unittest/CodeGen/GlobalISel/LowLevelTypeTest.cpp --------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/CodeGen/LowLevelType.h"
  10. #include "llvm/IR/DerivedTypes.h"
  11. #include "llvm/IR/LLVMContext.h"
  12. #include "llvm/IR/Type.h"
  13. #include "gtest/gtest.h"
  14. using namespace llvm;
  15. // Define a pretty printer to help debugging when things go wrong.
  16. namespace llvm {
  17. std::ostream &
  18. operator<<(std::ostream &OS, const llvm::LLT Ty) {
  19. std::string Repr;
  20. raw_string_ostream SS{Repr};
  21. Ty.print(SS);
  22. OS << SS.str();
  23. return OS;
  24. }
  25. }
  26. namespace {
  27. TEST(LowLevelTypeTest, Scalar) {
  28. LLVMContext C;
  29. for (unsigned S : {1U, 17U, 32U, 64U, 0xfffffU}) {
  30. const LLT Ty = LLT::scalar(S);
  31. const LLT HalfTy = Ty.halfScalarSize();
  32. const LLT DoubleTy = Ty.doubleScalarSize();
  33. // Test kind.
  34. for (const LLT TestTy : {Ty, HalfTy, DoubleTy}) {
  35. ASSERT_TRUE(TestTy.isValid());
  36. ASSERT_TRUE(TestTy.isScalar());
  37. ASSERT_TRUE(TestTy.isSized());
  38. ASSERT_FALSE(TestTy.isPointer());
  39. ASSERT_FALSE(TestTy.isVector());
  40. }
  41. // Test sizes.
  42. EXPECT_EQ(S, Ty.getSizeInBits());
  43. EXPECT_EQ(S, Ty.getScalarSizeInBits());
  44. // Is it OK to half an odd-sized scalar? It currently is.
  45. EXPECT_EQ(S/2, HalfTy.getSizeInBits());
  46. EXPECT_EQ(S/2, HalfTy.getScalarSizeInBits());
  47. EXPECT_EQ(S*2, DoubleTy.getSizeInBits());
  48. EXPECT_EQ(S*2, DoubleTy.getScalarSizeInBits());
  49. // Test equality operators.
  50. EXPECT_TRUE(Ty == Ty);
  51. EXPECT_FALSE(Ty != Ty);
  52. EXPECT_NE(Ty, DoubleTy);
  53. // Test Type->LLT conversion.
  54. const Type *IRTy = IntegerType::get(C, S);
  55. EXPECT_EQ(Ty, LLT(*IRTy));
  56. }
  57. }
  58. TEST(LowLevelTypeTest, Vector) {
  59. LLVMContext C;
  60. for (unsigned S : {1U, 17U, 32U, 64U, 0xfffU}) {
  61. for (uint16_t Elts : {2U, 3U, 4U, 32U, 0xffU}) {
  62. const LLT STy = LLT::scalar(S);
  63. const LLT VTy = LLT::vector(Elts, S);
  64. // Test the alternative vector().
  65. {
  66. const LLT VSTy = LLT::vector(Elts, STy);
  67. EXPECT_EQ(VTy, VSTy);
  68. }
  69. // Test getElementType().
  70. EXPECT_EQ(STy, VTy.getElementType());
  71. const LLT HalfSzTy = VTy.halfScalarSize();
  72. const LLT DoubleSzTy = VTy.doubleScalarSize();
  73. // halfElements requires an even number of elements.
  74. const LLT HalfEltIfEvenTy = ((Elts % 2) == 0) ? VTy.halfElements() : VTy;
  75. const LLT DoubleEltTy = VTy.doubleElements();
  76. // Test kind.
  77. for (const LLT TestTy : {VTy, HalfSzTy, DoubleSzTy, DoubleEltTy}) {
  78. ASSERT_TRUE(TestTy.isValid());
  79. ASSERT_TRUE(TestTy.isSized());
  80. ASSERT_TRUE(TestTy.isVector());
  81. ASSERT_FALSE(TestTy.isScalar());
  82. ASSERT_FALSE(TestTy.isPointer());
  83. }
  84. // Test halving elements to a scalar.
  85. {
  86. ASSERT_TRUE(HalfEltIfEvenTy.isValid());
  87. ASSERT_TRUE(HalfEltIfEvenTy.isSized());
  88. ASSERT_FALSE(HalfEltIfEvenTy.isPointer());
  89. if (Elts > 2) {
  90. ASSERT_TRUE(HalfEltIfEvenTy.isVector());
  91. } else {
  92. ASSERT_FALSE(HalfEltIfEvenTy.isVector());
  93. EXPECT_EQ(STy, HalfEltIfEvenTy);
  94. }
  95. }
  96. // Test sizes.
  97. EXPECT_EQ(S * Elts, VTy.getSizeInBits());
  98. EXPECT_EQ(S, VTy.getScalarSizeInBits());
  99. EXPECT_EQ(Elts, VTy.getNumElements());
  100. EXPECT_EQ((S / 2) * Elts, HalfSzTy.getSizeInBits());
  101. EXPECT_EQ(S / 2, HalfSzTy.getScalarSizeInBits());
  102. EXPECT_EQ(Elts, HalfSzTy.getNumElements());
  103. EXPECT_EQ((S * 2) * Elts, DoubleSzTy.getSizeInBits());
  104. EXPECT_EQ(S * 2, DoubleSzTy.getScalarSizeInBits());
  105. EXPECT_EQ(Elts, DoubleSzTy.getNumElements());
  106. if ((Elts % 2) == 0) {
  107. EXPECT_EQ(S * (Elts / 2), HalfEltIfEvenTy.getSizeInBits());
  108. EXPECT_EQ(S, HalfEltIfEvenTy.getScalarSizeInBits());
  109. if (Elts > 2)
  110. EXPECT_EQ(Elts / 2, HalfEltIfEvenTy.getNumElements());
  111. }
  112. EXPECT_EQ(S * (Elts * 2), DoubleEltTy.getSizeInBits());
  113. EXPECT_EQ(S, DoubleEltTy.getScalarSizeInBits());
  114. EXPECT_EQ(Elts * 2, DoubleEltTy.getNumElements());
  115. // Test equality operators.
  116. EXPECT_TRUE(VTy == VTy);
  117. EXPECT_FALSE(VTy != VTy);
  118. // Test inequality operators on..
  119. // ..different kind.
  120. EXPECT_NE(VTy, STy);
  121. // ..different #elts.
  122. EXPECT_NE(VTy, DoubleEltTy);
  123. // ..different scalar size.
  124. EXPECT_NE(VTy, DoubleSzTy);
  125. // Test Type->LLT conversion.
  126. Type *IRSTy = IntegerType::get(C, S);
  127. const Type *IRTy = VectorType::get(IRSTy, Elts);
  128. EXPECT_EQ(VTy, LLT(*IRTy));
  129. }
  130. }
  131. }
  132. TEST(LowLevelTypeTest, Pointer) {
  133. LLVMContext C;
  134. for (unsigned AS : {0U, 1U, 127U, 0xffffU}) {
  135. const LLT Ty = LLT::pointer(AS);
  136. // Test kind.
  137. ASSERT_TRUE(Ty.isValid());
  138. ASSERT_TRUE(Ty.isPointer());
  139. ASSERT_FALSE(Ty.isSized());
  140. ASSERT_FALSE(Ty.isScalar());
  141. ASSERT_FALSE(Ty.isVector());
  142. // Test addressspace.
  143. EXPECT_EQ(AS, Ty.getAddressSpace());
  144. // Test equality operators.
  145. EXPECT_TRUE(Ty == Ty);
  146. EXPECT_FALSE(Ty != Ty);
  147. // Test Type->LLT conversion.
  148. const Type *IRTy = PointerType::get(IntegerType::get(C, 8), AS);
  149. EXPECT_EQ(Ty, LLT(*IRTy));
  150. }
  151. }
  152. TEST(LowLevelTypeTest, Invalid) {
  153. const LLT Ty;
  154. ASSERT_FALSE(Ty.isValid());
  155. ASSERT_FALSE(Ty.isScalar());
  156. ASSERT_FALSE(Ty.isSized());
  157. ASSERT_FALSE(Ty.isPointer());
  158. ASSERT_FALSE(Ty.isVector());
  159. }
  160. TEST(LowLevelTypeTest, Unsized) {
  161. LLVMContext C;
  162. const LLT Ty = LLT::unsized();
  163. ASSERT_TRUE(Ty.isValid());
  164. ASSERT_FALSE(Ty.isScalar());
  165. ASSERT_FALSE(Ty.isSized());
  166. ASSERT_FALSE(Ty.isPointer());
  167. ASSERT_FALSE(Ty.isVector());
  168. const Type *IRTy = Type::getLabelTy(C);
  169. EXPECT_EQ(Ty, LLT(*IRTy));
  170. }
  171. }