Skip to content

Commit 62d62b8

Browse files
committed
Do not inline functions containing llvm.blocktag
1 parent 36b5501 commit 62d62b8

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,8 +726,9 @@ struct LLVMInlinerInterface : public DialectInlinerInterface {
726726
}
727727

728728
bool isLegalToInline(Operation *op, Region *, bool, IRMapping &) const final {
729-
// The inliner cannot handle variadic function arguments.
730-
return !isa<LLVM::VaStartOp>(op);
729+
// The inliner cannot handle variadic function arguments nor blocktag
730+
// operations.
731+
return !(isa<LLVM::VaStartOp>(op) || isa<LLVM::BlockTagOp>(op));
731732
}
732733

733734
/// Handle the given inlined return by replacing it with a branch. This

mlir/test/Dialect/LLVMIR/inlining.mlir

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,3 +692,19 @@ llvm.func @caller(%x : i32) -> i32 {
692692
%z = llvm.call @unreachable_func(%x) : (i32) -> (i32)
693693
llvm.return %z : i32
694694
}
695+
696+
// -----
697+
// Check that @func is not inlined because of llvm.blocktag
698+
699+
func.func @func(%arg0 : i32) -> i32 {
700+
llvm.blocktag <id = 1>
701+
llvm.return %arg0 : i32
702+
}
703+
// CHECK-LABEL: @llvm_ret
704+
// CHECK-NOT: llvm.blocktag
705+
// CHECK: %[[R:.*]] = call
706+
// CHECK: return %[[R]]
707+
func.func @llvm_ret(%arg0 : i32) -> i32 {
708+
%res = call @func(%arg0) : (i32) -> (i32)
709+
return %res : i32
710+
}

0 commit comments

Comments
 (0)