[Mlir-commits] [mlir] ccf9750 - [mlir][complex] Canonicalization for complex.sub adding same numbers

Alexander Belyaev llvmlistbot at llvm.org
Wed Sep 7 06:06:38 PDT 2022


Author: Kai Sasaki
Date: 2022-09-07T14:55:46+02:00
New Revision: ccf975059c037ec51ce3b0170105fb2e4fecf2a0

URL: https://github.com/llvm/llvm-project/commit/ccf975059c037ec51ce3b0170105fb2e4fecf2a0
DIFF: https://github.com/llvm/llvm-project/commit/ccf975059c037ec51ce3b0170105fb2e4fecf2a0.diff

LOG: [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

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td
    mlir/lib/Dialect/Complex/IR/ComplexOps.cpp
    mlir/test/Dialect/Complex/canonicalize.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td
index 44a695287077a..defdf376772c1 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<f32>
     ```
   }];
+
+  let hasFolder = 1;
 }
 
 //===----------------------------------------------------------------------===//

diff  --git a/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp b/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp
index cfc2e00abdec9..59f58fdcce1b7 100644
--- a/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp
+++ b/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp
@@ -138,6 +138,21 @@ OpFoldResult AddOp::fold(ArrayRef<Attribute> operands) {
   return {};
 }
 
+//===----------------------------------------------------------------------===//
+// SubOp
+//===----------------------------------------------------------------------===//
+
+OpFoldResult SubOp::fold(ArrayRef<Attribute> operands) {
+  assert(operands.size() == 2 && "binary op takes 2 operands");
+
+  // complex.sub(complex.add(a, b), b) -> a
+  if (auto add = getLhs().getDefiningOp<AddOp>())
+    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 d57dc693d1604..54cbf21f3b981 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<f32> {
   // CHECK-NEXT: return %[[CPLX:.*]] : complex<f32>
   %add = complex.add %complex1, %complex2 : complex<f32>
   return %add : complex<f32>
+}
+
+// CHECK-LABEL: func @complex_sub_add_lhs
+func.func @complex_sub_add_lhs() -> complex<f32> {
+  %complex1 = complex.constant [1.0 : f32, 0.0 : f32] : complex<f32>
+  %complex2 = complex.constant [0.0 : f32, 2.0 : f32] : complex<f32>
+  // CHECK: %[[CPLX:.*]] = complex.constant [1.000000e+00 : f32, 0.000000e+00 : f32] : complex<f32>
+  // CHECK-NEXT: return %[[CPLX:.*]] : complex<f32>
+  %add = complex.add %complex1, %complex2 : complex<f32>
+  %sub = complex.sub %add, %complex2 : complex<f32>
+  return %sub : complex<f32>
 }
\ No newline at end of file


        


More information about the Mlir-commits mailing list