[Mlir-commits] [mlir] Expand the MemRefToEmitC pass - Adding scalars (PR #148055)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Jul 17 12:57:07 PDT 2025


https://github.com/ajaden-codes updated https://github.com/llvm/llvm-project/pull/148055

>From a86bd7a3a5fc428899d36e312ef7bdace1689180 Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Mon, 7 Jul 2025 18:49:20 +0000
Subject: [PATCH 1/8] Initial work on memref ops

---
 .../MemRefToEmitC/MemRefToEmitC.cpp           | 37 ++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index db244d1d1cac8..742d2bfff27de 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -77,6 +77,31 @@ struct ConvertAlloca final : public OpConversionPattern<memref::AllocaOp> {
   }
 };
 
+struct ConvertCopy final : public OpConversionPattern<memref::CopyOp> {
+  using OpConversionPattern::OpConversionPattern;
+
+  LogicalResult
+  matchAndRewrite(memref::CopyOp op, OpAdaptor operands,
+                  ConversionPatternRewriter &rewriter) const override {
+    return failure();
+  }
+};
+
+static Type convertGlobalMemrefTypeToEmitc(MemRefType type,
+                                           const TypeConverter &typeConverter) {
+  Type elementType = typeConverter.convertType(type.getElementType());
+  Type arrayTy = elementType;
+  // Shape has the outermost dim at index 0, so need to walk it backwards
+  auto shape = type.getShape();
+  if (shape.empty()) {
+    arrayTy = emitc::ArrayType::get({1}, arrayTy);
+  } else {
+    // For non-zero dimensions, use the original shape
+    arrayTy = emitc::ArrayType::get(shape, arrayTy);
+  }
+  return arrayTy;
+}
+
 struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
   using OpConversionPattern::OpConversionPattern;
 
@@ -95,7 +120,8 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
           op.getLoc(), "global variable with alignment requirement is "
                        "currently not supported");
     }
-    auto resultTy = getTypeConverter()->convertType(op.getType());
+    auto resultTy =
+        convertGlobalMemrefTypeToEmitc(op.getType(), *getTypeConverter());
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
                                          "cannot convert result type");
@@ -114,6 +140,15 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
     bool externSpecifier = !staticSpecifier;
 
     Attribute initialValue = operands.getInitialValueAttr();
+    if (op.getType().getRank() == 0) {
+      auto elementsAttr = llvm::cast<ElementsAttr>(*op.getInitialValue());
+      auto scalarValue = elementsAttr.getSplatValue<Attribute>();
+
+      // Convert scalar value to single-element array
+      initialValue = DenseElementsAttr::get(
+          RankedTensorType::get({1}, elementsAttr.getElementType()),
+          {scalarValue});
+    }
     if (isa_and_present<UnitAttr>(initialValue))
       initialValue = {};
 

>From d62dd8d8c95106a9c836eff235a623e0b8e638be Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Thu, 10 Jul 2025 20:36:08 +0000
Subject: [PATCH 2/8] Convert scalars to constants

---
 .../MemRefToEmitC/MemRefToEmitC.cpp           | 43 ++++++++-----------
 1 file changed, 19 insertions(+), 24 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index 742d2bfff27de..f69a362395ef6 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -87,28 +87,13 @@ struct ConvertCopy final : public OpConversionPattern<memref::CopyOp> {
   }
 };
 
-static Type convertGlobalMemrefTypeToEmitc(MemRefType type,
-                                           const TypeConverter &typeConverter) {
-  Type elementType = typeConverter.convertType(type.getElementType());
-  Type arrayTy = elementType;
-  // Shape has the outermost dim at index 0, so need to walk it backwards
-  auto shape = type.getShape();
-  if (shape.empty()) {
-    arrayTy = emitc::ArrayType::get({1}, arrayTy);
-  } else {
-    // For non-zero dimensions, use the original shape
-    arrayTy = emitc::ArrayType::get(shape, arrayTy);
-  }
-  return arrayTy;
-}
-
 struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
   using OpConversionPattern::OpConversionPattern;
 
   LogicalResult
   matchAndRewrite(memref::GlobalOp op, OpAdaptor operands,
                   ConversionPatternRewriter &rewriter) const override {
-
+    auto type = op.getType();
     if (!op.getType().hasStaticShape()) {
       return rewriter.notifyMatchFailure(
           op.getLoc(), "cannot transform global with dynamic shape");
@@ -120,8 +105,23 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
           op.getLoc(), "global variable with alignment requirement is "
                        "currently not supported");
     }
-    auto resultTy =
-        convertGlobalMemrefTypeToEmitc(op.getType(), *getTypeConverter());
+    // auto resultTy =
+    //     convertGlobalMemrefTypeToEmitc(op.getType(), *getTypeConverter());
+    Type resultTy;
+    Type elementType = getTypeConverter()->convertType(type.getElementType());
+    auto shape = type.getShape();
+
+    if (shape.empty()) {
+      if (emitc::isSupportedFloatType(elementType)) {
+        resultTy = rewriter.getF32Type();
+      }
+      if (emitc::isSupportedIntegerType(elementType)) {
+        resultTy = rewriter.getIntegerType(elementType.getIntOrFloatBitWidth());
+      }
+    } else {
+      resultTy = emitc::ArrayType::get(shape, elementType);
+    }
+
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
                                          "cannot convert result type");
@@ -142,12 +142,7 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
     Attribute initialValue = operands.getInitialValueAttr();
     if (op.getType().getRank() == 0) {
       auto elementsAttr = llvm::cast<ElementsAttr>(*op.getInitialValue());
-      auto scalarValue = elementsAttr.getSplatValue<Attribute>();
-
-      // Convert scalar value to single-element array
-      initialValue = DenseElementsAttr::get(
-          RankedTensorType::get({1}, elementsAttr.getElementType()),
-          {scalarValue});
+      initialValue = elementsAttr.getSplatValue<Attribute>();
     }
     if (isa_and_present<UnitAttr>(initialValue))
       initialValue = {};

>From 263d6e06347381262b9cf28fda74ee213179da7b Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Thu, 10 Jul 2025 23:47:46 +0000
Subject: [PATCH 3/8] global and getGlobal

---
 .../MemRefToEmitC/MemRefToEmitC.cpp           | 48 ++++++++-----------
 .../MemRefToEmitC/memref-to-emitc.mlir        |  4 ++
 2 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index f69a362395ef6..e55c8e48ad105 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -16,7 +16,9 @@
 #include "mlir/Dialect/EmitC/IR/EmitC.h"
 #include "mlir/Dialect/MemRef/IR/MemRef.h"
 #include "mlir/IR/Builders.h"
+#include "mlir/IR/BuiltinTypes.h"
 #include "mlir/IR/PatternMatch.h"
+#include "mlir/IR/TypeRange.h"
 #include "mlir/Transforms/DialectConversion.h"
 
 using namespace mlir;
@@ -77,23 +79,13 @@ struct ConvertAlloca final : public OpConversionPattern<memref::AllocaOp> {
   }
 };
 
-struct ConvertCopy final : public OpConversionPattern<memref::CopyOp> {
-  using OpConversionPattern::OpConversionPattern;
-
-  LogicalResult
-  matchAndRewrite(memref::CopyOp op, OpAdaptor operands,
-                  ConversionPatternRewriter &rewriter) const override {
-    return failure();
-  }
-};
-
 struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
   using OpConversionPattern::OpConversionPattern;
 
   LogicalResult
   matchAndRewrite(memref::GlobalOp op, OpAdaptor operands,
                   ConversionPatternRewriter &rewriter) const override {
-    auto type = op.getType();
+    MemRefType type = op.getType();
     if (!op.getType().hasStaticShape()) {
       return rewriter.notifyMatchFailure(
           op.getLoc(), "cannot transform global with dynamic shape");
@@ -105,22 +97,12 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
           op.getLoc(), "global variable with alignment requirement is "
                        "currently not supported");
     }
-    // auto resultTy =
-    //     convertGlobalMemrefTypeToEmitc(op.getType(), *getTypeConverter());
+
     Type resultTy;
-    Type elementType = getTypeConverter()->convertType(type.getElementType());
-    auto shape = type.getShape();
-
-    if (shape.empty()) {
-      if (emitc::isSupportedFloatType(elementType)) {
-        resultTy = rewriter.getF32Type();
-      }
-      if (emitc::isSupportedIntegerType(elementType)) {
-        resultTy = rewriter.getIntegerType(elementType.getIntOrFloatBitWidth());
-      }
-    } else {
-      resultTy = emitc::ArrayType::get(shape, elementType);
-    }
+    if (type.getRank() == 0)
+      resultTy = getTypeConverter()->convertType(type.getElementType());
+    else
+      resultTy = getTypeConverter()->convertType(type);
 
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
@@ -140,7 +122,7 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
     bool externSpecifier = !staticSpecifier;
 
     Attribute initialValue = operands.getInitialValueAttr();
-    if (op.getType().getRank() == 0) {
+    if (type.getRank() == 0) {
       auto elementsAttr = llvm::cast<ElementsAttr>(*op.getInitialValue());
       initialValue = elementsAttr.getSplatValue<Attribute>();
     }
@@ -162,7 +144,17 @@ struct ConvertGetGlobal final
   matchAndRewrite(memref::GetGlobalOp op, OpAdaptor operands,
                   ConversionPatternRewriter &rewriter) const override {
 
-    auto resultTy = getTypeConverter()->convertType(op.getType());
+    MemRefType type = op.getType();
+    Type resultTy;
+    if (type.getRank() == 0)
+      resultTy = emitc::LValueType::get(
+          getTypeConverter()->convertType(type.getElementType()));
+    else
+      resultTy = getTypeConverter()->convertType(type);
+
+    if (!resultTy)
+      return rewriter.notifyMatchFailure(op.getLoc(), "cannot convert type");
+
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
                                          "cannot convert result type");
diff --git a/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir b/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
index d37fd1de90add..445a28534325a 100644
--- a/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
+++ b/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
@@ -41,6 +41,8 @@ func.func @memref_load(%buff : memref<4x8xf32>, %i: index, %j: index) -> f32 {
 module @globals {
   memref.global "private" constant @internal_global : memref<3x7xf32> = dense<4.0>
   // CHECK-NEXT: emitc.global static const @internal_global : !emitc.array<3x7xf32> = dense<4.000000e+00>
+  memref.global "private" constant @__constant_xi32 : memref<i32> = dense<-1>
+  // CHECK-NEXT: emitc.global static const @__constant_xi32 : i32 = -1
   memref.global @public_global : memref<3x7xf32>
   // CHECK-NEXT: emitc.global extern @public_global : !emitc.array<3x7xf32>
   memref.global @uninitialized_global : memref<3x7xf32> = uninitialized
@@ -50,6 +52,8 @@ module @globals {
   func.func @use_global() {
     // CHECK-NEXT: emitc.get_global @public_global : !emitc.array<3x7xf32>
     %0 = memref.get_global @public_global : memref<3x7xf32>
+    // CHECK- NEXT: emitc.get_global @__constant_xi32 : !emitc.lvalue<i32>
+    %1 = memref.get_global @__constant_xi32 : memref<i32>
     return
   }
 }

>From 5612d99a12e510d943389f69fd04f9b05560a3a6 Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Mon, 14 Jul 2025 17:24:24 +0000
Subject: [PATCH 4/8] Use a helper when you can

---
 .../MemRefToEmitC/MemRefToEmitC.cpp           | 34 +++++++++----------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index e55c8e48ad105..4c5d03f8ffe5e 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -79,13 +79,23 @@ struct ConvertAlloca final : public OpConversionPattern<memref::AllocaOp> {
   }
 };
 
+Type convertMemRefType(MemRefType opTy, const TypeConverter *typeConverter) {
+  Type resultTy;
+  if (opTy.getRank() == 0) {
+    resultTy = typeConverter->convertType(mlir::getElementTypeOrSelf(opTy));
+  } else {
+    resultTy = typeConverter->convertType(opTy);
+  }
+  return resultTy;
+}
+
 struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
   using OpConversionPattern::OpConversionPattern;
 
   LogicalResult
   matchAndRewrite(memref::GlobalOp op, OpAdaptor operands,
                   ConversionPatternRewriter &rewriter) const override {
-    MemRefType type = op.getType();
+    MemRefType opTy = op.getType();
     if (!op.getType().hasStaticShape()) {
       return rewriter.notifyMatchFailure(
           op.getLoc(), "cannot transform global with dynamic shape");
@@ -98,11 +108,7 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
                        "currently not supported");
     }
 
-    Type resultTy;
-    if (type.getRank() == 0)
-      resultTy = getTypeConverter()->convertType(type.getElementType());
-    else
-      resultTy = getTypeConverter()->convertType(type);
+    Type resultTy = convertMemRefType(opTy, getTypeConverter());
 
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
@@ -122,7 +128,7 @@ struct ConvertGlobal final : public OpConversionPattern<memref::GlobalOp> {
     bool externSpecifier = !staticSpecifier;
 
     Attribute initialValue = operands.getInitialValueAttr();
-    if (type.getRank() == 0) {
+    if (opTy.getRank() == 0) {
       auto elementsAttr = llvm::cast<ElementsAttr>(*op.getInitialValue());
       initialValue = elementsAttr.getSplatValue<Attribute>();
     }
@@ -144,16 +150,10 @@ struct ConvertGetGlobal final
   matchAndRewrite(memref::GetGlobalOp op, OpAdaptor operands,
                   ConversionPatternRewriter &rewriter) const override {
 
-    MemRefType type = op.getType();
-    Type resultTy;
-    if (type.getRank() == 0)
-      resultTy = emitc::LValueType::get(
-          getTypeConverter()->convertType(type.getElementType()));
-    else
-      resultTy = getTypeConverter()->convertType(type);
-
-    if (!resultTy)
-      return rewriter.notifyMatchFailure(op.getLoc(), "cannot convert type");
+    MemRefType opTy = op.getType();
+    Type resultTy = convertMemRefType(opTy, getTypeConverter());
+    if (opTy.getRank() == 0)
+      resultTy = emitc::LValueType::get(resultTy);
 
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),

>From 2950fd0e2c5564b8006abcd6e9d5147665b0084a Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Mon, 14 Jul 2025 17:44:57 +0000
Subject: [PATCH 5/8] Lower to pointer type

---
 mlir/include/mlir/Dialect/EmitC/IR/EmitC.td         | 6 ++++--
 mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp | 2 +-
 mlir/lib/Dialect/EmitC/IR/EmitC.cpp                 | 9 +++++++++
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
index 7fe2da8f7e044..4246751f142f8 100644
--- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
+++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
@@ -1267,7 +1267,8 @@ def EmitC_GetGlobalOp : EmitC_Op<"get_global",
   }];
 
   let arguments = (ins FlatSymbolRefAttr:$name);
-  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType]>:$result);
+  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType,
+                                 EmitC_PointerType]>:$result);
   let assemblyFormat = "$name `:` type($result) attr-dict";
 }
 
@@ -1686,7 +1687,8 @@ def EmitC_GetFieldOp
   }];
 
   let arguments = (ins FlatSymbolRefAttr:$field_name);
-  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType]>:$result);
+  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType,
+                                 EmitC_PointerType]>:$result);
   let assemblyFormat = "$field_name `:` type($result) attr-dict";
 }
 
diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index 4c5d03f8ffe5e..67af76dcfb442 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -153,7 +153,7 @@ struct ConvertGetGlobal final
     MemRefType opTy = op.getType();
     Type resultTy = convertMemRefType(opTy, getTypeConverter());
     if (opTy.getRank() == 0)
-      resultTy = emitc::LValueType::get(resultTy);
+      resultTy = emitc::PointerType::get(resultTy);
 
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
index fccbca6ed05dd..7bfb12bd01699 100644
--- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
+++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
@@ -1248,6 +1248,15 @@ GetGlobalOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
   }
 
   // global has non-array type
+  if (auto pointerType = llvm::dyn_cast<PointerType>(resultType)) {
+    if (pointerType.getPointee() != globalType) {
+      return emitOpError("on pointer type expects result pointee type ")
+             << pointerType.getPointee() << " to match type " << globalType
+             << " of the global @" << getName();
+    }
+    return success();
+  }
+
   auto lvalueType = dyn_cast<LValueType>(resultType);
   if (!lvalueType || lvalueType.getValueType() != globalType)
     return emitOpError("on non-array type expects result inner type ")

>From 82bd2b4a45de626c51716c7ff8fe60da5676eb29 Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Thu, 17 Jul 2025 19:28:44 +0000
Subject: [PATCH 6/8] Use an lvalue and apply op

---
 mlir/include/mlir/Dialect/EmitC/IR/EmitC.td         |  6 ++----
 mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp | 12 ++++++++++--
 mlir/lib/Dialect/EmitC/IR/EmitC.cpp                 |  9 ---------
 3 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
index 4246751f142f8..7fe2da8f7e044 100644
--- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
+++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
@@ -1267,8 +1267,7 @@ def EmitC_GetGlobalOp : EmitC_Op<"get_global",
   }];
 
   let arguments = (ins FlatSymbolRefAttr:$name);
-  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType,
-                                 EmitC_PointerType]>:$result);
+  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType]>:$result);
   let assemblyFormat = "$name `:` type($result) attr-dict";
 }
 
@@ -1687,8 +1686,7 @@ def EmitC_GetFieldOp
   }];
 
   let arguments = (ins FlatSymbolRefAttr:$field_name);
-  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType,
-                                 EmitC_PointerType]>:$result);
+  let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType]>:$result);
   let assemblyFormat = "$field_name `:` type($result) attr-dict";
 }
 
diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index 67af76dcfb442..f7df161943d48 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -152,13 +152,21 @@ struct ConvertGetGlobal final
 
     MemRefType opTy = op.getType();
     Type resultTy = convertMemRefType(opTy, getTypeConverter());
-    if (opTy.getRank() == 0)
-      resultTy = emitc::PointerType::get(resultTy);
 
     if (!resultTy) {
       return rewriter.notifyMatchFailure(op.getLoc(),
                                          "cannot convert result type");
     }
+
+    if (opTy.getRank() == 0) {
+      auto lvalueType = emitc::LValueType::get(resultTy);
+      auto globalLValue = rewriter.create<emitc::GetGlobalOp>(
+          op.getLoc(), lvalueType, operands.getNameAttr());
+      auto pointerType = emitc::PointerType::get(resultTy);
+      rewriter.replaceOpWithNewOp<emitc::ApplyOp>(
+          op, pointerType, rewriter.getStringAttr("&"), globalLValue);
+      return success();
+    }
     rewriter.replaceOpWithNewOp<emitc::GetGlobalOp>(op, resultTy,
                                                     operands.getNameAttr());
     return success();
diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
index 7bfb12bd01699..fccbca6ed05dd 100644
--- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
+++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp
@@ -1248,15 +1248,6 @@ GetGlobalOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
   }
 
   // global has non-array type
-  if (auto pointerType = llvm::dyn_cast<PointerType>(resultType)) {
-    if (pointerType.getPointee() != globalType) {
-      return emitOpError("on pointer type expects result pointee type ")
-             << pointerType.getPointee() << " to match type " << globalType
-             << " of the global @" << getName();
-    }
-    return success();
-  }
-
   auto lvalueType = dyn_cast<LValueType>(resultType);
   if (!lvalueType || lvalueType.getValueType() != globalType)
     return emitOpError("on non-array type expects result inner type ")

>From 1dc0e63e2022c48b7e795016f66c4563d29ac839 Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Thu, 17 Jul 2025 19:36:20 +0000
Subject: [PATCH 7/8] Update test file

---
 mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir b/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
index 445a28534325a..2b4eda37903d4 100644
--- a/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
+++ b/mlir/test/Conversion/MemRefToEmitC/memref-to-emitc.mlir
@@ -52,7 +52,8 @@ module @globals {
   func.func @use_global() {
     // CHECK-NEXT: emitc.get_global @public_global : !emitc.array<3x7xf32>
     %0 = memref.get_global @public_global : memref<3x7xf32>
-    // CHECK- NEXT: emitc.get_global @__constant_xi32 : !emitc.lvalue<i32>
+    // CHECK-NEXT: emitc.get_global @__constant_xi32 : !emitc.lvalue<i32>
+    // CHECK-NEXT: emitc.apply "&"(%1) : (!emitc.lvalue<i32>) -> !emitc.ptr<i32>
     %1 = memref.get_global @__constant_xi32 : memref<i32>
     return
   }

>From bc7b8e298c3d420be63f51813bdea4cdfd0dfeda Mon Sep 17 00:00:00 2001
From: Jaddyen <ajaden at google.com>
Date: Thu, 17 Jul 2025 19:55:08 +0000
Subject: [PATCH 8/8] remve unncessary auto

---
 mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
index f7df161943d48..0b7ffa40ec09d 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitC.cpp
@@ -159,10 +159,10 @@ struct ConvertGetGlobal final
     }
 
     if (opTy.getRank() == 0) {
-      auto lvalueType = emitc::LValueType::get(resultTy);
-      auto globalLValue = rewriter.create<emitc::GetGlobalOp>(
+      emitc::LValueType lvalueType = emitc::LValueType::get(resultTy);
+      emitc::GetGlobalOp globalLValue = rewriter.create<emitc::GetGlobalOp>(
           op.getLoc(), lvalueType, operands.getNameAttr());
-      auto pointerType = emitc::PointerType::get(resultTy);
+      emitc::PointerType pointerType = emitc::PointerType::get(resultTy);
       rewriter.replaceOpWithNewOp<emitc::ApplyOp>(
           op, pointerType, rewriter.getStringAttr("&"), globalLValue);
       return success();



More information about the Mlir-commits mailing list