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

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Sep 10 03:54:45 PDT 2026


Author: Gil Rapaport
Date: 2026-09-10T13:54:40+03:00
New Revision: bc25ad46580963afb2056b929b1089133d006dbb

URL: https://github.com/llvm/llvm-project/commit/bc25ad46580963afb2056b929b1089133d006dbb
DIFF: https://github.com/llvm/llvm-project/commit/bc25ad46580963afb2056b929b1089133d006dbb.diff

LOG: [mlir][emitc] Fix arith.{div,rem}ui index support (#221546)

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.

Added: 
    

Modified: 
    mlir/lib/Conversion/ArithToEmitC/ArithToEmitC.cpp
    mlir/test/Conversion/ArithToEmitC/arith-to-emitc.mlir
    mlir/test/Target/Cpp/arithmetic_operators.mlir

Removed: 
    


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


        


More information about the Mlir-commits mailing list