[Mlir-commits] [mlir] [MLIR][DLTI] Fix access to Data Layout info in -to-llvm's type converter (PR #127239)
Rolf Morel
llvmlistbot at llvm.org
Wed Apr 15 04:16:10 PDT 2026
https://github.com/rolfmorel updated https://github.com/llvm/llvm-project/pull/127239
>From 2791e8e07da15290072f5191429aeec0fb538633 Mon Sep 17 00:00:00 2001
From: Rolf Morel <rolf.morel at intel.com>
Date: Fri, 14 Feb 2025 10:35:14 -0800
Subject: [PATCH 1/2] [MLIR][DLTI] Fix type converter-to-llvm access to Data
Layout info
---
mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
index 673ba814d338f..093ac02bb004d 100644
--- a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
+++ b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
@@ -169,7 +169,9 @@ struct DynamicConvertToLLVM : public ConvertToLLVMPassInterface {
target.addLegalDialect<LLVM::LLVMDialect>();
// Get the data layout analysis.
const auto &dlAnalysis = manager.getAnalysis<DataLayoutAnalysis>();
- LLVMTypeConverter typeConverter(context, &dlAnalysis);
+ LowerToLLVMOptions options(op->getContext(),
+ dlAnalysis.getAtOrAbove(op));
+ LLVMTypeConverter typeConverter(context, options, &dlAnalysis);
// Configure the conversion with dialect level interfaces.
for (ConvertToLLVMPatternInterface *iface : *interfaces)
>From 7f8755bc283381e8c2b9009a25da14eae8cbf465 Mon Sep 17 00:00:00 2001
From: Rolf Morel <rolf.morel at intel.com>
Date: Wed, 15 Apr 2026 04:15:47 -0700
Subject: [PATCH 2/2] Save
---
.../ConvertToLLVM/ConvertToLLVMPass.cpp | 3 +-
.../Conversion/IndexToLLVM/IndexToLLVM.cpp | 12 ++++---
.../Conversion/IndexToLLVM/index-to-llvm.mlir | 31 +++++++++++++++++--
.../MemRefToLLVM/memref-to-llvm.mlir | 2 ++
4 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
index 093ac02bb004d..9448db3e9d298 100644
--- a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
+++ b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
@@ -169,8 +169,7 @@ struct DynamicConvertToLLVM : public ConvertToLLVMPassInterface {
target.addLegalDialect<LLVM::LLVMDialect>();
// Get the data layout analysis.
const auto &dlAnalysis = manager.getAnalysis<DataLayoutAnalysis>();
- LowerToLLVMOptions options(op->getContext(),
- dlAnalysis.getAtOrAbove(op));
+ LowerToLLVMOptions options(op->getContext(), dlAnalysis.getAtOrAbove(op));
LLVMTypeConverter typeConverter(context, options, &dlAnalysis);
// Configure the conversion with dialect level interfaces.
diff --git a/mlir/lib/Conversion/IndexToLLVM/IndexToLLVM.cpp b/mlir/lib/Conversion/IndexToLLVM/IndexToLLVM.cpp
index 0473bb59fa6aa..d9f34b607f62d 100644
--- a/mlir/lib/Conversion/IndexToLLVM/IndexToLLVM.cpp
+++ b/mlir/lib/Conversion/IndexToLLVM/IndexToLLVM.cpp
@@ -8,6 +8,7 @@
#include "mlir/Conversion/IndexToLLVM/IndexToLLVM.h"
+#include "mlir/Analysis/DataLayoutAnalysis.h"
#include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"
#include "mlir/Conversion/LLVMCommon/Pattern.h"
#include "mlir/Dialect/Index/IR/IndexAttrs.h"
@@ -348,23 +349,26 @@ struct ConvertIndexToLLVMPass
} // namespace
void ConvertIndexToLLVMPass::runOnOperation() {
+ Operation *op = getOperation();
+
// Configure dialect conversion.
ConversionTarget target(getContext());
target.addIllegalDialect<IndexDialect>();
target.addLegalDialect<LLVM::LLVMDialect>();
// Set LLVM lowering options.
- LowerToLLVMOptions options(&getContext());
+ const auto &dataLayoutAnalysis = getAnalysis<DataLayoutAnalysis>();
+ LowerToLLVMOptions options(&getContext(),
+ dataLayoutAnalysis.getAtOrAbove(op));
if (indexBitwidth != kDeriveIndexBitwidthFromDataLayout)
options.overrideIndexBitwidth(indexBitwidth);
- LLVMTypeConverter typeConverter(&getContext(), options);
+ LLVMTypeConverter typeConverter(&getContext(), options, &dataLayoutAnalysis);
// Populate patterns and run the conversion.
RewritePatternSet patterns(&getContext());
populateIndexToLLVMConversionPatterns(typeConverter, patterns);
- if (failed(
- applyPartialConversion(getOperation(), target, std::move(patterns))))
+ if (failed(applyPartialConversion(op, target, std::move(patterns))))
return signalPassFailure();
}
diff --git a/mlir/test/Conversion/IndexToLLVM/index-to-llvm.mlir b/mlir/test/Conversion/IndexToLLVM/index-to-llvm.mlir
index 26abb3bdc23a1..3087140605ade 100644
--- a/mlir/test/Conversion/IndexToLLVM/index-to-llvm.mlir
+++ b/mlir/test/Conversion/IndexToLLVM/index-to-llvm.mlir
@@ -1,10 +1,10 @@
// RUN: mlir-opt %s -convert-index-to-llvm | FileCheck %s
-// RUN: mlir-opt %s -convert-index-to-llvm=index-bitwidth=32 | FileCheck %s --check-prefix=INDEX32
-// RUN: mlir-opt %s -convert-index-to-llvm=index-bitwidth=64 | FileCheck %s --check-prefix=INDEX64
+// RN: mlir-opt %s -convert-index-to-llvm=index-bitwidth=32 | FileCheck %s --check-prefix=INDEX32
+// RN: mlir-opt %s -convert-index-to-llvm=index-bitwidth=64 | FileCheck %s --check-prefix=INDEX64
// Same below, but using the `ConvertToLLVMPatternInterface` entry point
// and the generic `convert-to-llvm` pass.
-// RUN: mlir-opt --convert-to-llvm="filter-dialects=index" --split-input-file %s | FileCheck %s
+// RN: mlir-opt --convert-to-llvm="filter-dialects=index" --split-input-file %s | FileCheck %s
// CHECK-LABEL: @trivial_ops
func.func @trivial_ops(%a: index, %b: index) {
@@ -194,3 +194,28 @@ func.func @index_constant() {
%3 = index.constant 3000000000
return
}
+
+module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<index, 32>> } {
+// CHECK-LABEL: @index_constant
+// INDEX32-LABEL: @index_constant
+// INDEX64-LABEL: @index_constant
+func.func @index_constant() {
+ // CHECK: llvm.mlir.constant(-2100000000 : i16) : i16
+ // INDEX32: llvm.mlir.constant(-2100000000 : i32) : i32
+ // INDEX64: llvm.mlir.constant(-2100000000 : i64) : i64
+ %0 = index.constant -2100000000
+ // CHECK: llvm.mlir.constant(2100000000 : i16) : i16
+ // INDEX32: llvm.mlir.constant(2100000000 : i32) : i32
+ // INDEX64: llvm.mlir.constant(2100000000 : i64) : i64
+ %1 = index.constant 2100000000
+ // CHECK: llvm.mlir.constant(1294967296 : i16) : i16
+ // INDEX32: llvm.mlir.constant(1294967296 : i32) : i32
+ // INDEX64: llvm.mlir.constant(-3000000000 : i64) : i64
+ %2 = index.constant -3000000000
+ // CHECK: llvm.mlir.constant(1294967296 : i16) : i16
+ // INDEX32: llvm.mlir.constant(-1294967296 : i32) : i32
+ // INDEX64: llvm.mlir.constant(3000000000 : i64) : i64
+ %3 = index.constant 3000000000
+ return
+}
+}
\ No newline at end of file
diff --git a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
index 523e894aaef8d..9a85ea5ff2f4a 100644
--- a/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
+++ b/mlir/test/Conversion/MemRefToLLVM/memref-to-llvm.mlir
@@ -622,6 +622,7 @@ func.func @extract_aligned_pointer_as_index_unranked(%m: memref<*xf32>) -> index
// CHECK: %[[SIZE1:.*]] = llvm.extractvalue %[[MEM_DESC]][3, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
// CHECK: %[[STRIDE0:.*]] = llvm.extractvalue %[[MEM_DESC]][4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
// CHECK: %[[STRIDE1:.*]] = llvm.extractvalue %[[MEM_DESC]][4, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
+module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<index, 32>> } {
func.func @extract_strided_metadata(
%ref: memref<?x?xf32, strided<[?,?], offset: ?>>) {
@@ -633,6 +634,7 @@ func.func @extract_strided_metadata(
return
}
+}
// -----
More information about the Mlir-commits
mailing list