| //===- BufferizableOpInterfaceImpl.cpp - Impl. of BufferizableOpInterface -===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "mlir/Dialect/ControlFlow/Transforms/BufferizableOpInterfaceImpl.h" |
| |
| #include "mlir/Dialect/Bufferization/IR/UnstructuredControlFlow.h" |
| #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h" |
| #include "mlir/IR/Operation.h" |
| |
| using namespace mlir; |
| using namespace mlir::bufferization; |
| |
| namespace mlir { |
| namespace cf { |
| namespace { |
| |
| template <typename ConcreteModel, typename ConcreteOp> |
| struct BranchLikeOpInterface |
| : public BranchOpBufferizableOpInterfaceExternalModel<ConcreteModel, |
| ConcreteOp> { |
| bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand, |
| const AnalysisState &state) const { |
| return false; |
| } |
| |
| bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand, |
| const AnalysisState &state) const { |
| return false; |
| } |
| |
| LogicalResult verifyAnalysis(Operation *op, |
| const AnalysisState &state) const { |
| return success(); |
| } |
| |
| LogicalResult bufferize(Operation *op, RewriterBase &rewriter, |
| const BufferizationOptions &options, |
| BufferizationState &state) const { |
| // The operands of this op are bufferized together with the block signature. |
| return success(); |
| } |
| }; |
| |
| /// Bufferization of cf.br. |
| struct BranchOpInterface |
| : public BranchLikeOpInterface<BranchOpInterface, cf::BranchOp> {}; |
| |
| /// Bufferization of cf.cond_br. |
| struct CondBranchOpInterface |
| : public BranchLikeOpInterface<CondBranchOpInterface, cf::CondBranchOp> {}; |
| |
| } // namespace |
| } // namespace cf |
| } // namespace mlir |
| |
| void mlir::cf::registerBufferizableOpInterfaceExternalModels( |
| DialectRegistry ®istry) { |
| registry.addExtension(+[](MLIRContext *ctx, cf::ControlFlowDialect *dialect) { |
| cf::BranchOp::attachInterface<BranchOpInterface>(*ctx); |
| cf::CondBranchOp::attachInterface<CondBranchOpInterface>(*ctx); |
| }); |
| } |