<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>