@@ -44,6 +44,7 @@ using namespace mlir;
4444using namespace mlir ::LLVM;
4545using mlir::LLVM::cconv::getMaxEnumValForCConv;
4646using mlir::LLVM::linkage::getMaxEnumValForLinkage;
47+ using mlir::LLVM::tailcallkind::getMaxEnumValForTailCallKind;
4748
4849#include " mlir/Dialect/LLVMIR/LLVMOpsDialect.cpp.inc"
4950
@@ -197,6 +198,7 @@ struct EnumTraits {};
197198REGISTER_ENUM_TYPE (Linkage);
198199REGISTER_ENUM_TYPE (UnnamedAddr);
199200REGISTER_ENUM_TYPE (CConv);
201+ REGISTER_ENUM_TYPE (TailCallKind);
200202REGISTER_ENUM_TYPE (Visibility);
201203} // namespace
202204
@@ -974,7 +976,7 @@ void CallOp::build(OpBuilder &builder, OperationState &state, TypeRange results,
974976 build (builder, state, results,
975977 TypeAttr::get (getLLVMFuncType (builder.getContext (), results, args)),
976978 callee, args, /* fastmathFlags=*/ nullptr , /* branch_weights=*/ nullptr ,
977- /* CConv=*/ nullptr ,
979+ /* CConv=*/ nullptr , /* TailCallKind= */ nullptr ,
978980 /* access_groups=*/ nullptr , /* alias_scopes=*/ nullptr ,
979981 /* noalias_scopes=*/ nullptr , /* tbaa=*/ nullptr );
980982}
@@ -997,7 +999,7 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
997999 build (builder, state, getCallOpResultTypes (calleeType),
9981000 TypeAttr::get (calleeType), callee, args, /* fastmathFlags=*/ nullptr ,
9991001 /* branch_weights=*/ nullptr , /* CConv=*/ nullptr ,
1000- /* access_groups=*/ nullptr ,
1002+ /* TailCallKind= */ nullptr , /* access_groups=*/ nullptr ,
10011003 /* alias_scopes=*/ nullptr , /* noalias_scopes=*/ nullptr , /* tbaa=*/ nullptr );
10021004}
10031005
@@ -1006,7 +1008,7 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
10061008 build (builder, state, getCallOpResultTypes (calleeType),
10071009 TypeAttr::get (calleeType), /* callee=*/ nullptr , args,
10081010 /* fastmathFlags=*/ nullptr , /* branch_weights=*/ nullptr ,
1009- /* CConv=*/ nullptr ,
1011+ /* CConv=*/ nullptr , /* TailCallKind= */ nullptr ,
10101012 /* access_groups=*/ nullptr , /* alias_scopes=*/ nullptr ,
10111013 /* noalias_scopes=*/ nullptr , /* tbaa=*/ nullptr );
10121014}
@@ -1017,7 +1019,7 @@ void CallOp::build(OpBuilder &builder, OperationState &state, LLVMFuncOp func,
10171019 build (builder, state, getCallOpResultTypes (calleeType),
10181020 TypeAttr::get (calleeType), SymbolRefAttr::get (func), args,
10191021 /* fastmathFlags=*/ nullptr , /* branch_weights=*/ nullptr ,
1020- /* CConv=*/ nullptr ,
1022+ /* CConv=*/ nullptr , /* TailCallKind= */ nullptr ,
10211023 /* access_groups=*/ nullptr , /* alias_scopes=*/ nullptr ,
10221024 /* noalias_scopes=*/ nullptr , /* tbaa=*/ nullptr );
10231025}
@@ -1180,6 +1182,9 @@ void CallOp::print(OpAsmPrinter &p) {
11801182 if (getCConv () != LLVM::CConv::C)
11811183 p << stringifyCConv (getCConv ()) << ' ' ;
11821184
1185+ if (getTailCallKind () != LLVM::TailCallKind::None)
1186+ p << tailcallkind::stringifyTailCallKind (getTailCallKind ()) << ' ' ;
1187+
11831188 // Print the direct callee if present as a function attribute, or an indirect
11841189 // callee (first operand) otherwise.
11851190 if (isDirect)
@@ -1194,7 +1199,8 @@ void CallOp::print(OpAsmPrinter &p) {
11941199 p << " vararg(" << calleeType << " )" ;
11951200
11961201 p.printOptionalAttrDict (processFMFAttr ((*this )->getAttrs ()),
1197- {getCConvAttrName (), " callee" , " callee_type" });
1202+ {getCConvAttrName (), " callee" , " callee_type" ,
1203+ getTailCallKindAttrName ()});
11981204
11991205 p << " : " ;
12001206 if (!isDirect)
@@ -1262,7 +1268,7 @@ static ParseResult parseOptionalCallFuncPtr(
12621268 return success ();
12631269}
12641270
1265- // <operation> ::= `llvm.call` (cconv)? (function-id | ssa-use)
1271+ // <operation> ::= `llvm.call` (cconv)? (tailcallkind)? ( function-id | ssa-use)
12661272// `(` ssa-use-list `)`
12671273// ( `vararg(` var-arg-func-type `)` )?
12681274// attribute-dict? `:` (type `,`)? function-type
@@ -1277,6 +1283,12 @@ ParseResult CallOp::parse(OpAsmParser &parser, OperationState &result) {
12771283 CConvAttr::get (parser.getContext (), parseOptionalLLVMKeyword<CConv>(
12781284 parser, result, LLVM::CConv::C)));
12791285
1286+ result.addAttribute (
1287+ getTailCallKindAttrName (result.name ),
1288+ TailCallKindAttr::get (parser.getContext (),
1289+ parseOptionalLLVMKeyword<TailCallKind>(
1290+ parser, result, LLVM::TailCallKind::None)));
1291+
12801292 // Parse a function pointer for indirect calls.
12811293 if (parseOptionalCallFuncPtr (parser, operands))
12821294 return failure ();
0 commit comments