LowLevelTypeTest.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. //===- llvm/unittest/CodeGen/GlobalISel/LowLevelTypeTest.cpp --------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/CodeGen/LowLevelType.h"
  9. #include "llvm/IR/DataLayout.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. namespace {
  16. TEST(LowLevelTypeTest, Scalar) {
  17. LLVMContext C;
  18. DataLayout DL("");
  19. for (unsigned S : {1U, 17U, 32U, 64U, 0xfffffU}) {
  20. const LLT Ty = LLT::scalar(S);
  21. // Test kind.
  22. ASSERT_TRUE(Ty.isValid());
  23. ASSERT_TRUE(Ty.isScalar());
  24. ASSERT_FALSE(Ty.isPointer());
  25. ASSERT_FALSE(Ty.isVector());
  26. // Test sizes.
  27. EXPECT_EQ(S, Ty.getSizeInBits());
  28. EXPECT_EQ(S, Ty.getScalarSizeInBits());
  29. // Test equality operators.
  30. EXPECT_TRUE(Ty == Ty);
  31. EXPECT_FALSE(Ty != Ty);
  32. // Test Type->LLT conversion.
  33. Type *IRTy = IntegerType::get(C, S);
  34. EXPECT_EQ(Ty, getLLTForType(*IRTy, DL));
  35. }
  36. }
  37. TEST(LowLevelTypeTest, Vector) {
  38. LLVMContext C;
  39. DataLayout DL("");
  40. for (unsigned S : {1U, 17U, 32U, 64U, 0xfffU}) {
  41. for (uint16_t Elts : {2U, 3U, 4U, 32U, 0xffU}) {
  42. const LLT STy = LLT::scalar(S);
  43. const LLT VTy = LLT::vector(Elts, S);
  44. // Test the alternative vector().
  45. {
  46. const LLT VSTy = LLT::vector(Elts, STy);
  47. EXPECT_EQ(VTy, VSTy);
  48. }
  49. // Test getElementType().
  50. EXPECT_EQ(STy, VTy.getElementType());
  51. // Test kind.
  52. ASSERT_TRUE(VTy.isValid());
  53. ASSERT_TRUE(VTy.isVector());
  54. ASSERT_FALSE(VTy.isScalar());
  55. ASSERT_FALSE(VTy.isPointer());
  56. // Test sizes.
  57. EXPECT_EQ(S * Elts, VTy.getSizeInBits());
  58. EXPECT_EQ(S, VTy.getScalarSizeInBits());
  59. EXPECT_EQ(Elts, VTy.getNumElements());
  60. // Test equality operators.
  61. EXPECT_TRUE(VTy == VTy);
  62. EXPECT_FALSE(VTy != VTy);
  63. // Test inequality operators on..
  64. // ..different kind.
  65. EXPECT_NE(VTy, STy);
  66. // Test Type->LLT conversion.
  67. Type *IRSTy = IntegerType::get(C, S);
  68. Type *IRTy = VectorType::get(IRSTy, Elts);
  69. EXPECT_EQ(VTy, getLLTForType(*IRTy, DL));
  70. }
  71. }
  72. }
  73. TEST(LowLevelTypeTest, ScalarOrVector) {
  74. // Test version with number of bits for scalar type.
  75. EXPECT_EQ(LLT::scalar(32), LLT::scalarOrVector(1, 32));
  76. EXPECT_EQ(LLT::vector(2, 32), LLT::scalarOrVector(2, 32));
  77. // Test version with LLT for scalar type.
  78. EXPECT_EQ(LLT::scalar(32), LLT::scalarOrVector(1, LLT::scalar(32)));
  79. EXPECT_EQ(LLT::vector(2, 32), LLT::scalarOrVector(2, LLT::scalar(32)));
  80. // Test with pointer elements.
  81. EXPECT_EQ(LLT::pointer(1, 32), LLT::scalarOrVector(1, LLT::pointer(1, 32)));
  82. EXPECT_EQ(LLT::vector(2, LLT::pointer(1, 32)),
  83. LLT::scalarOrVector(2, LLT::pointer(1, 32)));
  84. }
  85. TEST(LowLevelTypeTest, ChangeElementType) {
  86. const LLT P0 = LLT::pointer(0, 32);
  87. const LLT P1 = LLT::pointer(1, 64);
  88. const LLT S32 = LLT::scalar(32);
  89. const LLT S64 = LLT::scalar(64);
  90. const LLT V2S32 = LLT::vector(2, 32);
  91. const LLT V2S64 = LLT::vector(2, 64);
  92. const LLT V2P0 = LLT::vector(2, P0);
  93. const LLT V2P1 = LLT::vector(2, P1);
  94. EXPECT_EQ(S64, S32.changeElementType(S64));
  95. EXPECT_EQ(S32, S32.changeElementType(S32));
  96. EXPECT_EQ(S32, S64.changeElementSize(32));
  97. EXPECT_EQ(S32, S32.changeElementSize(32));
  98. EXPECT_EQ(V2S64, V2S32.changeElementType(S64));
  99. EXPECT_EQ(V2S32, V2S64.changeElementType(S32));
  100. EXPECT_EQ(V2S64, V2S32.changeElementSize(64));
  101. EXPECT_EQ(V2S32, V2S64.changeElementSize(32));
  102. EXPECT_EQ(P0, S32.changeElementType(P0));
  103. EXPECT_EQ(S32, P0.changeElementType(S32));
  104. EXPECT_EQ(V2P1, V2P0.changeElementType(P1));
  105. EXPECT_EQ(V2S32, V2P0.changeElementType(S32));
  106. }
  107. #ifdef GTEST_HAS_DEATH_TEST
  108. #ifndef NDEBUG
  109. // Invalid to directly change the element size for pointers.
  110. TEST(LowLevelTypeTest, ChangeElementTypeDeath) {
  111. const LLT P0 = LLT::pointer(0, 32);
  112. const LLT V2P0 = LLT::vector(2, P0);
  113. EXPECT_DEATH(P0.changeElementSize(64),
  114. "invalid to directly change element size for pointers");
  115. EXPECT_DEATH(V2P0.changeElementSize(64),
  116. "invalid to directly change element size for pointers");
  117. // Make sure this still fails even without a change in size.
  118. EXPECT_DEATH(P0.changeElementSize(32),
  119. "invalid to directly change element size for pointers");
  120. EXPECT_DEATH(V2P0.changeElementSize(32),
  121. "invalid to directly change element size for pointers");
  122. }
  123. #endif
  124. #endif
  125. TEST(LowLevelTypeTest, Pointer) {
  126. LLVMContext C;
  127. DataLayout DL("p64:64:64-p127:512:512:512-p16777215:65528:8");
  128. for (unsigned AS : {0U, 1U, 127U, 0xffffU,
  129. static_cast<unsigned>(maxUIntN(23)),
  130. static_cast<unsigned>(maxUIntN(24))}) {
  131. for (unsigned NumElts : {2, 3, 4, 256, 65535}) {
  132. const LLT Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
  133. const LLT VTy = LLT::vector(NumElts, Ty);
  134. // Test kind.
  135. ASSERT_TRUE(Ty.isValid());
  136. ASSERT_TRUE(Ty.isPointer());
  137. ASSERT_FALSE(Ty.isScalar());
  138. ASSERT_FALSE(Ty.isVector());
  139. ASSERT_TRUE(VTy.isValid());
  140. ASSERT_TRUE(VTy.isVector());
  141. ASSERT_TRUE(VTy.getElementType().isPointer());
  142. EXPECT_EQ(Ty, VTy.getElementType());
  143. EXPECT_EQ(Ty.getSizeInBits(), VTy.getScalarSizeInBits());
  144. // Test address space.
  145. EXPECT_EQ(AS, Ty.getAddressSpace());
  146. EXPECT_EQ(AS, VTy.getElementType().getAddressSpace());
  147. // Test equality operators.
  148. EXPECT_TRUE(Ty == Ty);
  149. EXPECT_FALSE(Ty != Ty);
  150. EXPECT_TRUE(VTy == VTy);
  151. EXPECT_FALSE(VTy != VTy);
  152. // Test Type->LLT conversion.
  153. Type *IRTy = PointerType::get(IntegerType::get(C, 8), AS);
  154. EXPECT_EQ(Ty, getLLTForType(*IRTy, DL));
  155. Type *IRVTy =
  156. VectorType::get(PointerType::get(IntegerType::get(C, 8), AS), NumElts);
  157. EXPECT_EQ(VTy, getLLTForType(*IRVTy, DL));
  158. }
  159. }
  160. }
  161. TEST(LowLevelTypeTest, Invalid) {
  162. const LLT Ty;
  163. ASSERT_FALSE(Ty.isValid());
  164. ASSERT_FALSE(Ty.isScalar());
  165. ASSERT_FALSE(Ty.isPointer());
  166. ASSERT_FALSE(Ty.isVector());
  167. }
  168. }