diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-26 01:42:13 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-26 01:42:13 +0000 |
commit | cdc201fcdea869c6bd6290bd2611714eb195db0c (patch) | |
tree | dc09b2b6c7a60f8379495edf412ffa4bfd5e8256 /llvm/unittests/CodeGen | |
parent | bb01a098b15f1a87fee0f8882c28e6b2141eadda (diff) | |
download | bcm5719-llvm-cdc201fcdea869c6bd6290bd2611714eb195db0c.tar.gz bcm5719-llvm-cdc201fcdea869c6bd6290bd2611714eb195db0c.zip |
GlobalISel: Fix address space limit in LLT
The IR enforced limit for the address space is 24-bits, but LLT was
only using 23-bits. Additionally, the argument to the constructor was
truncating to 16-bits.
A similar problem still exists for the number of vector elements. The
IR enforces no limit, so if you try to use a vector with > 65535
elements the IRTranslator asserts in the LLT constructor.
llvm-svn: 352264
Diffstat (limited to 'llvm/unittests/CodeGen')
-rw-r--r-- | llvm/unittests/CodeGen/LowLevelTypeTest.cpp | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp index 684a2cfd395..cc9a7f04ef6 100644 --- a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp +++ b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp @@ -120,39 +120,46 @@ TEST(LowLevelTypeTest, ScalarOrVector) { TEST(LowLevelTypeTest, Pointer) { LLVMContext C; - DataLayout DL(""); + DataLayout DL("p64:64:64-p127:512:512:512-p16777215:65528:8"); - for (unsigned AS : {0U, 1U, 127U, 0xffffU}) { - const LLT Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS)); - const LLT VTy = LLT::vector(4, Ty); + for (unsigned AS : {0U, 1U, 127U, 0xffffU, + static_cast<unsigned>(maxUIntN(23)), + static_cast<unsigned>(maxUIntN(24))}) { + for (unsigned NumElts : {2, 3, 4, 256, 65535}) { + const LLT Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS)); + const LLT VTy = LLT::vector(NumElts, Ty); - // Test kind. - ASSERT_TRUE(Ty.isValid()); - ASSERT_TRUE(Ty.isPointer()); + // Test kind. + ASSERT_TRUE(Ty.isValid()); + ASSERT_TRUE(Ty.isPointer()); - ASSERT_FALSE(Ty.isScalar()); - ASSERT_FALSE(Ty.isVector()); + ASSERT_FALSE(Ty.isScalar()); + ASSERT_FALSE(Ty.isVector()); - ASSERT_TRUE(VTy.isValid()); - ASSERT_TRUE(VTy.isVector()); - ASSERT_TRUE(VTy.getElementType().isPointer()); + ASSERT_TRUE(VTy.isValid()); + ASSERT_TRUE(VTy.isVector()); + ASSERT_TRUE(VTy.getElementType().isPointer()); - // Test addressspace. - EXPECT_EQ(AS, Ty.getAddressSpace()); - EXPECT_EQ(AS, VTy.getElementType().getAddressSpace()); + EXPECT_EQ(Ty, VTy.getElementType()); + EXPECT_EQ(Ty.getSizeInBits(), VTy.getScalarSizeInBits()); - // Test equality operators. - EXPECT_TRUE(Ty == Ty); - EXPECT_FALSE(Ty != Ty); - EXPECT_TRUE(VTy == VTy); - EXPECT_FALSE(VTy != VTy); + // Test address space. + EXPECT_EQ(AS, Ty.getAddressSpace()); + EXPECT_EQ(AS, VTy.getElementType().getAddressSpace()); - // Test Type->LLT conversion. - Type *IRTy = PointerType::get(IntegerType::get(C, 8), AS); - EXPECT_EQ(Ty, getLLTForType(*IRTy, DL)); - Type *IRVTy = - VectorType::get(PointerType::get(IntegerType::get(C, 8), AS), 4); - EXPECT_EQ(VTy, getLLTForType(*IRVTy, DL)); + // Test equality operators. + EXPECT_TRUE(Ty == Ty); + EXPECT_FALSE(Ty != Ty); + EXPECT_TRUE(VTy == VTy); + EXPECT_FALSE(VTy != VTy); + + // Test Type->LLT conversion. + Type *IRTy = PointerType::get(IntegerType::get(C, 8), AS); + EXPECT_EQ(Ty, getLLTForType(*IRTy, DL)); + Type *IRVTy = + VectorType::get(PointerType::get(IntegerType::get(C, 8), AS), NumElts); + EXPECT_EQ(VTy, getLLTForType(*IRVTy, DL)); + } } } |