From fa765a09440253fd16e92376b4cf132873afe84e Mon Sep 17 00:00:00 2001 From: Adrian Kuegel Date: Tue, 18 May 2021 10:40:49 +0200 Subject: [PATCH] [mlir] Add folder for complex.ReOp and complex.ImOp. Now that complex constants are supported, we can also fold. Differential Revision: https://reviews.llvm.org/D102616 --- .../mlir/Dialect/Complex/IR/ComplexOps.td | 2 ++ mlir/lib/Dialect/Complex/IR/ComplexOps.cpp | 16 ++++++++++++++++ mlir/test/Dialect/Complex/canonicalize.mlir | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 mlir/test/Dialect/Complex/canonicalize.mlir diff --git a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td index 5e4648da488d..efea0b284552 100644 --- a/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td +++ b/mlir/include/mlir/Dialect/Complex/IR/ComplexOps.td @@ -144,6 +144,7 @@ def ImOp : Complex_Op<"im", let results = (outs AnyFloat:$imaginary); let assemblyFormat = "$complex attr-dict `:` type($complex)"; + let hasFolder = 1; } //===----------------------------------------------------------------------===// @@ -185,6 +186,7 @@ def ReOp : Complex_Op<"re", let results = (outs AnyFloat:$real); let assemblyFormat = "$complex attr-dict `:` type($complex)"; + let hasFolder = 1; } diff --git a/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp b/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp index 6b4855dc4339..c0dcabe992cb 100644 --- a/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp +++ b/mlir/lib/Dialect/Complex/IR/ComplexOps.cpp @@ -17,3 +17,19 @@ using namespace mlir::complex; #define GET_OP_CLASSES #include "mlir/Dialect/Complex/IR/ComplexOps.cpp.inc" + +OpFoldResult ReOp::fold(ArrayRef operands) { + assert(operands.size() == 1 && "unary op takes 1 operand"); + ArrayAttr arrayAttr = operands[0].dyn_cast_or_null(); + if (arrayAttr && arrayAttr.size() == 2) + return arrayAttr[0]; + return {}; +} + +OpFoldResult ImOp::fold(ArrayRef operands) { + assert(operands.size() == 1 && "unary op takes 1 operand"); + ArrayAttr arrayAttr = operands[0].dyn_cast_or_null(); + if (arrayAttr && arrayAttr.size() == 2) + return arrayAttr[1]; + return {}; +} diff --git a/mlir/test/Dialect/Complex/canonicalize.mlir b/mlir/test/Dialect/Complex/canonicalize.mlir new file mode 100644 index 000000000000..3ad66f908f53 --- /dev/null +++ b/mlir/test/Dialect/Complex/canonicalize.mlir @@ -0,0 +1,19 @@ +// RUN: mlir-opt %s -canonicalize | FileCheck %s + +// CHECK-LABEL: func @real_of_const( +func @real_of_const() -> f32 { + // CHECK: %[[CST:.*]] = constant 1.000000e+00 : f32 + // CHECK-NEXT: return %[[CST]] : f32 + %complex = constant [1.0 : f32, 0.0 : f32] : complex + %1 = complex.re %complex : complex + return %1 : f32 +} + +// CHECK-LABEL: func @imag_of_const( +func @imag_of_const() -> f32 { + // CHECK: %[[CST:.*]] = constant 0.000000e+00 : f32 + // CHECK-NEXT: return %[[CST]] : f32 + %complex = constant [1.0 : f32, 0.0 : f32] : complex + %1 = complex.im %complex : complex + return %1 : f32 +}