1*6ecebb49SMatthias Springer //===- BufferizableOpInterfaceImpl.cpp - Impl. of BufferizableOpInterface -===//
2*6ecebb49SMatthias Springer //
3*6ecebb49SMatthias Springer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*6ecebb49SMatthias Springer // See https://llvm.org/LICENSE.txt for license information.
5*6ecebb49SMatthias Springer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*6ecebb49SMatthias Springer //
7*6ecebb49SMatthias Springer //===----------------------------------------------------------------------===//
8*6ecebb49SMatthias Springer
9*6ecebb49SMatthias Springer #include "mlir/Dialect/ControlFlow/Transforms/BufferizableOpInterfaceImpl.h"
10*6ecebb49SMatthias Springer
11*6ecebb49SMatthias Springer #include "mlir/Dialect/Bufferization/IR/Bufferization.h"
12*6ecebb49SMatthias Springer #include "mlir/Dialect/Bufferization/IR/UnstructuredControlFlow.h"
13*6ecebb49SMatthias Springer #include "mlir/Dialect/Bufferization/Transforms/OneShotAnalysis.h"
14*6ecebb49SMatthias Springer #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
15*6ecebb49SMatthias Springer #include "mlir/Dialect/MemRef/IR/MemRef.h"
16*6ecebb49SMatthias Springer #include "mlir/IR/Dialect.h"
17*6ecebb49SMatthias Springer #include "mlir/IR/Operation.h"
18*6ecebb49SMatthias Springer
19*6ecebb49SMatthias Springer using namespace mlir;
20*6ecebb49SMatthias Springer using namespace mlir::bufferization;
21*6ecebb49SMatthias Springer
22*6ecebb49SMatthias Springer namespace mlir {
23*6ecebb49SMatthias Springer namespace cf {
24*6ecebb49SMatthias Springer namespace {
25*6ecebb49SMatthias Springer
26*6ecebb49SMatthias Springer template <typename ConcreteModel, typename ConcreteOp>
27*6ecebb49SMatthias Springer struct BranchLikeOpInterface
28*6ecebb49SMatthias Springer : public BranchOpBufferizableOpInterfaceExternalModel<ConcreteModel,
29*6ecebb49SMatthias Springer ConcreteOp> {
bufferizesToMemoryReadmlir::cf::__anon7040259a0111::BranchLikeOpInterface30*6ecebb49SMatthias Springer bool bufferizesToMemoryRead(Operation *op, OpOperand &opOperand,
31*6ecebb49SMatthias Springer const AnalysisState &state) const {
32*6ecebb49SMatthias Springer return false;
33*6ecebb49SMatthias Springer }
34*6ecebb49SMatthias Springer
bufferizesToMemoryWritemlir::cf::__anon7040259a0111::BranchLikeOpInterface35*6ecebb49SMatthias Springer bool bufferizesToMemoryWrite(Operation *op, OpOperand &opOperand,
36*6ecebb49SMatthias Springer const AnalysisState &state) const {
37*6ecebb49SMatthias Springer return false;
38*6ecebb49SMatthias Springer }
39*6ecebb49SMatthias Springer
verifyAnalysismlir::cf::__anon7040259a0111::BranchLikeOpInterface40*6ecebb49SMatthias Springer LogicalResult verifyAnalysis(Operation *op,
41*6ecebb49SMatthias Springer const AnalysisState &state) const {
42*6ecebb49SMatthias Springer return success();
43*6ecebb49SMatthias Springer }
44*6ecebb49SMatthias Springer
bufferizemlir::cf::__anon7040259a0111::BranchLikeOpInterface45*6ecebb49SMatthias Springer LogicalResult bufferize(Operation *op, RewriterBase &rewriter,
46*6ecebb49SMatthias Springer const BufferizationOptions &options) const {
47*6ecebb49SMatthias Springer // The operands of this op are bufferized together with the block signature.
48*6ecebb49SMatthias Springer return success();
49*6ecebb49SMatthias Springer }
50*6ecebb49SMatthias Springer };
51*6ecebb49SMatthias Springer
52*6ecebb49SMatthias Springer /// Bufferization of cf.br.
53*6ecebb49SMatthias Springer struct BranchOpInterface
54*6ecebb49SMatthias Springer : public BranchLikeOpInterface<BranchOpInterface, cf::BranchOp> {};
55*6ecebb49SMatthias Springer
56*6ecebb49SMatthias Springer /// Bufferization of cf.cond_br.
57*6ecebb49SMatthias Springer struct CondBranchOpInterface
58*6ecebb49SMatthias Springer : public BranchLikeOpInterface<CondBranchOpInterface, cf::CondBranchOp> {};
59*6ecebb49SMatthias Springer
60*6ecebb49SMatthias Springer } // namespace
61*6ecebb49SMatthias Springer } // namespace cf
62*6ecebb49SMatthias Springer } // namespace mlir
63*6ecebb49SMatthias Springer
registerBufferizableOpInterfaceExternalModels(DialectRegistry & registry)64*6ecebb49SMatthias Springer void mlir::cf::registerBufferizableOpInterfaceExternalModels(
65*6ecebb49SMatthias Springer DialectRegistry ®istry) {
66*6ecebb49SMatthias Springer registry.addExtension(+[](MLIRContext *ctx, cf::ControlFlowDialect *dialect) {
67*6ecebb49SMatthias Springer cf::BranchOp::attachInterface<BranchOpInterface>(*ctx);
68*6ecebb49SMatthias Springer cf::CondBranchOp::attachInterface<CondBranchOpInterface>(*ctx);
69*6ecebb49SMatthias Springer });
70*6ecebb49SMatthias Springer }
71