[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:
parent
059ee5d937
commit
5179f885d1
|
@ -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;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in a new issue