<div dir="ltr">I believe this is throwing a signed/unsigned comparison mismatch warning.<div><br></div><div><div>In file included from unittests/CodeGen/ScalableVectorMVTsTest.cpp:13:</div><div>utils/unittest/googletest/include/gtest/gtest.h:1392:11: error: comparison of integers of different signs: 'const unsigned int' and 'const int' [-Werror,-Wsign-compare]</div><div> if (lhs == rhs) {</div><div> ~~~ ^ ~~~</div><div>utils/unittest/googletest/include/gtest/gtest.h:1421:12: note: in instantiation of function template specialization 'testing::internal::CmpHelperEQ<unsigned int, int>' requested here</div><div> return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);</div><div> ^</div><div>unittests/CodeGen/ScalableVectorMVTsTest.cpp:73:3: note: in instantiation of function template specialization 'testing::internal::EqHelper<false>::Compare<unsigned int, int>' requested here</div><div> EXPECT_EQ(EltCnt.Min, 4);</div><div> ^</div><div>utils/unittest/googletest/include/gtest/gtest.h:1924:63: note: expanded from macro 'EXPECT_EQ'</div><div> EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \</div></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Thu, Apr 20, 2017 at 6:54 AM, Amara Emerson via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: aemerson<br>
Date: Thu Apr 20 08:54:09 2017<br>
New Revision: 300842<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=300842&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=300842&view=rev</a><br>
Log:<br>
[MVT][SVE] Scalable vector MVTs (3/3)<br>
<br>
Adds MVT::ElementCount to represent the length of a<br>
vector which may be scalable, then adds helper functions<br>
that work with it.<br>
<br>
Patch by Graham Hunter.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D32019" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D32019</a><br>
<br>
<br>
Added:<br>
llvm/trunk/unittests/CodeGen/<wbr>ScalableVectorMVTsTest.cpp<br>
Modified:<br>
llvm/trunk/include/llvm/<wbr>CodeGen/MachineValueType.h<br>
llvm/trunk/include/llvm/<wbr>CodeGen/ValueTypes.h<br>
llvm/trunk/lib/CodeGen/<wbr>SelectionDAG/LegalizeTypes.cpp<br>
llvm/trunk/unittests/CodeGen/<wbr>CMakeLists.txt<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>CodeGen/MachineValueType.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineValueType.h?rev=300842&r1=300841&r2=300842&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/CodeGen/MachineValueType.<wbr>h?rev=300842&r1=300841&r2=<wbr>300842&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>CodeGen/MachineValueType.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>CodeGen/MachineValueType.h Thu Apr 20 08:54:09 2017<br>
@@ -232,6 +232,42 @@ class MVT {<br>
<br>
SimpleValueType SimpleTy;<br>
<br>
+<br>
+ // A class to represent the number of elements in a vector<br>
+ //<br>
+ // For fixed-length vectors, the total number of elements is equal to 'Min'<br>
+ // For scalable vectors, the total number of elements is a multiple of 'Min'<br>
+ class ElementCount {<br>
+ public:<br>
+ unsigned Min;<br>
+ bool Scalable;<br>
+<br>
+ ElementCount(unsigned Min, bool Scalable)<br>
+ : Min(Min), Scalable(Scalable) {}<br>
+<br>
+ ElementCount operator*(unsigned RHS) {<br>
+ return { Min * RHS, Scalable };<br>
+ }<br>
+<br>
+ ElementCount& operator*=(unsigned RHS) {<br>
+ Min *= RHS;<br>
+ return *this;<br>
+ }<br>
+<br>
+ ElementCount operator/(unsigned RHS) {<br>
+ return { Min / RHS, Scalable };<br>
+ }<br>
+<br>
+ ElementCount& operator/=(unsigned RHS) {<br>
+ Min /= RHS;<br>
+ return *this;<br>
+ }<br>
+<br>
+ bool operator==(const ElementCount& RHS) {<br>
+ return Min == RHS.Min && Scalable == RHS.Scalable;<br>
+ }<br>
+ };<br>
+<br>
constexpr MVT() : SimpleTy(INVALID_SIMPLE_VALUE_<wbr>TYPE) {}<br>
constexpr MVT(SimpleValueType SVT) : SimpleTy(SVT) {}<br>
<br>
@@ -276,6 +312,15 @@ class MVT {<br>
SimpleTy <= MVT::LAST_VECTOR_VALUETYPE);<br>
}<br>
<br>
+ /// Return true if this is a vector value type where the<br>
+ /// runtime length is machine dependent<br>
+ bool isScalableVector() const {<br>
+ return ((SimpleTy >= MVT::FIRST_INTEGER_SCALABLE_<wbr>VALUETYPE &&<br>
+ SimpleTy <= MVT::LAST_INTEGER_SCALABLE_<wbr>VALUETYPE) ||<br>
+ (SimpleTy >= MVT::FIRST_FP_SCALABLE_<wbr>VALUETYPE &&<br>
+ SimpleTy <= MVT::LAST_FP_SCALABLE_<wbr>VALUETYPE));<br>
+ }<br>
+<br>
/// Return true if this is a 16-bit vector type.<br>
bool is16BitVector() const {<br>
return (SimpleTy == MVT::v2i8 || SimpleTy == MVT::v1i16 ||<br>
@@ -560,6 +605,10 @@ class MVT {<br>
}<br>
}<br>
<br>
+ MVT::ElementCount getVectorElementCount() const {<br>
+ return { getVectorNumElements(), isScalableVector() };<br>
+ }<br>
+<br>
unsigned getSizeInBits() const {<br>
switch (SimpleTy) {<br>
default:<br>
@@ -837,6 +886,83 @@ class MVT {<br>
return (MVT::SimpleValueType)(MVT::<wbr>INVALID_SIMPLE_VALUE_TYPE);<br>
}<br>
<br>
+ static MVT getScalableVectorVT(MVT VT, unsigned NumElements) {<br>
+ switch(VT.SimpleTy) {<br>
+ default:<br>
+ break;<br>
+ case MVT::i1:<br>
+ if (NumElements == 2) return MVT::nxv2i1;<br>
+ if (NumElements == 4) return MVT::nxv4i1;<br>
+ if (NumElements == 8) return MVT::nxv8i1;<br>
+ if (NumElements == 16) return MVT::nxv16i1;<br>
+ if (NumElements == 32) return MVT::nxv32i1;<br>
+ break;<br>
+ case MVT::i8:<br>
+ if (NumElements == 1) return MVT::nxv1i8;<br>
+ if (NumElements == 2) return MVT::nxv2i8;<br>
+ if (NumElements == 4) return MVT::nxv4i8;<br>
+ if (NumElements == 8) return MVT::nxv8i8;<br>
+ if (NumElements == 16) return MVT::nxv16i8;<br>
+ if (NumElements == 32) return MVT::nxv32i8;<br>
+ break;<br>
+ case MVT::i16:<br>
+ if (NumElements == 1) return MVT::nxv1i16;<br>
+ if (NumElements == 2) return MVT::nxv2i16;<br>
+ if (NumElements == 4) return MVT::nxv4i16;<br>
+ if (NumElements == 8) return MVT::nxv8i16;<br>
+ if (NumElements == 16) return MVT::nxv16i16;<br>
+ if (NumElements == 32) return MVT::nxv32i16;<br>
+ break;<br>
+ case MVT::i32:<br>
+ if (NumElements == 1) return MVT::nxv1i32;<br>
+ if (NumElements == 2) return MVT::nxv2i32;<br>
+ if (NumElements == 4) return MVT::nxv4i32;<br>
+ if (NumElements == 8) return MVT::nxv8i32;<br>
+ if (NumElements == 16) return MVT::nxv16i32;<br>
+ if (NumElements == 32) return MVT::nxv32i32;<br>
+ break;<br>
+ case MVT::i64:<br>
+ if (NumElements == 1) return MVT::nxv1i64;<br>
+ if (NumElements == 2) return MVT::nxv2i64;<br>
+ if (NumElements == 4) return MVT::nxv4i64;<br>
+ if (NumElements == 8) return MVT::nxv8i64;<br>
+ if (NumElements == 16) return MVT::nxv16i64;<br>
+ if (NumElements == 32) return MVT::nxv32i64;<br>
+ break;<br>
+ case MVT::f16:<br>
+ if (NumElements == 2) return MVT::nxv2f16;<br>
+ if (NumElements == 4) return MVT::nxv4f16;<br>
+ if (NumElements == 8) return MVT::nxv8f16;<br>
+ break;<br>
+ case MVT::f32:<br>
+ if (NumElements == 1) return MVT::nxv1f32;<br>
+ if (NumElements == 2) return MVT::nxv2f32;<br>
+ if (NumElements == 4) return MVT::nxv4f32;<br>
+ if (NumElements == 8) return MVT::nxv8f32;<br>
+ if (NumElements == 16) return MVT::nxv16f32;<br>
+ break;<br>
+ case MVT::f64:<br>
+ if (NumElements == 1) return MVT::nxv1f64;<br>
+ if (NumElements == 2) return MVT::nxv2f64;<br>
+ if (NumElements == 4) return MVT::nxv4f64;<br>
+ if (NumElements == 8) return MVT::nxv8f64;<br>
+ break;<br>
+ }<br>
+ return (MVT::SimpleValueType)(MVT::<wbr>INVALID_SIMPLE_VALUE_TYPE);<br>
+ }<br>
+<br>
+ static MVT getVectorVT(MVT VT, unsigned NumElements, bool IsScalable) {<br>
+ if (IsScalable)<br>
+ return getScalableVectorVT(VT, NumElements);<br>
+ return getVectorVT(VT, NumElements);<br>
+ }<br>
+<br>
+ static MVT getVectorVT(MVT VT, MVT::ElementCount EC) {<br>
+ if (EC.Scalable)<br>
+ return getScalableVectorVT(VT, EC.Min);<br>
+ return getVectorVT(VT, EC.Min);<br>
+ }<br>
+<br>
/// Return the value type corresponding to the specified type. This returns<br>
/// all pointers as iPTR. If HandleUnknown is true, unknown types are<br>
/// returned as Other, otherwise they are invalid.<br>
@@ -887,6 +1013,14 @@ class MVT {<br>
MVT::FIRST_FP_VECTOR_<wbr>VALUETYPE,<br>
(MVT::SimpleValueType)(MVT::<wbr>LAST_FP_VECTOR_VALUETYPE + 1));<br>
}<br>
+ static mvt_range integer_scalable_vector_<wbr>valuetypes() {<br>
+ return mvt_range(MVT::FIRST_INTEGER_<wbr>SCALABLE_VALUETYPE,<br>
+ (MVT::SimpleValueType)(MVT::<wbr>LAST_INTEGER_SCALABLE_<wbr>VALUETYPE + 1));<br>
+ }<br>
+ static mvt_range fp_scalable_vector_valuetypes(<wbr>) {<br>
+ return mvt_range(MVT::FIRST_FP_<wbr>SCALABLE_VALUETYPE,<br>
+ (MVT::SimpleValueType)(MVT::<wbr>LAST_FP_SCALABLE_VALUETYPE + 1));<br>
+ }<br>
/// @}<br>
};<br>
<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>CodeGen/ValueTypes.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/ValueTypes.h?rev=300842&r1=300841&r2=300842&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/CodeGen/ValueTypes.h?rev=<wbr>300842&r1=300841&r2=300842&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>CodeGen/ValueTypes.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>CodeGen/ValueTypes.h Thu Apr 20 08:54:09 2017<br>
@@ -67,24 +67,41 @@ namespace llvm {<br>
<br>
/// Returns the EVT that represents a vector NumElements in length, where<br>
/// each element is of type VT.<br>
- static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements) {<br>
- MVT M = MVT::getVectorVT(VT.V, NumElements);<br>
+ static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements,<br>
+ bool IsScalable = false) {<br>
+ MVT M = MVT::getVectorVT(VT.V, NumElements, IsScalable);<br>
if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_<wbr>TYPE)<br>
return M;<br>
+<br>
+ assert(!IsScalable && "We don't support extended scalable types yet");<br>
return getExtendedVectorVT(Context, VT, NumElements);<br>
}<br>
<br>
+ /// Returns the EVT that represents a vector EC.Min elements in length,<br>
+ /// where each element is of type VT.<br>
+ static EVT getVectorVT(LLVMContext &Context, EVT VT, MVT::ElementCount EC) {<br>
+ MVT M = MVT::getVectorVT(VT.V, EC);<br>
+ if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_<wbr>TYPE)<br>
+ return M;<br>
+ assert (!EC.Scalable && "We don't support extended scalable types yet");<br>
+ return getExtendedVectorVT(Context, VT, EC.Min);<br>
+ }<br>
+<br>
/// Return a vector with the same number of elements as this vector, but<br>
/// with the element type converted to an integer type with the same<br>
/// bitwidth.<br>
EVT changeVectorElementTypeToInteg<wbr>er() const {<br>
- if (!isSimple())<br>
+ if (!isSimple()) {<br>
+ assert (!isScalableVector() &&<br>
+ "We don't support extended scalable types yet");<br>
return changeExtendedVectorElementTyp<wbr>eToInteger();<br>
+ }<br>
MVT EltTy = getSimpleVT().<wbr>getVectorElementType();<br>
unsigned BitWidth = EltTy.getSizeInBits();<br>
MVT IntTy = MVT::getIntegerVT(BitWidth);<br>
- MVT VecTy = MVT::getVectorVT(IntTy, getVectorNumElements());<br>
- assert(VecTy.SimpleTy >= 0 &&<br>
+ MVT VecTy = MVT::getVectorVT(IntTy, getVectorNumElements(),<br>
+ isScalableVector());<br>
+ assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&<br>
"Simple vector VT not representable by simple integer vector VT!");<br>
return VecTy;<br>
}<br>
@@ -132,6 +149,17 @@ namespace llvm {<br>
return isSimple() ? V.isVector() : isExtendedVector();<br>
}<br>
<br>
+ /// Return true if this is a vector type where the runtime<br>
+ /// length is machine dependent<br>
+ bool isScalableVector() const {<br>
+ // FIXME: We don't support extended scalable types yet, because the<br>
+ // matching IR type doesn't exist. Once it has been added, this can<br>
+ // be changed to call isExtendedScalableVector.<br>
+ if (!isSimple())<br>
+ return false;<br>
+ return V.isScalableVector();<br>
+ }<br>
+<br>
/// Return true if this is a 16-bit vector type.<br>
bool is16BitVector() const {<br>
return isSimple() ? V.is16BitVector() : isExtended16BitVector();<br>
@@ -247,6 +275,17 @@ namespace llvm {<br>
return getExtendedVectorNumElements()<wbr>;<br>
}<br>
<br>
+ // Given a (possibly scalable) vector type, return the ElementCount<br>
+ MVT::ElementCount getVectorElementCount() const {<br>
+ assert((isVector()) && "Invalid vector type!");<br>
+ if (isSimple())<br>
+ return V.getVectorElementCount();<br>
+<br>
+ assert(!isScalableVector() &&<br>
+ "We don't support extended scalable types yet");<br>
+ return {getExtendedVectorNumElements(<wbr>), false};<br>
+ }<br>
+<br>
/// Return the size of the specified value type in bits.<br>
unsigned getSizeInBits() const {<br>
if (isSimple())<br>
@@ -301,7 +340,7 @@ namespace llvm {<br>
EVT widenIntegerVectorElementType(<wbr>LLVMContext &Context) const {<br>
EVT EltVT = getVectorElementType();<br>
EltVT = EVT::getIntegerVT(Context, 2 * EltVT.getSizeInBits());<br>
- return EVT::getVectorVT(Context, EltVT, getVectorNumElements());<br>
+ return EVT::getVectorVT(Context, EltVT, getVectorElementCount());<br>
}<br>
<br>
// Return a VT for a vector type with the same element type but<br>
@@ -309,9 +348,8 @@ namespace llvm {<br>
// extended type.<br>
EVT getHalfNumVectorElementsVT(<wbr>LLVMContext &Context) const {<br>
EVT EltVT = getVectorElementType();<br>
- auto EltCnt = getVectorNumElements();<br>
- assert(!(getVectorNumElements(<wbr>) & 1) &&<br>
- "Splitting vector, but not in half!");<br>
+ auto EltCnt = getVectorElementCount();<br>
+ assert(!(EltCnt.Min & 1) && "Splitting vector, but not in half!");<br>
return EVT::getVectorVT(Context, EltVT, EltCnt / 2);<br>
}<br>
<br>
@@ -327,7 +365,8 @@ namespace llvm {<br>
if (!isPow2VectorType()) {<br>
unsigned NElts = getVectorNumElements();<br>
unsigned Pow2NElts = 1 << Log2_32_Ceil(NElts);<br>
- return EVT::getVectorVT(Context, getVectorElementType(), Pow2NElts);<br>
+ return EVT::getVectorVT(Context, getVectorElementType(), Pow2NElts,<br>
+ isScalableVector());<br>
}<br>
else {<br>
return *this;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>SelectionDAG/LegalizeTypes.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp?rev=300842&r1=300841&r2=300842&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/SelectionDAG/<wbr>LegalizeTypes.cpp?rev=300842&<wbr>r1=300841&r2=300842&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>SelectionDAG/LegalizeTypes.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>SelectionDAG/LegalizeTypes.cpp Thu Apr 20 08:54:09 2017<br>
@@ -925,9 +925,9 @@ SDValue DAGTypeLegalizer::<wbr>BitConvertVect<br>
assert(Op.getValueType().<wbr>isVector() && "Only applies to vectors!");<br>
unsigned EltWidth = Op.getScalarValueSizeInBits();<br>
EVT EltNVT = EVT::getIntegerVT(*DAG.<wbr>getContext(), EltWidth);<br>
- unsigned NumElts = Op.getValueType().<wbr>getVectorNumElements();<br>
+ auto EltCnt = Op.getValueType().<wbr>getVectorElementCount();<br>
return DAG.getNode(ISD::BITCAST, SDLoc(Op),<br>
- EVT::getVectorVT(*DAG.<wbr>getContext(), EltNVT, NumElts), Op);<br>
+ EVT::getVectorVT(*DAG.<wbr>getContext(), EltNVT, EltCnt), Op);<br>
}<br>
<br>
SDValue DAGTypeLegalizer::<wbr>CreateStackStoreLoad(SDValue Op,<br>
<br>
Modified: llvm/trunk/unittests/CodeGen/<wbr>CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/CMakeLists.txt?rev=300842&r1=300841&r2=300842&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>CodeGen/CMakeLists.txt?rev=<wbr>300842&r1=300841&r2=300842&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/CodeGen/<wbr>CMakeLists.txt (original)<br>
+++ llvm/trunk/unittests/CodeGen/<wbr>CMakeLists.txt Thu Apr 20 08:54:09 2017<br>
@@ -9,6 +9,7 @@ set(CodeGenSources<br>
DIEHashTest.cpp<br>
LowLevelTypeTest.cpp<br>
MachineInstrBundleIteratorTest<wbr>.cpp<br>
+ ScalableVectorMVTsTest.cpp<br>
)<br>
<br>
add_llvm_unittest(CodeGenTests<br>
<br>
Added: llvm/trunk/unittests/CodeGen/<wbr>ScalableVectorMVTsTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/ScalableVectorMVTsTest.cpp?rev=300842&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>CodeGen/<wbr>ScalableVectorMVTsTest.cpp?<wbr>rev=300842&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/CodeGen/<wbr>ScalableVectorMVTsTest.cpp (added)<br>
+++ llvm/trunk/unittests/CodeGen/<wbr>ScalableVectorMVTsTest.cpp Thu Apr 20 08:54:09 2017<br>
@@ -0,0 +1,88 @@<br>
+//===-------- llvm/unittest/CodeGen/<wbr>ScalableVectorMVTsTest.cpp ------------===//<br>
+//<br>
+// The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#include "llvm/CodeGen/<wbr>MachineValueType.h"<br>
+#include "llvm/CodeGen/ValueTypes.h"<br>
+#include "llvm/IR/LLVMContext.h"<br>
+#include "gtest/gtest.h"<br>
+<br>
+using namespace llvm;<br>
+<br>
+namespace {<br>
+<br>
+TEST(ScalableVectorMVTsTest, IntegerMVTs) {<br>
+ for (auto VecTy : MVT::integer_scalable_vector_<wbr>valuetypes()) {<br>
+ ASSERT_TRUE(VecTy.isValid());<br>
+ ASSERT_TRUE(VecTy.isInteger())<wbr>;<br>
+ ASSERT_TRUE(VecTy.isVector());<br>
+ ASSERT_TRUE(VecTy.<wbr>isScalableVector());<br>
+ ASSERT_TRUE(VecTy.<wbr>getScalarType().isValid());<br>
+<br>
+ ASSERT_FALSE(VecTy.<wbr>isFloatingPoint());<br>
+ }<br>
+}<br>
+<br>
+TEST(ScalableVectorMVTsTest, FloatMVTs) {<br>
+ for (auto VecTy : MVT::fp_scalable_vector_<wbr>valuetypes()) {<br>
+ ASSERT_TRUE(VecTy.isValid());<br>
+ ASSERT_TRUE(VecTy.<wbr>isFloatingPoint());<br>
+ ASSERT_TRUE(VecTy.isVector());<br>
+ ASSERT_TRUE(VecTy.<wbr>isScalableVector());<br>
+ ASSERT_TRUE(VecTy.<wbr>getScalarType().isValid());<br>
+<br>
+ ASSERT_FALSE(VecTy.isInteger()<wbr>);<br>
+ }<br>
+}<br>
+<br>
+TEST(ScalableVectorMVTsTest, HelperFuncs) {<br>
+ LLVMContext Ctx;<br>
+<br>
+ // Create with scalable flag<br>
+ EVT Vnx4i32 = EVT::getVectorVT(Ctx, MVT::i32, 4, /*Scalable=*/true);<br>
+ ASSERT_TRUE(Vnx4i32.<wbr>isScalableVector());<br>
+<br>
+ // Create with separate MVT::ElementCount<br>
+ auto EltCnt = MVT::ElementCount(2, true);<br>
+ EVT Vnx2i32 = EVT::getVectorVT(Ctx, MVT::i32, EltCnt);<br>
+ ASSERT_TRUE(Vnx2i32.<wbr>isScalableVector());<br>
+<br>
+ // Create with inline MVT::ElementCount<br>
+ EVT Vnx2i64 = EVT::getVectorVT(Ctx, MVT::i64, {2, true});<br>
+ ASSERT_TRUE(Vnx2i64.<wbr>isScalableVector());<br>
+<br>
+ // Check that changing scalar types/element count works<br>
+ EXPECT_EQ(Vnx2i32.<wbr>widenIntegerVectorElementType(<wbr>Ctx), Vnx2i64);<br>
+ EXPECT_EQ(Vnx4i32.<wbr>getHalfNumVectorElementsVT(<wbr>Ctx), Vnx2i32);<br>
+<br>
+ // Check that overloaded '*' and '/' operators work<br>
+ EXPECT_EQ(EVT::getVectorVT(<wbr>Ctx, MVT::i64, EltCnt * 2), MVT::nxv4i64);<br>
+ EXPECT_EQ(EVT::getVectorVT(<wbr>Ctx, MVT::i64, EltCnt / 2), MVT::nxv1i64);<br>
+<br>
+ // Check that float->int conversion works<br>
+ EVT Vnx2f64 = EVT::getVectorVT(Ctx, MVT::f64, {2, true});<br>
+ EXPECT_EQ(Vnx2f64.<wbr>changeTypeToInteger(), Vnx2i64);<br>
+<br>
+ // Check fields inside MVT::ElementCount<br>
+ EltCnt = Vnx4i32.getVectorElementCount(<wbr>);<br>
+ EXPECT_EQ(EltCnt.Min, 4);<br>
+ ASSERT_TRUE(EltCnt.Scalable);<br>
+<br>
+ // Check that fixed-length vector types aren't scalable.<br>
+ EVT V8i32 = EVT::getVectorVT(Ctx, MVT::i32, 8);<br>
+ ASSERT_FALSE(V8i32.<wbr>isScalableVector());<br>
+ EVT V4f64 = EVT::getVectorVT(Ctx, MVT::f64, {4, false});<br>
+ ASSERT_FALSE(V4f64.<wbr>isScalableVector());<br>
+<br>
+ // Check that MVT::ElementCount works for fixed-length types.<br>
+ EltCnt = V8i32.getVectorElementCount();<br>
+ EXPECT_EQ(EltCnt.Min, 8);<br>
+ ASSERT_FALSE(EltCnt.Scalable);<br>
+}<br>
+<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>