//===- LowerDeallocations.cpp - Bufferization Deallocs to MemRef pass -----===// // // 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 file implements patterns to convert `bufferization.dealloc` operations // to the MemRef dialect. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/Arith/IR/Arith.h" #include "mlir/Dialect/Bufferization/IR/Bufferization.h" #include "mlir/Dialect/Bufferization/Transforms/Passes.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/MemRef/IR/MemRef.h" #include "mlir/Dialect/SCF/IR/SCF.h" #include "mlir/IR/BuiltinTypes.h" #include "mlir/Pass/Pass.h" #include "mlir/Transforms/DialectConversion.h" namespace mlir { namespace bufferization { #define GEN_PASS_DEF_LOWERDEALLOCATIONS #include "mlir/Dialect/Bufferization/Transforms/Passes.h.inc" } // namespace bufferization } // namespace mlir usingnamespacemlir; namespace { /// The DeallocOpConversion transforms all bufferization dealloc operations into /// memref dealloc operations potentially guarded by scf if operations. /// Additionally, memref extract_aligned_pointer_as_index and arith operations /// are inserted to compute the guard conditions. We distinguish multiple cases /// to provide an overall more efficient lowering. In the general case, a helper /// func is created to avoid quadratic code size explosion (relative to the /// number of operands of the dealloc operation). For examples of each case, /// refer to the documentation of the member functions of this class. class DeallocOpConversion : public OpConversionPattern<bufferization::DeallocOp> { … }; } // namespace namespace { struct LowerDeallocationsPass : public bufferization::impl::LowerDeallocationsBase< LowerDeallocationsPass> { … }; } // namespace func::FuncOp mlir::bufferization::buildDeallocationLibraryFunction( OpBuilder &builder, Location loc, SymbolTable &symbolTable) { … } void mlir::bufferization::populateBufferizationDeallocLoweringPattern( RewritePatternSet &patterns, const bufferization::DeallocHelperMap &deallocHelperFuncMap) { … } std::unique_ptr<Pass> mlir::bufferization::createLowerDeallocationsPass() { … }