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

llvmlistbot at llvm.org llvmlistbot at llvm.org
Sun Sep 6 02:10:30 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir-emitc

Author: Gil Rapaport (aniragil)

<details>
<summary>Changes</summary>

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.

---
Full diff: https://github.com/llvm/llvm-project/pull/221546.diff


3 Files Affected:

- (modified) mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp (+3-3) 
- (modified) mlir/test/Conversion/ArithToEmitC/arith-to-emitc.mlir (+4) 
- (modified) mlir/test/Target/Cpp/arithmetic_operators.mlir (+14) 


``````````diff
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

``````````

</details>


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


More information about the Mlir-commits mailing list