[Mlir-commits] [mlir] [mlir][emitc] Fix arith.{div, rem}ui index support (PR #221546)

Gil Rapaport llvmlistbot at llvm.org
Thu Sep 10 02:12:47 PDT 2026


https://github.com/aniragil updated https://github.com/llvm/llvm-project/pull/221546

>From d0ec72c258824b94f1c61f28446fc0196e9ce016 Mon Sep 17 00:00:00 2001
From: Gil Rapaport <gil.rapaport at mobileye.com>
Date: Sun, 6 Sep 2026 09:51:16 +0300
Subject: [PATCH 1/2] [mlir][emitc] Fix arith.{div,rem}ui index support

These ops were failing to lower to emitc.{div,rem} when applied to
index operands since the code was:
- only checking for IntegerType, rejecting the !emitc.size_t into which
  IndexType is converted.
- using the original operands instead of the converted ops, creating
  unrealized_conversion_cast ops.
---
 mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp  |  6 +++---
 .../Conversion/ArithToEmitC/arith-to-emitc.mlir    |  4 ++++
 mlir/test/Target/Cpp/arithmetic_operators.mlir     | 14 ++++++++++++++
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp b/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
index 91dde9018a288..b82d9a96ef083 100644
--- a/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
+++ b/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
@@ -459,7 +459,7 @@ class BinaryUIOpConversion final : public OpConversionPattern<ArithOp> {
     if (!newRetTy)
       return rewriter.notifyMatchFailure(uiBinOp,
                                          "converting result type failed");
-    if (!isa<IntegerType>(newRetTy)) {
+    if (!isa<IntegerType, emitc::SizeTType>(newRetTy)) {
       return rewriter.notifyMatchFailure(uiBinOp, "expected integer type");
     }
     Type unsignedType =
@@ -467,8 +467,8 @@ class BinaryUIOpConversion final : public OpConversionPattern<ArithOp> {
     if (!unsignedType)
       return rewriter.notifyMatchFailure(uiBinOp,
                                          "converting result type failed");
-    Value lhsAdapted = adaptValueType(uiBinOp.getLhs(), rewriter, unsignedType);
-    Value rhsAdapted = adaptValueType(uiBinOp.getRhs(), rewriter, unsignedType);
+    Value lhsAdapted = adaptValueType(adaptor.getLhs(), rewriter, unsignedType);
+    Value rhsAdapted = adaptValueType(adaptor.getRhs(), rewriter, unsignedType);
 
     auto newDivOp = EmitCOp::create(rewriter, uiBinOp.getLoc(), unsignedType,
                                     ArrayRef<Value>{lhsAdapted, rhsAdapted});
diff --git a/mlir/test/Conversion/ArithToEmitC/arith-to-emitc.mlir b/mlir/test/Conversion/ArithToEmitC/arith-to-emitc.mlir
index e45adb7287ac4..cfa0e6d5f3c70 100644
--- a/mlir/test/Conversion/ArithToEmitC/arith-to-emitc.mlir
+++ b/mlir/test/Conversion/ArithToEmitC/arith-to-emitc.mlir
@@ -89,6 +89,10 @@ func.func @arith_index(%arg0: i32, %arg1: i32) {
   %1 = arith.subi %cst0, %cst1 : index
   // CHECK: emitc.mul %[[CST0]], %[[CST1]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
   %2 = arith.muli %cst0, %cst1 : index
+  // CHECK: emitc.div %[[CST0]], %[[CST1]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
+  %3 = arith.divui %cst0, %cst1 : index
+  // CHECK: emitc.rem %[[CST0]], %[[CST1]] : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
+  %4 = arith.remui %cst0, %cst1 : index
 
   return
 }
diff --git a/mlir/test/Target/Cpp/arithmetic_operators.mlir b/mlir/test/Target/Cpp/arithmetic_operators.mlir
index 540c473f26dde..29741234e03ab 100644
--- a/mlir/test/Target/Cpp/arithmetic_operators.mlir
+++ b/mlir/test/Target/Cpp/arithmetic_operators.mlir
@@ -21,6 +21,13 @@ func.func @div_int(%arg0: i32, %arg1: i32) {
 // CHECK-LABEL: void div_int
 // CHECK-NEXT:  int32_t [[V2:[^ ]*]] = [[V0:[^ ]*]] / [[V1:[^ ]*]]
 
+func.func @div_size_t(%arg0: !emitc.size_t, %arg1: !emitc.size_t) {
+  %1 = "emitc.div" (%arg0, %arg1) : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
+  return
+}
+// CHECK-LABEL: void div_size_t
+// CHECK-NEXT:  size_t [[V2:[^ ]*]] = [[V0:[^ ]*]] / [[V1:[^ ]*]]
+
 func.func @mul_int(%arg0: i32, %arg1: i32) {
   %1 = "emitc.mul" (%arg0, %arg1) : (i32, i32) -> i32
   return
@@ -35,6 +42,13 @@ func.func @rem(%arg0: i32, %arg1: i32) {
 // CHECK-LABEL: void rem
 // CHECK-NEXT:  int32_t [[V2:[^ ]*]] = [[V0:[^ ]*]] % [[V1:[^ ]*]]
 
+func.func @rem_size_t(%arg0: !emitc.size_t, %arg1: !emitc.size_t) {
+  %1 = "emitc.rem" (%arg0, %arg1) : (!emitc.size_t, !emitc.size_t) -> !emitc.size_t
+  return
+}
+// CHECK-LABEL: void rem_size_t
+// CHECK-NEXT:  size_t [[V2:[^ ]*]] = [[V0:[^ ]*]] % [[V1:[^ ]*]]
+
 func.func @sub_int(%arg0: i32, %arg1: i32) {
   %1 = "emitc.sub" (%arg0, %arg1) : (i32, i32) -> i32
   return

>From cfc42843ca700fb9a43ad851280dcfb760c33935 Mon Sep 17 00:00:00 2001
From: Gil Rapaport <gil.rapaport at mobileye.com>
Date: Thu, 10 Sep 2026 12:11:12 +0300
Subject: [PATCH 2/2] Generalized match failure message

---
 mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp b/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
index b82d9a96ef083..268b8de5cba9e 100644
--- a/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
+++ b/mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
@@ -460,7 +460,7 @@ class BinaryUIOpConversion final : public OpConversionPattern<ArithOp> {
       return rewriter.notifyMatchFailure(uiBinOp,
                                          "converting result type failed");
     if (!isa<IntegerType, emitc::SizeTType>(newRetTy)) {
-      return rewriter.notifyMatchFailure(uiBinOp, "expected integer type");
+      return rewriter.notifyMatchFailure(uiBinOp, "unsupported result type");
     }
     Type unsignedType =
         adaptIntegralTypeSignedness(newRetTy, /*needsUnsigned=*/true);



More information about the Mlir-commits mailing list