[Mlir-commits] [mlir] [mlir][arith] Add mulf(x, 0) -> 0 to mulf folder (PR #161395)
Xiang Li
llvmlistbot at llvm.org
Wed Oct 1 10:42:42 PDT 2025
https://github.com/python3kgae updated https://github.com/llvm/llvm-project/pull/161395
>From 7e4a0d4dd46002776015c2c715a0e301d07c31ac Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Tue, 30 Sep 2025 15:45:15 +0000
Subject: [PATCH 1/8] [mlir][arith] Add mulf(x, 0) -> 0 to mulf folder
Fold `mulf(x, 0) -> 0`.
Updated the yield_constant_loop test in mlir/test/Dialect/SCF/loop-pipelining.mlir
to workaround [TODO](https://github.com/llvm/llvm-project/blob/main/mlir/test/lib/Dialect/SCF/TestSCFUtils.cpp#L163) in TestSCFUtils.cpp
---
mlir/lib/Dialect/Arith/IR/ArithOps.cpp | 3 +++
mlir/test/Dialect/Arith/canonicalize.mlir | 10 ++++++++++
mlir/test/Dialect/SCF/loop-pipelining.mlir | 12 ++++++------
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index 7cfd6d3a98df8..676297f56ac0f 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -1281,6 +1281,9 @@ OpFoldResult arith::MulFOp::fold(FoldAdaptor adaptor) {
// mulf(x, 1) -> x
if (matchPattern(adaptor.getRhs(), m_OneFloat()))
return getLhs();
+ // mulf(x, 0) -> 0
+ if (matchPattern(adaptor.getRhs(), m_AnyZeroFloat()))
+ return getRhs();
return constFoldBinaryOp<FloatAttr>(
adaptor.getOperands(),
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index ca3de3a2d7703..4c72a1bb27b01 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2216,6 +2216,16 @@ func.func @test_mulf1(%arg0 : f32, %arg1 : f32) -> (f32) {
return %2 : f32
}
+// CHECK-LABEL: @test_mulf2(
+func.func @test_mulf2(%arg0 : f32, %arg1 : f32) -> (f32, f32) {
+ // CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
+ // CHECK-NEXT: return %[[C0]], %[[C0]]
+ %c0 = arith.constant 0.0 : f32
+ %0 = arith.mulf %arg0, %c0 : f32
+ %1 = arith.mulf %c0, %arg1 : f32
+ return %0, %1 : f32, f32
+}
+
// -----
// CHECK-LABEL: @test_divf(
diff --git a/mlir/test/Dialect/SCF/loop-pipelining.mlir b/mlir/test/Dialect/SCF/loop-pipelining.mlir
index 86af637fc05d7..11dc55c7ebb17 100644
--- a/mlir/test/Dialect/SCF/loop-pipelining.mlir
+++ b/mlir/test/Dialect/SCF/loop-pipelining.mlir
@@ -930,7 +930,7 @@ func.func @dynamic_loop_result(%A: memref<?xf32>, %result: memref<?xf32>, %lb: i
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK-DAG: %[[C1:.*]] = arith.constant 1 : index
// CHECK-DAG: %[[C3:.*]] = arith.constant 3 : index
-// CHECK-DAG: %[[CST0:.*]] = arith.constant 0.000000e+00 : f32
+// CHECK-DAG: %[[CST10:.*]] = arith.constant 1.000000e+01 : f32
// CHECK-DAG: %[[CST2:.*]] = arith.constant 2.000000e+00 : f32
// Prologue:
// CHECK: %[[L0:.*]] = memref.load %[[A]][%[[C0]]] : memref<?xf32>
@@ -938,15 +938,15 @@ func.func @dynamic_loop_result(%A: memref<?xf32>, %result: memref<?xf32>, %lb: i
// CHECK-NEXT: %[[L1:.*]]:2 = scf.for %[[IV:.*]] = %[[C0]] to %[[C3]]
// CHECK-SAME: step %[[C1]] iter_args(%[[ARG0:.*]] = %[[CST2]], %[[ARG1:.*]] = %[[L0]]) -> (f32, f32) {
// CHECK-NEXT: %[[ADD0:.*]] = arith.addf %[[ARG1]], %[[ARG0]] : f32
-// CHECK-NEXT: %[[MUL0:.*]] = arith.mulf %[[ADD0]], %[[CST0]] : f32
+// CHECK-NEXT: %[[MUL0:.*]] = arith.mulf %[[ADD0]], %[[CST10]] : f32
// CHECK-NEXT: memref.store %[[MUL0]], %[[A]][%[[IV]]] : memref<?xf32>
// CHECK-NEXT: %[[IV1:.*]] = arith.addi %[[IV]], %[[C1]] : index
// CHECK-NEXT: %[[L2:.*]] = memref.load %[[A]][%[[IV1]]] : memref<?xf32>
-// CHECK-NEXT: scf.yield %[[CST0]], %[[L2]] : f32
+// CHECK-NEXT: scf.yield %[[CST10]], %[[L2]] : f32
// CHECK-NEXT: }
// Epilogue:
-// CHECK-NEXT: %[[ADD1:.*]] = arith.addf %[[L1]]#1, %[[CST0]] : f32
-// CHECK-NEXT: %[[MUL1:.*]] = arith.mulf %[[ADD1]], %[[CST0]] : f32
+// CHECK-NEXT: %[[ADD1:.*]] = arith.addf %[[L1]]#1, %[[CST10]] : f32
+// CHECK-NEXT: %[[MUL1:.*]] = arith.mulf %[[ADD1]], %[[CST10]] : f32
// CHECK-NEXT: memref.store %[[MUL1]], %[[A]][%[[C3]]] : memref<?xf32>
// CHECK-NEXT: return %[[L1]]#0 : f32
@@ -954,7 +954,7 @@ func.func @yield_constant_loop(%A: memref<?xf32>) -> f32 {
%c0 = arith.constant 0 : index
%c1 = arith.constant 1 : index
%c4 = arith.constant 4 : index
- %cf0 = arith.constant 0.0 : f32
+ %cf0 = arith.constant 10.0 : f32
%cf2 = arith.constant 2.0 : f32
%r = scf.for %i0 = %c0 to %c4 step %c1 iter_args(%arg0 = %cf2) -> f32 {
%A_elem = memref.load %A[%i0] { __test_pipelining_stage__ = 0, __test_pipelining_op_order__ = 3 } : memref<?xf32>
>From 8d49f3fc48dd629332492a850ea20de054306c58 Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Tue, 30 Sep 2025 17:00:30 +0000
Subject: [PATCH 2/8] mulf(NaN, x) -> NaN
---
mlir/lib/Dialect/Arith/IR/ArithOps.cpp | 3 +++
mlir/test/Dialect/Arith/canonicalize.mlir | 11 +++++++++++
2 files changed, 14 insertions(+)
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index 676297f56ac0f..60269a2f77c0e 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -1281,6 +1281,9 @@ OpFoldResult arith::MulFOp::fold(FoldAdaptor adaptor) {
// mulf(x, 1) -> x
if (matchPattern(adaptor.getRhs(), m_OneFloat()))
return getLhs();
+ // mulf(NaN, x) -> NaN
+ if (matchPattern(adaptor.getLhs(), m_NaNFloat()))
+ return getLhs();
// mulf(x, 0) -> 0
if (matchPattern(adaptor.getRhs(), m_AnyZeroFloat()))
return getRhs();
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index 4c72a1bb27b01..195d4fc8f5e92 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2226,6 +2226,17 @@ func.func @test_mulf2(%arg0 : f32, %arg1 : f32) -> (f32, f32) {
return %0, %1 : f32, f32
}
+// CHECK-LABEL: @test_mulf3(
+func.func @test_mulf3(%arg0 : f32, %arg1 : f32) -> (f32, f32) {
+ // CHECK-NEXT: %[[NAN:.+]] = arith.constant 0x7FC00000 : f32
+ // CHECK-NEXT: return %[[NAN]], %[[NAN]]
+ %c0 = arith.constant 0.0 : f32
+ %nan = arith.constant 0x7FC00000 : f32
+ %0 = arith.mulf %nan, %c0 : f32
+ %1 = arith.mulf %c0, %nan : f32
+ return %0, %1 : f32, f32
+}
+
// -----
// CHECK-LABEL: @test_divf(
>From 8c72844d5517adecc5448ec1ae7114923a5542fa Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Tue, 30 Sep 2025 18:16:08 +0000
Subject: [PATCH 3/8] Limit to fastmask nnan | ninf
---
mlir/lib/Dialect/Arith/IR/ArithOps.cpp | 14 ++++++++------
mlir/test/Dialect/Arith/canonicalize.mlir | 17 +++--------------
mlir/test/Dialect/SCF/loop-pipelining.mlir | 12 ++++++------
3 files changed, 17 insertions(+), 26 deletions(-)
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index 60269a2f77c0e..c616b3afeb4b9 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -1281,12 +1281,14 @@ OpFoldResult arith::MulFOp::fold(FoldAdaptor adaptor) {
// mulf(x, 1) -> x
if (matchPattern(adaptor.getRhs(), m_OneFloat()))
return getLhs();
- // mulf(NaN, x) -> NaN
- if (matchPattern(adaptor.getLhs(), m_NaNFloat()))
- return getLhs();
- // mulf(x, 0) -> 0
- if (matchPattern(adaptor.getRhs(), m_AnyZeroFloat()))
- return getRhs();
+
+ arith::FastMathFlags fmf = getFastmath();
+ if (arith::bitEnumContainsAll(fmf, arith::FastMathFlags::nnan |
+ arith::FastMathFlags::ninf)) {
+ // mulf(x, 0) -> 0
+ if (matchPattern(adaptor.getRhs(), m_AnyZeroFloat()))
+ return getRhs();
+ }
return constFoldBinaryOp<FloatAttr>(
adaptor.getOperands(),
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index 195d4fc8f5e92..bdc8dff7efcae 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2221,20 +2221,9 @@ func.func @test_mulf2(%arg0 : f32, %arg1 : f32) -> (f32, f32) {
// CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
// CHECK-NEXT: return %[[C0]], %[[C0]]
%c0 = arith.constant 0.0 : f32
- %0 = arith.mulf %arg0, %c0 : f32
- %1 = arith.mulf %c0, %arg1 : f32
- return %0, %1 : f32, f32
-}
-
-// CHECK-LABEL: @test_mulf3(
-func.func @test_mulf3(%arg0 : f32, %arg1 : f32) -> (f32, f32) {
- // CHECK-NEXT: %[[NAN:.+]] = arith.constant 0x7FC00000 : f32
- // CHECK-NEXT: return %[[NAN]], %[[NAN]]
- %c0 = arith.constant 0.0 : f32
- %nan = arith.constant 0x7FC00000 : f32
- %0 = arith.mulf %nan, %c0 : f32
- %1 = arith.mulf %c0, %nan : f32
- return %0, %1 : f32, f32
+ %0 = arith.mulf %arg0, %c0 fastmath<nnan,ninf> : f32
+ %1 = arith.mulf %c0, %arg1 fastmath<nnan,ninf> : f32
+ return %0, %1 : f32, f32
}
// -----
diff --git a/mlir/test/Dialect/SCF/loop-pipelining.mlir b/mlir/test/Dialect/SCF/loop-pipelining.mlir
index 11dc55c7ebb17..86af637fc05d7 100644
--- a/mlir/test/Dialect/SCF/loop-pipelining.mlir
+++ b/mlir/test/Dialect/SCF/loop-pipelining.mlir
@@ -930,7 +930,7 @@ func.func @dynamic_loop_result(%A: memref<?xf32>, %result: memref<?xf32>, %lb: i
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK-DAG: %[[C1:.*]] = arith.constant 1 : index
// CHECK-DAG: %[[C3:.*]] = arith.constant 3 : index
-// CHECK-DAG: %[[CST10:.*]] = arith.constant 1.000000e+01 : f32
+// CHECK-DAG: %[[CST0:.*]] = arith.constant 0.000000e+00 : f32
// CHECK-DAG: %[[CST2:.*]] = arith.constant 2.000000e+00 : f32
// Prologue:
// CHECK: %[[L0:.*]] = memref.load %[[A]][%[[C0]]] : memref<?xf32>
@@ -938,15 +938,15 @@ func.func @dynamic_loop_result(%A: memref<?xf32>, %result: memref<?xf32>, %lb: i
// CHECK-NEXT: %[[L1:.*]]:2 = scf.for %[[IV:.*]] = %[[C0]] to %[[C3]]
// CHECK-SAME: step %[[C1]] iter_args(%[[ARG0:.*]] = %[[CST2]], %[[ARG1:.*]] = %[[L0]]) -> (f32, f32) {
// CHECK-NEXT: %[[ADD0:.*]] = arith.addf %[[ARG1]], %[[ARG0]] : f32
-// CHECK-NEXT: %[[MUL0:.*]] = arith.mulf %[[ADD0]], %[[CST10]] : f32
+// CHECK-NEXT: %[[MUL0:.*]] = arith.mulf %[[ADD0]], %[[CST0]] : f32
// CHECK-NEXT: memref.store %[[MUL0]], %[[A]][%[[IV]]] : memref<?xf32>
// CHECK-NEXT: %[[IV1:.*]] = arith.addi %[[IV]], %[[C1]] : index
// CHECK-NEXT: %[[L2:.*]] = memref.load %[[A]][%[[IV1]]] : memref<?xf32>
-// CHECK-NEXT: scf.yield %[[CST10]], %[[L2]] : f32
+// CHECK-NEXT: scf.yield %[[CST0]], %[[L2]] : f32
// CHECK-NEXT: }
// Epilogue:
-// CHECK-NEXT: %[[ADD1:.*]] = arith.addf %[[L1]]#1, %[[CST10]] : f32
-// CHECK-NEXT: %[[MUL1:.*]] = arith.mulf %[[ADD1]], %[[CST10]] : f32
+// CHECK-NEXT: %[[ADD1:.*]] = arith.addf %[[L1]]#1, %[[CST0]] : f32
+// CHECK-NEXT: %[[MUL1:.*]] = arith.mulf %[[ADD1]], %[[CST0]] : f32
// CHECK-NEXT: memref.store %[[MUL1]], %[[A]][%[[C3]]] : memref<?xf32>
// CHECK-NEXT: return %[[L1]]#0 : f32
@@ -954,7 +954,7 @@ func.func @yield_constant_loop(%A: memref<?xf32>) -> f32 {
%c0 = arith.constant 0 : index
%c1 = arith.constant 1 : index
%c4 = arith.constant 4 : index
- %cf0 = arith.constant 10.0 : f32
+ %cf0 = arith.constant 0.0 : f32
%cf2 = arith.constant 2.0 : f32
%r = scf.for %i0 = %c0 to %c4 step %c1 iter_args(%arg0 = %cf2) -> f32 {
%A_elem = memref.load %A[%i0] { __test_pipelining_stage__ = 0, __test_pipelining_op_order__ = 3 } : memref<?xf32>
>From e86191ad406a42dbb2947ea2adb59d413d23bf7b Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Tue, 30 Sep 2025 18:39:39 +0000
Subject: [PATCH 4/8] Update per comment.
---
mlir/test/Dialect/Arith/canonicalize.mlir | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index bdc8dff7efcae..fb9afe04afb40 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2217,13 +2217,12 @@ func.func @test_mulf1(%arg0 : f32, %arg1 : f32) -> (f32) {
}
// CHECK-LABEL: @test_mulf2(
-func.func @test_mulf2(%arg0 : f32, %arg1 : f32) -> (f32, f32) {
+func.func @test_mulf2(%arg0 : f32) -> f32 {
// CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
- // CHECK-NEXT: return %[[C0]], %[[C0]]
+ // CHECK-NEXT: return %[[C0]]
%c0 = arith.constant 0.0 : f32
- %0 = arith.mulf %arg0, %c0 fastmath<nnan,ninf> : f32
- %1 = arith.mulf %c0, %arg1 fastmath<nnan,ninf> : f32
- return %0, %1 : f32, f32
+ %0 = arith.mulf %c0, %arg0 fastmath<nnan,ninf> : f32
+ return %0 : f32
}
// -----
>From bdb0f61db348b6f86d658ee74a829b1b19a1ca35 Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Tue, 30 Sep 2025 21:36:34 +0000
Subject: [PATCH 5/8] Add nsz.
---
mlir/lib/Dialect/Arith/IR/ArithOps.cpp | 3 ++-
mlir/test/Dialect/Arith/canonicalize.mlir | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index c616b3afeb4b9..f8e5667de6c51 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -1284,7 +1284,8 @@ OpFoldResult arith::MulFOp::fold(FoldAdaptor adaptor) {
arith::FastMathFlags fmf = getFastmath();
if (arith::bitEnumContainsAll(fmf, arith::FastMathFlags::nnan |
- arith::FastMathFlags::ninf)) {
+ arith::FastMathFlags::ninf |
+ arith::FastMathFlags::nsz)) {
// mulf(x, 0) -> 0
if (matchPattern(adaptor.getRhs(), m_AnyZeroFloat()))
return getRhs();
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index fb9afe04afb40..05360ae99c161 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2221,7 +2221,7 @@ func.func @test_mulf2(%arg0 : f32) -> f32 {
// CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
// CHECK-NEXT: return %[[C0]]
%c0 = arith.constant 0.0 : f32
- %0 = arith.mulf %c0, %arg0 fastmath<nnan,ninf> : f32
+ %0 = arith.mulf %c0, %arg0 fastmath<nnan,ninf,nsz> : f32
return %0 : f32
}
>From 18e95046d9bed272a39dec2ebd3fbe1a968edb04 Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Wed, 1 Oct 2025 03:23:52 +0000
Subject: [PATCH 6/8] Remove ninf which is not needed.
---
mlir/lib/Dialect/Arith/IR/ArithOps.cpp | 6 ++----
mlir/test/Dialect/Arith/canonicalize.mlir | 2 +-
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index f8e5667de6c51..898d76ce8d9b5 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -1282,10 +1282,8 @@ OpFoldResult arith::MulFOp::fold(FoldAdaptor adaptor) {
if (matchPattern(adaptor.getRhs(), m_OneFloat()))
return getLhs();
- arith::FastMathFlags fmf = getFastmath();
- if (arith::bitEnumContainsAll(fmf, arith::FastMathFlags::nnan |
- arith::FastMathFlags::ninf |
- arith::FastMathFlags::nsz)) {
+ if (arith::bitEnumContainsAll(getFastmath(), arith::FastMathFlags::nnan |
+ arith::FastMathFlags::nsz)) {
// mulf(x, 0) -> 0
if (matchPattern(adaptor.getRhs(), m_AnyZeroFloat()))
return getRhs();
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index 05360ae99c161..fc3dec82a9ca4 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2221,7 +2221,7 @@ func.func @test_mulf2(%arg0 : f32) -> f32 {
// CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
// CHECK-NEXT: return %[[C0]]
%c0 = arith.constant 0.0 : f32
- %0 = arith.mulf %c0, %arg0 fastmath<nnan,ninf,nsz> : f32
+ %0 = arith.mulf %c0, %arg0 fastmath<nnan,nsz> : f32
return %0 : f32
}
>From f43001f22319b3e583d7e1bf3c9a93fbd0c5507d Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Wed, 1 Oct 2025 13:19:56 +0000
Subject: [PATCH 7/8] Add test for neg zero.
---
mlir/test/Dialect/Arith/canonicalize.mlir | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index fc3dec82a9ca4..a0fcaa3570f23 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2217,12 +2217,15 @@ func.func @test_mulf1(%arg0 : f32, %arg1 : f32) -> (f32) {
}
// CHECK-LABEL: @test_mulf2(
-func.func @test_mulf2(%arg0 : f32) -> f32 {
+func.func @test_mulf2(%arg0 : f32) -> (f32, f32) {
// CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
- // CHECK-NEXT: return %[[C0]]
+ // CHECK-NEXT: %[[C0n:.+]] = arith.constant -0.000000e+00 : f32
+ // CHECK-NEXT: return %[[C0]], %[[C0n]]
%c0 = arith.constant 0.0 : f32
+ %c0n = arith.constant -0.0 : f32
%0 = arith.mulf %c0, %arg0 fastmath<nnan,nsz> : f32
- return %0 : f32
+ %1 = arith.mulf %c0n, %arg0 fastmath<nnan,nsz> : f32
+ return %0, %1 : f32, f32
}
// -----
>From 4019c367dfcf971290c27716208ecd51fe774670 Mon Sep 17 00:00:00 2001
From: Xiang Li <xiagli at microsoft.com>
Date: Wed, 1 Oct 2025 17:42:03 +0000
Subject: [PATCH 8/8] Use CHECK_DAG.
---
mlir/test/Dialect/Arith/canonicalize.mlir | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index a0fcaa3570f23..2fe0995c9d4df 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -2218,8 +2218,8 @@ func.func @test_mulf1(%arg0 : f32, %arg1 : f32) -> (f32) {
// CHECK-LABEL: @test_mulf2(
func.func @test_mulf2(%arg0 : f32) -> (f32, f32) {
- // CHECK-NEXT: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
- // CHECK-NEXT: %[[C0n:.+]] = arith.constant -0.000000e+00 : f32
+ // CHECK-DAG: %[[C0:.+]] = arith.constant 0.000000e+00 : f32
+ // CHECK-DAG: %[[C0n:.+]] = arith.constant -0.000000e+00 : f32
// CHECK-NEXT: return %[[C0]], %[[C0n]]
%c0 = arith.constant 0.0 : f32
%c0n = arith.constant -0.0 : f32
More information about the Mlir-commits
mailing list