[mlir][tosa] Fold exp(log) operation into no-op
authorKai Sasaki <lewuathe@gmail.com>
Fri, 12 May 2023 02:40:00 +0000 (11:40 +0900)
committerKai Sasaki <lewuathe@gmail.com>
Fri, 12 May 2023 03:03:26 +0000 (12:03 +0900)
Element-wise exp(log) can be canonicalized as no-op.

Reviewed By: eric-k256

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

mlir/include/mlir/Dialect/Tosa/IR/TosaOps.td
mlir/lib/Dialect/Tosa/IR/TosaCanonicalizations.cpp
mlir/test/Dialect/Tosa/canonicalize.mlir

index 015be1f..b594b35 100644 (file)
@@ -999,6 +999,8 @@ def Tosa_ExpOp : Tosa_Op<"exp", [
   let results = (outs
     Tosa_Tensor:$output
   );
+
+  let hasFolder = 1;
 }
 
 //===----------------------------------------------------------------------===//
index 7e161b1..11a9661 100644 (file)
@@ -1006,3 +1006,13 @@ OpFoldResult tosa::LogOp::fold(FoldAdaptor adaptor) {
 
   return {};
 }
+
+OpFoldResult tosa::ExpOp::fold(FoldAdaptor adaptor) {
+  auto input = getInput1();
+  // Element-wise exp(log(x)) = x
+  if (auto op = input.getDefiningOp<tosa::LogOp>()) {
+    return op.getInput1();
+  }
+
+  return {};
+}
index 9633a94..53567fb 100644 (file)
@@ -515,3 +515,13 @@ func.func @fold_log_exp(%arg0: tensor<?x1xf32>) -> tensor<?x1xf32> {
   %1 = "tosa.log"(%0) : (tensor<?x1xf32>) -> tensor<?x1xf32>
   return %1 : tensor<?x1xf32>
 }
+
+// -----
+
+// CHECK-LABEL: @fold_exp_log
+func.func @fold_exp_log(%arg0: tensor<?x1xf32>) -> tensor<?x1xf32> {
+  // CHECK: return %arg{{.*}} : tensor<?x1xf32>
+  %0 = "tosa.log"(%arg0) : (tensor<?x1xf32>) -> tensor<?x1xf32>
+  %1 = "tosa.exp"(%0) : (tensor<?x1xf32>) -> tensor<?x1xf32>
+  return %1 : tensor<?x1xf32>
+}