[Mlir-commits] [mlir] [mlir][arith] Add rounding mode support for 'remf' operation (PR #194126)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sat Apr 25 02:06:13 PDT 2026
https://github.com/worthlane created https://github.com/llvm/llvm-project/pull/194126
None
>From 07c282d8d793eb3894fbc472573efe98b03cca4d Mon Sep 17 00:00:00 2001
From: Artem Maklakov <art.maklakov28 at gmail.com>
Date: Sat, 25 Apr 2026 11:46:49 +0300
Subject: [PATCH] [mlir][arith] Add rounding mode support for 'remf' operation
---
mlir/include/mlir/Dialect/Arith/IR/ArithOps.td | 4 +---
mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp | 11 ++++++++---
mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir | 11 +++++++++++
mlir/test/Dialect/Arith/ops.mlir | 4 +++-
4 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
index ba9ccb6a01d66..375190a07b169 100644
--- a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
+++ b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
@@ -1273,13 +1273,11 @@ def Arith_DivFOp : Arith_FloatBinaryOpWithRoundingMode<"divf"> {
// RemFOp
//===----------------------------------------------------------------------===//
-def Arith_RemFOp : Arith_FloatBinaryOp<"remf"> {
+def Arith_RemFOp : Arith_FloatBinaryOpWithRoundingMode<"remf"> {
let summary = "floating point division remainder operation";
let description = [{
Returns the floating point division remainder.
The remainder has the same sign as the dividend (lhs operand).
-
- TODO: Add support for rounding modes.
}];
let hasFolder = 1;
}
diff --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
index 2624420cf5318..30f32b8e248f4 100644
--- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
+++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
@@ -170,9 +170,13 @@ using NegFOpLowering =
/*FailOnUnsupportedFP=*/true>;
using OrIOpLowering = VectorConvertToLLVMPattern<arith::OrIOp, LLVM::OrOp>;
using RemFOpLowering =
- VectorConvertToLLVMPattern<arith::RemFOp, LLVM::FRemOp,
- arith::AttrConvertFastMathToLLVM,
- /*FailOnUnsupportedFP=*/true>;
+ ConstrainedVectorConvertToLLVMPattern<arith::RemFOp, LLVM::FRemOp,
+ /*HasRoundingMode=*/false,
+ arith::AttrConvertFastMathToLLVM,
+ /*FailOnUnsupportedFP=*/true>;
+using ConstrainedRemFOpLowering = ConstrainedVectorConvertToLLVMPattern<
+ arith::RemFOp, LLVM::ConstrainedFRemIntr, /*HasRoundingMode=*/true,
+ arith::AttrConverterConstrainedFPToLLVM, /*FailOnUnsupportedFP=*/true>;
using RemSIOpLowering =
VectorConvertToLLVMPattern<arith::RemSIOp, LLVM::SRemOp>;
using RemUIOpLowering =
@@ -760,6 +764,7 @@ void mlir::arith::populateArithToLLVMConversionPatterns(
NegFOpLowering,
OrIOpLowering,
RemFOpLowering,
+ ConstrainedRemFOpLowering,
RemSIOpLowering,
RemUIOpLowering,
SelectOpLowering,
diff --git a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
index df58d4ffcaf51..d1e10ea42d19f 100644
--- a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
+++ b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
@@ -451,6 +451,17 @@ func.func @experimental_constrained_divf(%arg0 : f64, %arg1 : f64) {
// -----
+// CHECK-LABEL: experimental_constrained_remf
+func.func @experimental_constrained_remf(%arg0 : f64, %arg1 : f64) {
+// CHECK-NEXT: = llvm.intr.experimental.constrained.frem %arg0, %arg1 tonearest ignore
+ %0 = arith.remf %arg0, %arg1 to_nearest_even : f64
+// CHECK-NEXT: = llvm.intr.experimental.constrained.frem %arg0, %arg1 tonearestaway ignore
+ %1 = arith.remf %arg0, %arg1 to_nearest_away : f64
+ return
+}
+
+// -----
+
// Verify that fastmath flags are stripped when lowering to constrained
// intrinsics (constrained FP and fastmath are contradictory).
// CHECK-LABEL: constrained_addf_with_fastmath
diff --git a/mlir/test/Dialect/Arith/ops.mlir b/mlir/test/Dialect/Arith/ops.mlir
index 059e35c384dac..21d9cd364f720 100644
--- a/mlir/test/Dialect/Arith/ops.mlir
+++ b/mlir/test/Dialect/Arith/ops.mlir
@@ -1276,8 +1276,10 @@ func.func @roundingmode(%arg0: f32, %arg1: f32) {
%2 = arith.mulf %arg0, %arg1 upward : f32
// CHECK: {{.*}} = arith.divf %arg0, %arg1 toward_zero : f32
%3 = arith.divf %arg0, %arg1 toward_zero : f32
+// CHECK: {{.*}} = arith.remf %arg0, %arg1 toward_zero : f32
+ %4 = arith.remf %arg0, %arg1 toward_zero : f32
// CHECK: {{.*}} = arith.addf %arg0, %arg1 to_nearest_even fastmath<fast> : f32
- %4 = arith.addf %arg0, %arg1 to_nearest_even fastmath<fast> : f32
+ %5 = arith.addf %arg0, %arg1 to_nearest_even fastmath<fast> : f32
return
}
More information about the Mlir-commits
mailing list