[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