[Mlir-commits] [mlir] [MLIR][LLVMIR] Add support for importing ConstantInt/FP vector splats. (PR #180946)

Paul Walker llvmlistbot at llvm.org
Wed Feb 11 06:10:09 PST 2026


https://github.com/paulwalker-arm created https://github.com/llvm/llvm-project/pull/180946

Updates LLVM IR importing to remove the assumption that ConstantInt/ConstantFP are always scalar.  

NOTE: The first commit shows the erroneous result when the --use-constant-int-for-fixed-length-splat option is enabled. The goal is to make this and related options the default.

>From e98a4c17b6a423f8fad9e3b4c359248c08589052 Mon Sep 17 00:00:00 2001
From: Paul Walker <paul.walker at arm.com>
Date: Wed, 11 Feb 2026 12:48:01 +0000
Subject: [PATCH 1/2] Add tests for constant vector splats.

---
 mlir/test/Target/LLVMIR/Import/constant.ll | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/mlir/test/Target/LLVMIR/Import/constant.ll b/mlir/test/Target/LLVMIR/Import/constant.ll
index ddf29c6d2f380..75f9a3dfe1a06 100644
--- a/mlir/test/Target/LLVMIR/Import/constant.ll
+++ b/mlir/test/Target/LLVMIR/Import/constant.ll
@@ -1,4 +1,5 @@
-; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
+; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s --check-prefixes=CHECK,CHECK-CV
+; RUN: mlir-translate -import-llvm -split-input-file --use-constant-int-for-fixed-length-splat --use-constant-fp-for-fixed-length-splat %s | FileCheck %s --check-prefixes=CHECK,CHECK-CI
 
 ; CHECK-LABEL: @int_constants
 define void @int_constants(i16 %arg0, i32 %arg1, i1 %arg2) {
@@ -308,3 +309,13 @@ define [0 x ptr] @load_zero_array() {
 @global_array_with_elements = global [3 x i32] zeroinitializer
 
 ; CHECK: llvm.mlir.global external @global_array_with_elements({{.*}}) {addr_space = 0 : i32} : !llvm.array<3 x i32>
+
+; Test that vector splats work correctly.
+
+ at vector_splat_int = global <2 x i64> splat (i64 7)
+ at vector_splat_float = global <2 x float> splat (float 7.0)
+
+; CHECK-CV: llvm.mlir.global external @vector_splat_int(dense<7> : vector<2xi64>) {addr_space = 0 : i32} : vector<2xi64>
+; CHECK-CV: llvm.mlir.global external @vector_splat_float(dense<7.000000e+00> : vector<2xf32>) {addr_space = 0 : i32} : vector<2xf32>
+; CHECK-CI: llvm.mlir.global external @vector_splat_int(7 : i64) {addr_space = 0 : i32} : vector<2xi64>
+; CHECK-CI: llvm.mlir.global external @vector_splat_float(7.000000e+00 : f32) {addr_space = 0 : i32} : vector<2xf32>

>From 9f21c71a6884429b4126ee91bb12fe33d19587c6 Mon Sep 17 00:00:00 2001
From: Paul Walker <paul.walker at arm.com>
Date: Fri, 6 Feb 2026 18:22:26 +0000
Subject: [PATCH 2/2] [MLIR][LLVMIR] Add support for importing ConstantInt/FP
 vector splats.

---
 mlir/lib/Target/LLVMIR/ModuleImport.cpp    | 14 ++++++++++++++
 mlir/test/Target/LLVMIR/Import/constant.ll | 10 ++++------
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index 8f3c2759d6f64..f126acbaaa774 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -1221,6 +1221,9 @@ static TypedAttr getScalarConstantAsAttr(OpBuilder &builder,
                                          llvm::Constant *constScalar) {
   MLIRContext *context = builder.getContext();
 
+  if (constScalar->getType()->isVectorTy())
+    return {};
+
   // Convert scalar integers.
   if (auto *constInt = dyn_cast<llvm::ConstantInt>(constScalar)) {
     return builder.getIntegerAttr(
@@ -1270,6 +1273,17 @@ Attribute ModuleImport::getConstantAsAttr(llvm::Constant *constant) {
         getBuiltinTypeForAttr(convertType(type)));
   };
 
+  // Convert constant vector splat values.
+  if (isa<llvm::ConstantInt, llvm::ConstantFP>(constant)) {
+    assert(constant->getType()->isVectorTy() && "expected a vector splat");
+    auto shape = getConstantShape(constant->getType());
+    if (!shape)
+      return {};
+    Attribute splatAttr = getScalarConstantAsAttr(
+          builder, constant->getSplatValue());
+    return SplatElementsAttr::get(shape, splatAttr);
+  }
+
   // Convert one-dimensional constant arrays or vectors that store 1/2/4/8-byte
   // integer or half/bfloat/float/double values.
   if (auto *constArray = dyn_cast<llvm::ConstantDataSequential>(constant)) {
diff --git a/mlir/test/Target/LLVMIR/Import/constant.ll b/mlir/test/Target/LLVMIR/Import/constant.ll
index 75f9a3dfe1a06..042792d7d5c8a 100644
--- a/mlir/test/Target/LLVMIR/Import/constant.ll
+++ b/mlir/test/Target/LLVMIR/Import/constant.ll
@@ -1,5 +1,5 @@
-; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s --check-prefixes=CHECK,CHECK-CV
-; RUN: mlir-translate -import-llvm -split-input-file --use-constant-int-for-fixed-length-splat --use-constant-fp-for-fixed-length-splat %s | FileCheck %s --check-prefixes=CHECK,CHECK-CI
+; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
+; RUN: mlir-translate -import-llvm -split-input-file --use-constant-int-for-fixed-length-splat --use-constant-fp-for-fixed-length-splat %s | FileCheck %s
 
 ; CHECK-LABEL: @int_constants
 define void @int_constants(i16 %arg0, i32 %arg1, i1 %arg2) {
@@ -315,7 +315,5 @@ define [0 x ptr] @load_zero_array() {
 @vector_splat_int = global <2 x i64> splat (i64 7)
 @vector_splat_float = global <2 x float> splat (float 7.0)
 
-; CHECK-CV: llvm.mlir.global external @vector_splat_int(dense<7> : vector<2xi64>) {addr_space = 0 : i32} : vector<2xi64>
-; CHECK-CV: llvm.mlir.global external @vector_splat_float(dense<7.000000e+00> : vector<2xf32>) {addr_space = 0 : i32} : vector<2xf32>
-; CHECK-CI: llvm.mlir.global external @vector_splat_int(7 : i64) {addr_space = 0 : i32} : vector<2xi64>
-; CHECK-CI: llvm.mlir.global external @vector_splat_float(7.000000e+00 : f32) {addr_space = 0 : i32} : vector<2xf32>
+; CHECK: llvm.mlir.global external @vector_splat_int(dense<7> : vector<2xi64>) {addr_space = 0 : i32} : vector<2xi64>
+; CHECK: llvm.mlir.global external @vector_splat_float(dense<7.000000e+00> : vector<2xf32>) {addr_space = 0 : i32} : vector<2xf32>



More information about the Mlir-commits mailing list