[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