//===- DropEquivalentBufferResults.cpp - Calling convention conversion ----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This pass drops return values from functions if they are equivalent to one of // their arguments. E.g.: // // ``` // func.func @foo(%m : memref<?xf32>) -> (memref<?xf32>) { // return %m : memref<?xf32> // } // ``` // // This functions is rewritten to: // // ``` // func.func @foo(%m : memref<?xf32>) { // return // } // ``` // // All call sites are updated accordingly. If a function returns a cast of a // function argument, it is also considered equivalent. A cast is inserted at // the call site in that case. #include "mlir/Dialect/Bufferization/Transforms/Passes.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/IR/Operation.h" #include "mlir/Pass/Pass.h" namespace mlir { namespace bufferization { #define GEN_PASS_DEF_DROPEQUIVALENTBUFFERRESULTS #include "mlir/Dialect/Bufferization/Transforms/Passes.h.inc" } // namespace bufferization } // namespace mlir usingnamespacemlir; /// Return the unique ReturnOp that terminates `funcOp`. /// Return nullptr if there is no such unique ReturnOp. static func::ReturnOp getAssumedUniqueReturnOp(func::FuncOp funcOp) { … } /// Return the func::FuncOp called by `callOp`. static func::FuncOp getCalledFunction(CallOpInterface callOp) { … } LogicalResult mlir::bufferization::dropEquivalentBufferResults(ModuleOp module) { … } namespace { struct DropEquivalentBufferResultsPass : bufferization::impl::DropEquivalentBufferResultsBase< DropEquivalentBufferResultsPass> { … }; } // namespace std::unique_ptr<Pass> mlir::bufferization::createDropEquivalentBufferResultsPass() { … }