[Mlir-commits] [mlir] 338e76f - Lower complex.expm1 to standard dialect.

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed May 25 16:11:39 PDT 2022


Author: bixia1
Date: 2022-05-25T16:11:28-07:00
New Revision: 338e76f8ee3857ef06eb13f062ad9df39f29d465

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

LOG: Lower complex.expm1 to standard dialect.

Add a test.

Reviewed By: pifon2a

Differential Revision: https://reviews.llvm.org/D126409

Added: 
    

Modified: 
    mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp
    mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp b/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp
index a676e0afe9a88..e1eca6181dff9 100644
--- a/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp
+++ b/mlir/lib/Conversion/ComplexToStandard/ComplexToStandard.cpp
@@ -413,6 +413,30 @@ struct ExpOpConversion : public OpConversionPattern<complex::ExpOp> {
   }
 };
 
+struct Expm1OpConversion : public OpConversionPattern<complex::Expm1Op> {
+  using OpConversionPattern<complex::Expm1Op>::OpConversionPattern;
+
+  LogicalResult
+  matchAndRewrite(complex::Expm1Op op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override {
+    auto type = adaptor.getComplex().getType().cast<ComplexType>();
+    auto elementType = type.getElementType().cast<FloatType>();
+
+    mlir::ImplicitLocOpBuilder b(op.getLoc(), rewriter);
+    Value exp = b.create<complex::ExpOp>(adaptor.getComplex());
+
+    Value real = b.create<complex::ReOp>(elementType, exp);
+    Value one = b.create<arith::ConstantOp>(elementType,
+                                            b.getFloatAttr(elementType, 1));
+    Value realMinusOne = b.create<arith::SubFOp>(real, one);
+    Value imag = b.create<complex::ImOp>(elementType, exp);
+
+    rewriter.replaceOpWithNewOp<complex::CreateOp>(op, type, realMinusOne,
+                                                   imag);
+    return success();
+  }
+};
+
 struct LogOpConversion : public OpConversionPattern<complex::LogOp> {
   using OpConversionPattern<complex::LogOp>::OpConversionPattern;
 
@@ -718,6 +742,7 @@ void mlir::populateComplexToStandardConversionPatterns(
       CosOpConversion,
       DivOpConversion,
       ExpOpConversion,
+      Expm1OpConversion,
       LogOpConversion,
       Log1pOpConversion,
       MulOpConversion,

diff  --git a/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir b/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir
index 8e7098f832bb8..6f57e722b520e 100644
--- a/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir
+++ b/mlir/test/Conversion/ComplexToStandard/convert-to-standard.mlir
@@ -190,6 +190,27 @@ func.func @complex_exp(%arg: complex<f32>) -> complex<f32> {
 // CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL]], %[[RESULT_IMAG]] : complex<f32>
 // CHECK: return %[[RESULT]] : complex<f32>
 
+// CHECK-LABEL:   func.func @complex_expm1(
+// CHECK-SAME:                             %[[ARG:.*]]: complex<f32>) -> complex<f32> {
+func.func @complex_expm1(%arg: complex<f32>) -> complex<f32> {
+  %expm1 = complex.expm1 %arg: complex<f32>
+  return %expm1 : complex<f32>
+}
+// CHECK: %[[REAL_I:.*]] = complex.re %[[ARG]] : complex<f32>
+// CHECK: %[[IMAG_I:.*]] = complex.im %[[ARG]] : complex<f32>
+// CHECK: %[[EXP:.*]] = math.exp %[[REAL_I]] : f32
+// CHECK: %[[COS:.*]] = math.cos %[[IMAG_I]] : f32
+// CHECK: %[[RES_REAL:.*]] = arith.mulf %[[EXP]], %[[COS]] : f32
+// CHECK: %[[SIN:.*]] = math.sin %[[IMAG_I]] : f32
+// CHECK: %[[RES_IMAG:.*]] = arith.mulf %[[EXP]], %[[SIN]] : f32
+// CHECK: %[[RES_EXP:.*]] = complex.create %[[RES_REAL]], %[[RES_IMAG]] : complex<f32>
+// CHECK: %[[REAL:.*]] = complex.re %[[RES_EXP]] : complex<f32>
+// CHECK: %[[ONE:.*]] = arith.constant 1.000000e+00 : f32
+// CHECK: %[[REAL_M1:.*]] = arith.subf %[[REAL]], %[[ONE]] : f32
+// CHECK: %[[IMAG:.*]] = complex.im %[[RES_EXP]] : complex<f32>
+// CHECK: %[[RES:.*]] = complex.create %[[REAL_M1]], %[[IMAG]] : complex<f32>
+// CHECK: return %[[RES]] : complex<f32>
+
 // CHECK-LABEL: func @complex_log
 // CHECK-SAME: %[[ARG:.*]]: complex<f32>
 func.func @complex_log(%arg: complex<f32>) -> complex<f32> {


        


More information about the Mlir-commits mailing list