[Mlir-commits] [mlir] [mlir][LLVMIR] Extend FP array-splat constant lowering (PR #192378)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Apr 15 19:53:06 PDT 2026
https://github.com/zackc6 created https://github.com/llvm/llvm-project/pull/192378
Handle floating-point compatible array splats in the ConstantDataArray path using bit-pattern based ConstantDataArray::getFP construction, instead of only specializing integer element types.
>From e2d7ac287c8158237ec64f05612fc14b2d3ff962 Mon Sep 17 00:00:00 2001
From: zack <zackchen666 at gmail.com>
Date: Thu, 16 Apr 2026 09:38:06 +0800
Subject: [PATCH] [mlir][LLVMIR] Extend FP array-splat constant lowering
Handle floating-point compatible array splats in the ConstantDataArray path using bit-pattern based ConstantDataArray::getFP construction, instead of only specializing integer element types.
---
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 21 ++++++++++++++++-
mlir/test/Target/LLVMIR/llvmir.mlir | 24 ++++++++++++++++++++
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 7818c2f9e6fc9..f29e7f7caa698 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -658,7 +658,6 @@ llvm::Constant *mlir::LLVM::detail::getLLVMConstant(
return llvm::ConstantAggregateZero::get(arrayType);
}
if (llvm::ConstantDataSequential::isElementTypeCompatible(elementType)) {
- // TODO: Handle all compatible types. This code only handles integer.
if (isa<llvm::IntegerType>(elementType)) {
if (llvm::ConstantInt *ci = dyn_cast<llvm::ConstantInt>(child)) {
if (ci->getBitWidth() == 8) {
@@ -683,6 +682,26 @@ llvm::Constant *mlir::LLVM::detail::getLLVMConstant(
}
}
}
+ if (elementType->isFloatingPointTy()) {
+ if (llvm::ConstantFP *cfp = dyn_cast<llvm::ConstantFP>(child)) {
+ APInt bitPattern = cfp->getValueAPF().bitcastToAPInt();
+ uint64_t value = bitPattern.getZExtValue();
+ // TODO: This code only handles 16, 32, and 64 bit floats. Handle
+ // all compatible types, fp8, fp4, etc.
+ if (bitPattern.getBitWidth() == 16) {
+ SmallVector<uint16_t> constants(numElements, value);
+ return llvm::ConstantDataArray::getFP(elementType, constants);
+ }
+ if (bitPattern.getBitWidth() == 32) {
+ SmallVector<uint32_t> constants(numElements, value);
+ return llvm::ConstantDataArray::getFP(elementType, constants);
+ }
+ if (bitPattern.getBitWidth() == 64) {
+ SmallVector<uint64_t> constants(numElements, value);
+ return llvm::ConstantDataArray::getFP(elementType, constants);
+ }
+ }
+ }
}
// std::vector is used here to accomodate large number of elements that
// exceed SmallVector capacity.
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index ef4082d88853f..c3b3b3ba1cfe5 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -33,6 +33,30 @@ llvm.mlir.global internal @float_global(0.0: f32) : f32
// CHECK: @float_global_array = internal global [1 x float] [float -5.000000e+00]
llvm.mlir.global internal @float_global_array(dense<[-5.0]> : vector<1xf32>) : !llvm.array<1 x f32>
+// CHECK: @splat_float_global_array = internal global [4 x float] [float 4.200000e+01, float 4.200000e+01, float 4.200000e+01, float 4.200000e+01]
+llvm.mlir.global internal @splat_float_global_array(dense<42.0> : tensor<4xf32>) : !llvm.array<4 x f32>
+
+// CHECK: @splat_double_global_array = internal global [3 x double] [double 4.200000e+01, double 4.200000e+01, double 4.200000e+01]
+llvm.mlir.global internal @splat_double_global_array(dense<42.0> : tensor<3xf64>) : !llvm.array<3 x f64>
+
+// CHECK: @splat_neg_float_global_array = internal global [4 x float] [float -1.350000e+01, float -1.350000e+01, float -1.350000e+01, float -1.350000e+01]
+llvm.mlir.global internal @splat_neg_float_global_array(dense<-13.5> : tensor<4xf32>) : !llvm.array<4 x f32>
+
+// CHECK: @splat_neg_double_global_array = internal global [3 x double] [double -1.350000e+01, double -1.350000e+01, double -1.350000e+01]
+llvm.mlir.global internal @splat_neg_double_global_array(dense<-13.5> : tensor<3xf64>) : !llvm.array<3 x f64>
+
+// CHECK: @splat_half_global_array = internal global [4 x half] [half 0xH5140, half 0xH5140, half 0xH5140, half 0xH5140]
+llvm.mlir.global internal @splat_half_global_array(dense<42.0> : tensor<4xf16>) : !llvm.array<4 x f16>
+
+// CHECK: @splat_bfloat_global_array = internal global [3 x bfloat] [bfloat 0xR4228, bfloat 0xR4228, bfloat 0xR4228]
+llvm.mlir.global internal @splat_bfloat_global_array(dense<42.0> : tensor<3xbf16>) : !llvm.array<3 x bf16>
+
+// CHECK: @splat_neg_half_global_array = internal global [4 x half] [half 0xHCAC0, half 0xHCAC0, half 0xHCAC0, half 0xHCAC0]
+llvm.mlir.global internal @splat_neg_half_global_array(dense<-13.5> : tensor<4xf16>) : !llvm.array<4 x f16>
+
+// CHECK: @splat_neg_bfloat_global_array = internal global [3 x bfloat] [bfloat 0xRC158, bfloat 0xRC158, bfloat 0xRC158]
+llvm.mlir.global internal @splat_neg_bfloat_global_array(dense<-13.5> : tensor<3xbf16>) : !llvm.array<3 x bf16>
+
// CHECK: @string_const = internal constant [6 x i8] c"foobar"
llvm.mlir.global internal constant @string_const("foobar") : !llvm.array<6 x i8>
More information about the Mlir-commits
mailing list