From: Tim Northover Date: Thu, 4 Aug 2016 20:54:05 +0000 (+0000) Subject: GlobalISel: refuse to halve size of 1-byte & odd-sized LLTs. X-Git-Tag: llvmorg-4.0.0-rc1~13293 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=404f1b7db566651464efbc6aa2a195bc444e3ba2;p=platform%2Fupstream%2Fllvm.git GlobalISel: refuse to halve size of 1-byte & odd-sized LLTs. llvm-svn: 277768 --- diff --git a/llvm/include/llvm/CodeGen/LowLevelType.h b/llvm/include/llvm/CodeGen/LowLevelType.h index 4d21a15..34210f2 100644 --- a/llvm/include/llvm/CodeGen/LowLevelType.h +++ b/llvm/include/llvm/CodeGen/LowLevelType.h @@ -131,7 +131,8 @@ public: /// size of the scalar type involved. For example `s32` will become `s16`, /// `<2 x s32>` will become `<2 x s16>`. LLT halfScalarSize() const { - assert(isSized() && "cannot change size of this type"); + assert(isSized() && getScalarSizeInBits() > 1 && + getScalarSizeInBits() % 2 == 0 && "cannot half size of this type"); return LLT{Kind, NumElements, SizeOrAddrSpace / 2}; } diff --git a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp index 79e66ec..04a43ea 100644 --- a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp +++ b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp @@ -34,7 +34,7 @@ TEST(LowLevelTypeTest, Scalar) { for (unsigned S : {1U, 17U, 32U, 64U, 0xfffffU}) { const LLT Ty = LLT::scalar(S); - const LLT HalfTy = Ty.halfScalarSize(); + const LLT HalfTy = (S % 2) == 0 ? Ty.halfScalarSize() : Ty; const LLT DoubleTy = Ty.doubleScalarSize(); // Test kind. @@ -51,13 +51,14 @@ TEST(LowLevelTypeTest, Scalar) { EXPECT_EQ(S, Ty.getSizeInBits()); EXPECT_EQ(S, Ty.getScalarSizeInBits()); - // Is it OK to half an odd-sized scalar? It currently is. - EXPECT_EQ(S/2, HalfTy.getSizeInBits()); - EXPECT_EQ(S/2, HalfTy.getScalarSizeInBits()); - EXPECT_EQ(S*2, DoubleTy.getSizeInBits()); EXPECT_EQ(S*2, DoubleTy.getScalarSizeInBits()); + if ((S % 2) == 0) { + EXPECT_EQ(S/2, HalfTy.getSizeInBits()); + EXPECT_EQ(S/2, HalfTy.getScalarSizeInBits()); + } + // Test equality operators. EXPECT_TRUE(Ty == Ty); EXPECT_FALSE(Ty != Ty); @@ -87,7 +88,7 @@ TEST(LowLevelTypeTest, Vector) { // Test getElementType(). EXPECT_EQ(STy, VTy.getElementType()); - const LLT HalfSzTy = VTy.halfScalarSize(); + const LLT HalfSzTy = ((S % 2) == 0) ? VTy.halfScalarSize() : VTy; const LLT DoubleSzTy = VTy.doubleScalarSize(); // halfElements requires an even number of elements. @@ -123,9 +124,11 @@ TEST(LowLevelTypeTest, Vector) { EXPECT_EQ(S, VTy.getScalarSizeInBits()); EXPECT_EQ(Elts, VTy.getNumElements()); - EXPECT_EQ((S / 2) * Elts, HalfSzTy.getSizeInBits()); - EXPECT_EQ(S / 2, HalfSzTy.getScalarSizeInBits()); - EXPECT_EQ(Elts, HalfSzTy.getNumElements()); + if ((S % 2) == 0) { + EXPECT_EQ((S / 2) * Elts, HalfSzTy.getSizeInBits()); + EXPECT_EQ(S / 2, HalfSzTy.getScalarSizeInBits()); + EXPECT_EQ(Elts, HalfSzTy.getNumElements()); + } EXPECT_EQ((S * 2) * Elts, DoubleSzTy.getSizeInBits()); EXPECT_EQ(S * 2, DoubleSzTy.getScalarSizeInBits());