[llvm] [DAG] Adding MVT::widenIntegerElementType to widen both Scalar and Vectors of integer type. (PR #207148)

Chirag Patel via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 2 02:29:44 PDT 2026


https://github.com/ChiragPatel8 created https://github.com/llvm/llvm-project/pull/207148

Adding MVT::widenIntegerElementType to widen both Scalar and Vectors of integer type. e.g. i16 -> i32, v8i32->v8i64.

fixes #206730 

>From a92b420751290955e330fee9a7fa7162a6df2951 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Wed, 1 Jul 2026 02:54:10 +0530
Subject: [PATCH 1/9] [DAG] Add MVT::widenIntegerElementType and
 MVT::widenIntegerVectorElementType

---
 .../llvm/CodeGenTypes/MachineValueType.h      | 28 +++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 92f3b79588996..d7f1457eeb032 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -265,6 +265,34 @@ namespace llvm {
       return MVT::getVectorVT(EltVT, EltCnt * 2);
     }
 
+    // Return a VT for an Integer type doubled in size
+    MVT widenIntegerElementType() const {
+      assert(isScalarInteger() && "Not an integer MVT!");
+      assert((SimpleTy != MVT::LAST_INTEGER_VALUETYPE) &&
+             "Widening of this Integer type not supported !");
+      
+      // i1 is a special case � doubling gives i2 which is not a valid MVT,
+      // so promote directly to i8 instead.
+      if (SimpleTy == MVT::i1)
+        return MVT::i8;
+
+      unsigned NextSizeInBits = getScalarSizeInBits() * 2;
+      return getIntegerVT(NextSizeInBits);
+    }
+
+    // Return a VT for an integer vector type with the size of the
+    // elements doubled.
+    MVT widenIntegerVectorElementType() const {
+      assert(isVector() && "Not a vector MVT!");
+
+      MVT WideEltTy = getVectorElementType().widenIntegerElementType();
+      MVT VecTy = MVT::getVectorVT(WideEltTy, getVectorElementCount());
+      assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
+             "Simple vector VT not representable by simple integer vector VT!");
+      return VecTy;
+
+    }
+
     /// Returns true if the given vector is a power of 2.
     bool isPow2VectorType() const {
       unsigned NElts = getVectorMinNumElements();

>From b49ab1c7a1576dfe33fd224fd5929c9aefd69af3 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Wed, 1 Jul 2026 03:33:34 +0530
Subject: [PATCH 2/9] Assert message correction

---
 .gitignore                                        | 2 ++
 llvm/include/llvm/CodeGenTypes/MachineValueType.h | 3 +--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
index a4382c9ea7390..70b4e5dcddb8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,3 +90,5 @@ pythonenv*
 /clang/utils/analyzer/projects/*/RefScanBuildResults
 # automodapi puts generated documentation files here.
 /lldb/docs/python_api/
+/CppProperties.json
+/CppProperties.json
diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index d7f1457eeb032..5f08ba8cb6488 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -288,9 +288,8 @@ namespace llvm {
       MVT WideEltTy = getVectorElementType().widenIntegerElementType();
       MVT VecTy = MVT::getVectorVT(WideEltTy, getVectorElementCount());
       assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
-             "Simple vector VT not representable by simple integer vector VT!");
+             "Integer Vector widening not possible !");
       return VecTy;
-
     }
 
     /// Returns true if the given vector is a power of 2.

>From cbf3d13aba31bcc6307595462fc6716dab78e6d4 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Wed, 1 Jul 2026 03:35:55 +0530
Subject: [PATCH 3/9] Revert "Assert message correction"

This reverts commit b49ab1c7a1576dfe33fd224fd5929c9aefd69af3.
---
 .gitignore                                        | 2 --
 llvm/include/llvm/CodeGenTypes/MachineValueType.h | 3 ++-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
index 70b4e5dcddb8b..a4382c9ea7390 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,5 +90,3 @@ pythonenv*
 /clang/utils/analyzer/projects/*/RefScanBuildResults
 # automodapi puts generated documentation files here.
 /lldb/docs/python_api/
-/CppProperties.json
-/CppProperties.json
diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 5f08ba8cb6488..d7f1457eeb032 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -288,8 +288,9 @@ namespace llvm {
       MVT WideEltTy = getVectorElementType().widenIntegerElementType();
       MVT VecTy = MVT::getVectorVT(WideEltTy, getVectorElementCount());
       assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
-             "Integer Vector widening not possible !");
+             "Simple vector VT not representable by simple integer vector VT!");
       return VecTy;
+
     }
 
     /// Returns true if the given vector is a power of 2.

>From a9997305ff3f13aece33d90641dae7db72260f44 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Wed, 1 Jul 2026 03:53:10 +0530
Subject: [PATCH 4/9] Assert message correction

---
 llvm/include/llvm/CodeGenTypes/MachineValueType.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index d7f1457eeb032..3254b2877fccf 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -288,7 +288,7 @@ namespace llvm {
       MVT WideEltTy = getVectorElementType().widenIntegerElementType();
       MVT VecTy = MVT::getVectorVT(WideEltTy, getVectorElementCount());
       assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
-             "Simple vector VT not representable by simple integer vector VT!");
+             "Widening of this Vector Integer type not supported !");
       return VecTy;
 
     }

>From 451bd6a87703fee76ae5f38d3561c170eadfbbfb Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Wed, 1 Jul 2026 04:00:50 +0530
Subject: [PATCH 5/9] utf-8 error correction

---
 llvm/include/llvm/CodeGenTypes/MachineValueType.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 3254b2877fccf..92d9f8ab20213 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -271,7 +271,7 @@ namespace llvm {
       assert((SimpleTy != MVT::LAST_INTEGER_VALUETYPE) &&
              "Widening of this Integer type not supported !");
       
-      // i1 is a special case � doubling gives i2 which is not a valid MVT,
+      // i1 is a special case doubling gives i2 which is not a valid MVT
       // so promote directly to i8 instead.
       if (SimpleTy == MVT::i1)
         return MVT::i8;

>From 53fc4366330e706d031b039b624024dc952304c8 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Wed, 1 Jul 2026 15:36:58 +0530
Subject: [PATCH 6/9] [DAG] Add MVT::widenIntegerElementType and
 MVT::widenIntegerVectorElementType

---
 .../llvm/CodeGenTypes/MachineValueType.h      | 27 +++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 92f3b79588996..d9cfa86d34401 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -265,6 +265,33 @@ namespace llvm {
       return MVT::getVectorVT(EltVT, EltCnt * 2);
     }
 
+    // Return a VT for an Integer type doubled in size
+    MVT widenIntegerElementType() const {
+      assert(isScalarInteger() && "Not an integer MVT!");
+      assert((SimpleTy != MVT::LAST_INTEGER_VALUETYPE) &&
+             "Widening of this Integer type not supported !");
+
+      // i1 is a special case doubling gives i2 which is not a valid MVT
+      // so promote directly to i8 instead.
+      if (SimpleTy == MVT::i1)
+        return MVT::i8;
+
+      unsigned NextSizeInBits = getScalarSizeInBits() * 2;
+      return getIntegerVT(NextSizeInBits);
+    }
+
+    // Return a VT for an integer vector type with the size of the
+    // elements doubled.
+    MVT widenIntegerVectorElementType() const {
+      assert(isVector() && "Not a vector MVT!");
+
+      MVT WideEltTy = getVectorElementType().widenIntegerElementType();
+      MVT VecTy = MVT::getVectorVT(WideEltTy, getVectorElementCount());
+      assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
+             "Widening of this Vector Integer type not supported !");
+      return VecTy;
+    }
+
     /// Returns true if the given vector is a power of 2.
     bool isPow2VectorType() const {
       unsigned NElts = getVectorMinNumElements();

>From 21bf9c6d7fbbb4c8ce1ddc56e47c29fe60951656 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Thu, 2 Jul 2026 01:41:12 +0530
Subject: [PATCH 7/9] Adding testcases.

---
 .../llvm/CodeGenTypes/MachineValueType.h      | 29 ++++++++-------
 .../CodeGen/ScalableVectorMVTsTest.cpp        | 36 +++++++++++++++++++
 2 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 7ed315b5f75c6..a7518910eeab5 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -265,26 +265,25 @@ namespace llvm {
       return MVT::getVectorVT(EltVT, EltCnt * 2);
     }
 
+    MVT placeholder_206783(MVT EltVT) const {
+      EltVT = EltVT.getScalarType();
+      return isVector() ? changeVectorElementType(EltVT) : EltVT;
+    }
+
     // Return a VT for an Integer type doubled in size
     MVT widenIntegerElementType() const {
-      assert(isScalarInteger() && "Not an integer MVT!");
-      assert((SimpleTy != MVT::LAST_INTEGER_VALUETYPE) &&
+      const MVT BaseTy = getScalarType();
+      assert(BaseTy.isInteger() &&
+             "Not an integer or vector of integer MVT!");
+      assert((BaseTy != MVT::LAST_INTEGER_VALUETYPE) &&
              "Widening of this Integer type not supported !");
 
-      unsigned NextSizeInBits = getScalarSizeInBits() * 2;
-      return getIntegerVT(NextSizeInBits);
-    }
+      MVT ResTy =
+          placeholder_206783(getIntegerVT(BaseTy.getScalarSizeInBits() * 2));
+      assert(ResTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
+             "Failed to widened to a valid MVT!");
 
-    // Return a VT for an integer vector type with the size of the
-    // elements doubled.
-    MVT widenIntegerVectorElementType() const {
-      assert(isVector() && "Not a vector MVT!");
-
-      MVT WideEltTy = getVectorElementType().widenIntegerElementType();
-      MVT VecTy = MVT::getVectorVT(WideEltTy, getVectorElementCount());
-      assert(VecTy.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
-             "Widening of this Vector Integer type not supported !");
-      return VecTy;
+      return ResTy;
     }
 
     /// Returns true if the given vector is a power of 2.
diff --git a/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp b/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
index c343465ae4c72..ea1c97cb639c4 100644
--- a/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
+++ b/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
@@ -194,4 +194,40 @@ TEST(ScalableVectorMVTsTest, SizeQueries) {
             nxv2i32.getSizeInBits());
 }
 
+TEST(ScalableVectorMVTsTest, WideningIntegerMVTs) {
+  MVT i1Ty = MVT::i1;
+  MVT i2Ty = MVT::i2;
+  MVT i4Ty = MVT::i4;
+  MVT i8Ty = MVT::i8;
+  MVT i16Ty = MVT::i16;
+  MVT i32Ty = MVT::i32;
+  MVT i64Ty = MVT::i64;
+  MVT i128Ty = MVT::i128;
+  MVT i256Ty = MVT::i256;
+  MVT i512Ty = MVT::i512;
+
+  EXPECT_EQ(i1Ty.widenIntegerElementType(), i2Ty);
+  EXPECT_EQ(i2Ty.widenIntegerElementType(), i4Ty);
+  EXPECT_EQ(i4Ty.widenIntegerElementType(), i8Ty);
+  EXPECT_EQ(i8Ty.widenIntegerElementType(), i16Ty);
+  EXPECT_EQ(i16Ty.widenIntegerElementType(), i32Ty);
+  EXPECT_EQ(i32Ty.widenIntegerElementType(), i64Ty);
+  EXPECT_EQ(i64Ty.widenIntegerElementType(), i128Ty);
+  EXPECT_EQ(i128Ty.widenIntegerElementType(), i256Ty);
+  EXPECT_EQ(i256Ty.widenIntegerElementType(), i512Ty);
+
+#if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST
+  EXPECT_DEATH(i512Ty.widenIntegerElementType(),
+               "Widening of this Integer type not supported !");
+#endif
+
+  MVT v128i1Ty = MVT::v128i1;
+  MVT v128i2Ty = MVT::v128i2;
+  MVT v8i32Ty = MVT::v8i32;
+  MVT v8i64Ty = MVT::v8i64;
+
+  EXPECT_EQ(v128i1Ty.widenIntegerElementType(), v128i2Ty);
+  EXPECT_EQ(v8i32Ty.widenIntegerElementType(), v8i64Ty);
+}
+
 } // end anonymous namespace

>From 6525374fa3d2a8edbd656e312278ef32d5fabc88 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Thu, 2 Jul 2026 01:56:52 +0530
Subject: [PATCH 8/9] Removed erronous testcase.

---
 llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp b/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
index ea1c97cb639c4..032a9c74ba17a 100644
--- a/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
+++ b/llvm/unittests/CodeGen/ScalableVectorMVTsTest.cpp
@@ -216,11 +216,6 @@ TEST(ScalableVectorMVTsTest, WideningIntegerMVTs) {
   EXPECT_EQ(i128Ty.widenIntegerElementType(), i256Ty);
   EXPECT_EQ(i256Ty.widenIntegerElementType(), i512Ty);
 
-#if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST
-  EXPECT_DEATH(i512Ty.widenIntegerElementType(),
-               "Widening of this Integer type not supported !");
-#endif
-
   MVT v128i1Ty = MVT::v128i1;
   MVT v128i2Ty = MVT::v128i2;
   MVT v8i32Ty = MVT::v8i32;
@@ -229,5 +224,4 @@ TEST(ScalableVectorMVTsTest, WideningIntegerMVTs) {
   EXPECT_EQ(v128i1Ty.widenIntegerElementType(), v128i2Ty);
   EXPECT_EQ(v8i32Ty.widenIntegerElementType(), v8i64Ty);
 }
-
 } // end anonymous namespace

>From 83033b265fda0b36d4f47bd5427bddc69e3682b0 Mon Sep 17 00:00:00 2001
From: chirag <chirag198838 at gmail.com>
Date: Thu, 2 Jul 2026 14:55:02 +0530
Subject: [PATCH 9/9] [DAG] Adding MVT::widenIntegerElementType to widen both
 Scalar and Vectors of integer type. e.g. i16 -> i32, v8i32->v8i64.

---
 llvm/include/llvm/CodeGenTypes/MachineValueType.h | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/llvm/include/llvm/CodeGenTypes/MachineValueType.h b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
index 5d5123195d730..a0dc40b520c0b 100644
--- a/llvm/include/llvm/CodeGenTypes/MachineValueType.h
+++ b/llvm/include/llvm/CodeGenTypes/MachineValueType.h
@@ -272,24 +272,17 @@ namespace llvm {
       return MVT::getVectorVT(EltVT, EltCnt * 2);
     }
 
-    MVT placeholder_206783(MVT EltVT) const {
-      EltVT = EltVT.getScalarType();
-      return isVector() ? changeVectorElementType(EltVT) : EltVT;
-    }
-
-    // Return a VT for an Integer type doubled in size
+    // Return a VT for an Integer or vetor of integer type doubled in size
     MVT widenIntegerElementType() const {
       const MVT BaseTy = getScalarType();
-      assert(BaseTy.isInteger() &&
-             "Not an integer or vector of integer MVT!");
+      assert(BaseTy.isInteger() && "Not an integer or vector of integer MVT!");
       assert((BaseTy != MVT::LAST_INTEGER_VALUETYPE) &&
              "Widening of this Integer type not supported !");
 
       MVT ResTy =
-          placeholder_206783(getIntegerVT(BaseTy.getScalarSizeInBits() * 2));
+          changeElementType(getIntegerVT(BaseTy.getScalarSizeInBits() * 2));
       assert(ResTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
              "Failed to widened to a valid MVT!");
-
       return ResTy;
     }
 



More information about the llvm-commits mailing list