diff --git a/mlir/lib/Dialect/Func/Extensions/InlinerExtension.cpp b/mlir/lib/Dialect/Func/Extensions/InlinerExtension.cpp index 719a74a29a622..59e108c5b6c9e 100644 --- a/mlir/lib/Dialect/Func/Extensions/InlinerExtension.cpp +++ b/mlir/lib/Dialect/Func/Extensions/InlinerExtension.cpp @@ -23,6 +23,8 @@ namespace { struct FuncInlinerInterface : public DialectInlinerInterface { using DialectInlinerInterface::DialectInlinerInterface; + static constexpr const char* NoInlineAttrName = "noinline"; + //===--------------------------------------------------------------------===// // Analysis Hooks //===--------------------------------------------------------------------===// @@ -30,7 +32,7 @@ struct FuncInlinerInterface : public DialectInlinerInterface { /// All call operations can be inlined. bool isLegalToInline(Operation *call, Operation *callable, bool wouldBeCloned) const final { - return true; + return !call->hasAttr(NoInlineAttrName) && !callable->hasAttr(NoInlineAttrName); } /// All operations can be inlined. diff --git a/mlir/test/Transforms/inlining.mlir b/mlir/test/Transforms/inlining.mlir index 79a2936b104fa..262047132064c 100644 --- a/mlir/test/Transforms/inlining.mlir +++ b/mlir/test/Transforms/inlining.mlir @@ -19,6 +19,15 @@ func.func @inline_with_arg(%arg0 : i32) -> i32 { return %0 : i32 } +// CHECK-LABEL: func @noinline_with_arg +func.func @noinline_with_arg(%arg0 : i32) -> i32 { + // CHECK-NEXT: func_with_arg + // CHECK-NEXT: return + + %0 = call @func_with_arg(%arg0) {"noinline"=""} : (i32) -> i32 + return %0 : i32 +} + // Inline a function that has multiple return operations. func.func @func_with_multi_return(%a : i1) -> (i32) { cf.cond_br %a, ^bb1, ^bb2