[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