diff --git a/mlir/lib/Dialect/Index/IR/IndexDialect.cpp b/mlir/lib/Dialect/Index/IR/IndexDialect.cpp index 183d0e33b2523..887e8e1ae78b6 100644 --- a/mlir/lib/Dialect/Index/IR/IndexDialect.cpp +++ b/mlir/lib/Dialect/Index/IR/IndexDialect.cpp @@ -8,6 +8,7 @@ #include "mlir/Dialect/Index/IR/IndexDialect.h" #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h" +#include "mlir/Transforms/InliningUtils.h" using namespace mlir; using namespace mlir::index; @@ -15,10 +16,23 @@ using namespace mlir::index; //===----------------------------------------------------------------------===// // IndexDialect //===----------------------------------------------------------------------===// +namespace { +/// This class defines the interface for handling inlining for index +/// dialect operations. +struct IndexInlinerInterface : public DialectInlinerInterface { + using DialectInlinerInterface::DialectInlinerInterface; + + /// All index dialect ops can be inlined. + bool isLegalToInline(Operation *, Region *, bool, IRMapping &) const final { + return true; + } +}; +} // namespace void IndexDialect::initialize() { registerAttributes(); registerOperations(); + addInterfaces(); declarePromisedInterface(); } diff --git a/mlir/test/Dialect/Index/inliner-interface.mlir b/mlir/test/Dialect/Index/inliner-interface.mlir new file mode 100644 index 0000000000000..4c3d106a4fa67 --- /dev/null +++ b/mlir/test/Dialect/Index/inliner-interface.mlir @@ -0,0 +1,15 @@ +// RUN: mlir-opt %s -inline | FileCheck %s + +// CHECK-LABEL: @main +func.func @main(%arg0: i32) -> index { + // CHECK-NOT: call + // CHECK: index.castu + %0 = call @f(%arg0) : (i32) -> index + return %0 : index +} + +// CHECK-LABEL: @f +func.func @f(%arg0: i32) -> index { + %0 = index.castu %arg0 : i32 to index + return %0 : index +}