[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