[mlir][Arithmetic] Fold NegF in MulF and DivF.

This patch adds the following combination:

mulf(negf(x), negf(y)) -> mulf(x, y)
divf(negf(x), negf(y)) -> divf(x, y)

Differential Revision: https://reviews.llvm.org/D126044
This commit is contained in:
jacquesguan 2022-05-20 06:40:14 +00:00
parent 059ee5d937
commit 5179f885d1
4 changed files with 50 additions and 0 deletions

View file

@ -764,6 +764,7 @@ def Arith_MulFOp : Arith_FloatBinaryOp<"mulf", [Commutative]> {
math, contraction, rounding mode, and other controls.
}];
let hasFolder = 1;
let hasCanonicalizer = 1;
}
//===----------------------------------------------------------------------===//
@ -773,6 +774,7 @@ def Arith_MulFOp : Arith_FloatBinaryOp<"mulf", [Commutative]> {
def Arith_DivFOp : Arith_FloatBinaryOp<"divf"> {
let summary = "floating point division operation";
let hasFolder = 1;
let hasCanonicalizer = 1;
}
//===----------------------------------------------------------------------===//

View file

@ -187,4 +187,22 @@ def OrOfExtSI :
Pat<(Arith_OrIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), (Arith_ExtSIOp (Arith_OrIOp $x, $y)),
[(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
//===----------------------------------------------------------------------===//
// MulFOp
//===----------------------------------------------------------------------===//
// mulf(negf(x), negf(y)) -> mulf(x,y)
def MulFOfNegF :
Pat<(Arith_MulFOp (Arith_NegFOp $x), (Arith_NegFOp $y)), (Arith_MulFOp $x, $y),
[(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
//===----------------------------------------------------------------------===//
// DivFOp
//===----------------------------------------------------------------------===//
// divf(negf(x), negf(y)) -> divf(x,y)
def DivFOfNegF :
Pat<(Arith_DivFOp (Arith_NegFOp $x), (Arith_NegFOp $y)), (Arith_DivFOp $x, $y),
[(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
#endif // ARITHMETIC_PATTERNS

View file

@ -743,6 +743,11 @@ OpFoldResult arith::MulFOp::fold(ArrayRef<Attribute> operands) {
operands, [](const APFloat &a, const APFloat &b) { return a * b; });
}
void arith::MulFOp::getCanonicalizationPatterns(RewritePatternSet &patterns,
MLIRContext *context) {
patterns.add<MulFOfNegF>(context);
}
//===----------------------------------------------------------------------===//
// DivFOp
//===----------------------------------------------------------------------===//
@ -756,6 +761,11 @@ OpFoldResult arith::DivFOp::fold(ArrayRef<Attribute> operands) {
operands, [](const APFloat &a, const APFloat &b) { return a / b; });
}
void arith::DivFOp::getCanonicalizationPatterns(RewritePatternSet &patterns,
MLIRContext *context) {
patterns.add<DivFOfNegF>(context);
}
//===----------------------------------------------------------------------===//
// RemFOp
//===----------------------------------------------------------------------===//

View file

@ -948,6 +948,16 @@ func.func @test_mulf(%arg0 : f32) -> (f32, f32, f32, f32) {
return %0, %1, %2, %3 : f32, f32, f32, f32
}
// CHECK-LABEL: @test_mulf1(
func.func @test_mulf1(%arg0 : f32, %arg1 : f32) -> (f32) {
// CHECK-NEXT: %[[X:.+]] = arith.mulf %arg0, %arg1 : f32
// CHECK-NEXT: return %[[X]]
%0 = arith.negf %arg0 : f32
%1 = arith.negf %arg1 : f32
%2 = arith.mulf %0, %1 : f32
return %2 : f32
}
// -----
// CHECK-LABEL: @test_divf(
@ -961,6 +971,16 @@ func.func @test_divf(%arg0 : f64) -> (f64, f64) {
return %0, %1 : f64, f64
}
// CHECK-LABEL: @test_divf1(
func.func @test_divf1(%arg0 : f32, %arg1 : f32) -> (f32) {
// CHECK-NEXT: %[[X:.+]] = arith.divf %arg0, %arg1 : f32
// CHECK-NEXT: return %[[X]]
%0 = arith.negf %arg0 : f32
%1 = arith.negf %arg1 : f32
%2 = arith.divf %0, %1 : f32
return %2 : f32
}
// -----
// CHECK-LABEL: @test_cmpf(