Skip to content

Commit f6e107d

Browse files
nikita-kudsramasit
authored andcommitted
Add method getInlineBlockAndPoint for DialectInlinerInterface
1 parent f712892 commit f6e107d

File tree

5 files changed

+29
-3
lines changed

5 files changed

+29
-3
lines changed

mlir/include/mlir/Transforms/InliningUtils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,14 @@ class DialectInlinerInterface
172172
return result;
173173
}
174174

175+
/// Hook to cleanup IR before erase call op
176+
virtual void eraseCall(Operation *call) const;
177+
178+
/// Hook to get proper place where callable region will be inlined
179+
/// By default returns block of the call operation
180+
virtual std::tuple<Block*, Block::iterator>
181+
getInlineBlockAndPoint(Operation *call) const;
182+
175183
/// Process a set of blocks that have been inlined for a call. This callback
176184
/// is invoked before inlined terminator operations have been processed.
177185
virtual void processInlinedCallBlocks(

mlir/lib/Dialect/Arith/IR/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ add_mlir_dialect_library(MLIRArithDialect
2222
MLIRArithOpsInterfacesIncGen
2323

2424
LINK_LIBS PUBLIC
25+
MLIRTransformUtils
2526
MLIRCastInterfaces
2627
MLIRDialect
2728
MLIRInferIntRangeCommon

mlir/lib/Dialect/LLVMIR/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ add_mlir_dialect_library(MLIRLLVMDialect
2828
Core
2929

3030
LINK_LIBS PUBLIC
31+
MLIRTransformUtils
3132
MLIRCallInterfaces
3233
MLIRControlFlowInterfaces
3334
MLIRDataLayoutInterfaces

mlir/lib/Transforms/Utils/Inliner.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,8 @@ Inliner::Impl::inlineCallsInSCC(InlinerInterfaceImpl &inlinerIface,
688688
useList.mergeUsesAfterInlining(it.targetNode, it.sourceNode);
689689

690690
// then erase the call.
691-
call.erase();
691+
const auto *callInterface = inlinerIface.getInterfaceFor(call->getDialect());
692+
callInterface->eraseCall(call);
692693

693694
// If we inlined in place, mark the node for deletion.
694695
if (inlineInPlace) {

mlir/lib/Transforms/Utils/InliningUtils.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ static void remapInlinedOperands(iterator_range<Region::iterator> inlinedBlocks,
6969
block.walk(remapOperands);
7070
}
7171

72+
//===----------------------------------------------------------------------===//
73+
// DialectInlinerInterface
74+
//===----------------------------------------------------------------------===//
75+
76+
void DialectInlinerInterface::eraseCall(Operation *call) const {
77+
call->erase();
78+
}
79+
80+
std::tuple<Block*, Block::iterator>
81+
DialectInlinerInterface::getInlineBlockAndPoint(Operation *call) const {
82+
return std::make_tuple(call->getBlock(), std::next(call->getIterator()));
83+
}
84+
7285
//===----------------------------------------------------------------------===//
7386
// InlinerInterface
7487
//===----------------------------------------------------------------------===//
@@ -530,9 +543,11 @@ LogicalResult mlir::inlineCall(InlinerInterface &interface,
530543
if (!interface.isLegalToInline(call, callable, shouldCloneInlinedRegion))
531544
return cleanupState();
532545

546+
auto [inlineBlock, inlinePoint] = callInterface->getInlineBlockAndPoint(call);
547+
533548
// Attempt to inline the call.
534-
if (failed(inlineRegionImpl(interface, src, call->getBlock(),
535-
++call->getIterator(), mapper, callResults,
549+
if (failed(inlineRegionImpl(interface, src, inlineBlock,
550+
inlinePoint, mapper, callResults,
536551
callableResultTypes, call.getLoc(),
537552
shouldCloneInlinedRegion, call)))
538553
return cleanupState();

0 commit comments

Comments
 (0)