summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
diff options
context:
space:
mode:
authorGraham Hunter <graham.hunter@arm.com>2019-08-14 11:48:39 +0100
committerGraham Hunter <graham.hunter@arm.com>2019-11-18 12:30:59 +0000
commit3f08ad611aa26db2e719705b8fb60f4661d97b98 (patch)
tree11c5716f2ccf7f1dd34b4a57aaf3cac338636922 /llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
parent5181adab6183d058509ca6da7c1306ced3a61e1c (diff)
downloadbcm5719-llvm-3f08ad611aa26db2e719705b8fb60f4661d97b98.tar.gz
bcm5719-llvm-3f08ad611aa26db2e719705b8fb60f4661d97b98.zip
[SVE][CodeGen] Scalable vector MVT size queries
* Implements scalable size queries for MVTs, split out from D53137. * Contains a fix for FindMemType to avoid using scalable vector type to contain non-scalable types. * Explicit casts for several places where implicit integer sign changes or promotion from 32 to 64 bits caused problems. * CodeGenDAGPatterns will treat scalable and non-scalable vector types as different. Reviewers: greened, cameron.mcinally, sdesmalen, rovka Reviewed By: rovka Differential Revision: https://reviews.llvm.org/D66871
Diffstat (limited to 'llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp')
-rw-r--r--llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp b/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
index 14a61965374..9a4e049f635 100644
--- a/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
+++ b/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
@@ -120,4 +120,61 @@ TEST(ScalableVectorMVTsTest, VTToIRTranslation) {
ScV4Float64Ty->getElementType());
}
+TEST(ScalableVectorMVTsTest, SizeQueries) {
+ LLVMContext Ctx;
+
+ EVT nxv4i32 = EVT::getVectorVT(Ctx, MVT::i32, 4, /*Scalable=*/ true);
+ EVT nxv2i32 = EVT::getVectorVT(Ctx, MVT::i32, 2, /*Scalable=*/ true);
+ EVT nxv2i64 = EVT::getVectorVT(Ctx, MVT::i64, 2, /*Scalable=*/ true);
+ EVT nxv2f64 = EVT::getVectorVT(Ctx, MVT::f64, 2, /*Scalable=*/ true);
+
+ EVT v4i32 = EVT::getVectorVT(Ctx, MVT::i32, 4);
+ EVT v2i32 = EVT::getVectorVT(Ctx, MVT::i32, 2);
+ EVT v2i64 = EVT::getVectorVT(Ctx, MVT::i64, 2);
+ EVT v2f64 = EVT::getVectorVT(Ctx, MVT::f64, 2);
+
+ // Check equivalence and ordering on scalable types.
+ EXPECT_EQ(nxv4i32.getSizeInBits(), nxv2i64.getSizeInBits());
+ EXPECT_EQ(nxv2f64.getSizeInBits(), nxv2i64.getSizeInBits());
+ EXPECT_NE(nxv2i32.getSizeInBits(), nxv4i32.getSizeInBits());
+ EXPECT_LT(nxv2i32.getSizeInBits(), nxv2i64.getSizeInBits());
+ EXPECT_LE(nxv4i32.getSizeInBits(), nxv2i64.getSizeInBits());
+ EXPECT_GT(nxv4i32.getSizeInBits(), nxv2i32.getSizeInBits());
+ EXPECT_GE(nxv2i64.getSizeInBits(), nxv4i32.getSizeInBits());
+
+ // Check equivalence and ordering on fixed types.
+ EXPECT_EQ(v4i32.getSizeInBits(), v2i64.getSizeInBits());
+ EXPECT_EQ(v2f64.getSizeInBits(), v2i64.getSizeInBits());
+ EXPECT_NE(v2i32.getSizeInBits(), v4i32.getSizeInBits());
+ EXPECT_LT(v2i32.getSizeInBits(), v2i64.getSizeInBits());
+ EXPECT_LE(v4i32.getSizeInBits(), v2i64.getSizeInBits());
+ EXPECT_GT(v4i32.getSizeInBits(), v2i32.getSizeInBits());
+ EXPECT_GE(v2i64.getSizeInBits(), v4i32.getSizeInBits());
+
+ // Check that scalable and non-scalable types with the same minimum size
+ // are not considered equal.
+ ASSERT_TRUE(v4i32.getSizeInBits() != nxv4i32.getSizeInBits());
+ ASSERT_FALSE(v2i64.getSizeInBits() == nxv2f64.getSizeInBits());
+
+ // Check that we can obtain a known-exact size from a non-scalable type.
+ EXPECT_EQ(v4i32.getSizeInBits(), 128U);
+ EXPECT_EQ(v2i64.getSizeInBits().getFixedSize(), 128U);
+
+ // Check that we can query the known minimum size for both scalable and
+ // fixed length types.
+ EXPECT_EQ(nxv2i32.getSizeInBits().getKnownMinSize(), 64U);
+ EXPECT_EQ(nxv2f64.getSizeInBits().getKnownMinSize(), 128U);
+ EXPECT_EQ(v2i32.getSizeInBits().getKnownMinSize(),
+ nxv2i32.getSizeInBits().getKnownMinSize());
+
+ // Check scalable property.
+ ASSERT_FALSE(v4i32.getSizeInBits().isScalable());
+ ASSERT_TRUE(nxv4i32.getSizeInBits().isScalable());
+
+ // Check convenience size scaling methods.
+ EXPECT_EQ(v2i32.getSizeInBits() * 2, v4i32.getSizeInBits());
+ EXPECT_EQ(2 * nxv2i32.getSizeInBits(), nxv4i32.getSizeInBits());
+ EXPECT_EQ(nxv2f64.getSizeInBits() / 2, nxv2i32.getSizeInBits());
+}
+
} // end anonymous namespace
OpenPOWER on IntegriCloud