From ccf975059c037ec51ce3b0170105fb2e4fecf2a0 Mon Sep 17 00:00:00 2001 From: Kai Sasaki Date: Wed, 7 Sep 2022 14:55:28 +0200 Subject: [PATCH] [mlir][complex] Canonicalization for complex.sub adding same numbers Canonicalization for complex.sub adding same numbers. This canonicalization supports the case like complex.sub(complex.add(a, b), b) -> a. Reviewed By: pifon2a Differential Revision: https://reviews.llvm.org/D133397 --- mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td | 2 ++ mlir/lib/Dialect/Complex/IR/ComplexOps.cpp | 15 +++++++++++++++ mlir/test/Dialect/Complex/canonicalize.mlir | 11 +++++++++++ 3 files changed, 28 insertions(+) diff --git a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td index 44a6952..defdf37 100644 --- a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td +++ b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td @@ -531,6 +531,8 @@ def SubOp : ComplexArithmeticOp<"sub"> { %a = complex.sub %b, %c : complex ``` }]; + + let hasFolder = 1; } //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp b/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp index cfc2e00..59f58fd 100644 --- a/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp +++ b/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp @@ -139,6 +139,21 @@ OpFoldResult AddOp::fold(ArrayRef operands) { } //===----------------------------------------------------------------------===// +// SubOp +//===----------------------------------------------------------------------===// + +OpFoldResult SubOp::fold(ArrayRef operands) { + assert(operands.size() == 2 && "binary op takes 2 operands"); + + // complex.sub(complex.add(a, b), b) -> a + if (auto add = getLhs().getDefiningOp()) + if (getRhs() == add.getRhs()) + return add.getLhs(); + + return {}; +} + +//===----------------------------------------------------------------------===// // NegOp //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/Complex/canonicalize.mlir b/mlir/test/Dialect/Complex/canonicalize.mlir index d57dc69..54cbf21 100644 --- a/mlir/test/Dialect/Complex/canonicalize.mlir +++ b/mlir/test/Dialect/Complex/canonicalize.mlir @@ -133,4 +133,15 @@ func.func @complex_add_zero() -> complex { // CHECK-NEXT: return %[[CPLX:.*]] : complex %add = complex.add %complex1, %complex2 : complex return %add : complex +} + +// CHECK-LABEL: func @complex_sub_add_lhs +func.func @complex_sub_add_lhs() -> complex { + %complex1 = complex.constant [1.0 : f32, 0.0 : f32] : complex + %complex2 = complex.constant [0.0 : f32, 2.0 : f32] : complex + // CHECK: %[[CPLX:.*]] = complex.constant [1.000000e+00 : f32, 0.000000e+00 : f32] : complex + // CHECK-NEXT: return %[[CPLX:.*]] : complex + %add = complex.add %complex1, %complex2 : complex + %sub = complex.sub %add, %complex2 : complex + return %sub : complex } \ No newline at end of file -- 2.7.4