//===----------------------------------------------------------------------===//
#include "mlir/Dialect/Bufferization/IR/Bufferization.h"
+#include "mlir/Transforms/InliningUtils.h"
using namespace mlir;
using namespace mlir::bufferization;
#include "mlir/Dialect/Bufferization/IR/BufferizationOpsDialect.cpp.inc"
//===----------------------------------------------------------------------===//
+// Bufferization Dialect Interfaces
+//===----------------------------------------------------------------------===//
+
+namespace {
+struct BufferizationInlinerInterface : public DialectInlinerInterface {
+ using DialectInlinerInterface::DialectInlinerInterface;
+
+ /// Operations in Bufferization dialect are always legal to inline.
+ bool isLegalToInline(Operation *, Region *, bool,
+ BlockAndValueMapping &) const final {
+ return true;
+ }
+};
+} // end anonymous namespace
+
+//===----------------------------------------------------------------------===//
// Bufferization Dialect
//===----------------------------------------------------------------------===//
#define GET_OP_LIST
#include "mlir/Dialect/Bufferization/IR/BufferizationOps.cpp.inc"
>();
+ addInterfaces<BufferizationInlinerInterface>();
}
--- /dev/null
+// RUN: mlir-opt %s -inline | FileCheck %s
+
+// CHECK-LABEL: func @test_inline
+// CHECK-SAME: (%[[ARG:.*]]: memref<*xf32>)
+// CHECK-NOT: call
+// CHECK: %[[RES:.*]] = bufferization.clone %[[ARG]]
+// CHECK: return %[[RES]]
+func @test_inline(%buf : memref<*xf32>) -> memref<*xf32> {
+ %0 = call @inner_func(%buf) : (memref<*xf32>) -> memref<*xf32>
+ return %0 : memref<*xf32>
+}
+
+func @inner_func(%buf : memref<*xf32>) -> memref<*xf32> {
+ %clone = bufferization.clone %buf : memref<*xf32> to memref<*xf32>
+ return %clone : memref<*xf32>
+}