diff --git a/clang/lib/CodeGen/CGCoroutine.cpp b/clang/lib/CodeGen/CGCoroutine.cpp index 47c077be4138a..0e63ef91415ee 100644 --- a/clang/lib/CodeGen/CGCoroutine.cpp +++ b/clang/lib/CodeGen/CGCoroutine.cpp @@ -403,8 +403,11 @@ struct CallCoroEnd final : public EHScopeStack::Cleanup { llvm::Function *CoroEndFn = CGM.getIntrinsic(llvm::Intrinsic::coro_end); // See if we have a funclet bundle to associate coro.end with. (WinEH) auto Bundles = getBundlesForCoroEnd(CGF); - auto *CoroEnd = CGF.Builder.CreateCall( - CoroEndFn, {NullPtr, CGF.Builder.getTrue()}, Bundles); + auto *CoroEnd = + CGF.Builder.CreateCall(CoroEndFn, + {NullPtr, CGF.Builder.getTrue(), + llvm::ConstantTokenNone::get(CoroEndFn->getContext())}, + Bundles); if (Bundles.empty()) { // Otherwise, (landingpad model), create a conditional branch that leads // either to a cleanup block or a block with EH resume instruction. @@ -755,7 +758,9 @@ void CodeGenFunction::EmitCoroutineBody(const CoroutineBodyStmt &S) { // Emit coro.end before getReturnStmt (and parameter destructors), since // resume and destroy parts of the coroutine should not include them. llvm::Function *CoroEnd = CGM.getIntrinsic(llvm::Intrinsic::coro_end); - Builder.CreateCall(CoroEnd, {NullPtr, Builder.getFalse()}); + Builder.CreateCall(CoroEnd, + {NullPtr, Builder.getFalse(), + llvm::ConstantTokenNone::get(CoroEnd->getContext())}); if (Stmt *Ret = S.getReturnStmt()) { // Since we already emitted the return value above, so we shouldn't @@ -824,7 +829,11 @@ RValue CodeGenFunction::EmitCoroutineIntrinsic(const CallExpr *E, } for (const Expr *Arg : E->arguments()) Args.push_back(EmitScalarExpr(Arg)); - + // @llvm.coro.end takes a token parameter. Add token 'none' as the last + // argument. + if (IID == llvm::Intrinsic::coro_end) + Args.push_back(llvm::ConstantTokenNone::get(getLLVMContext())); + llvm::Function *F = CGM.getIntrinsic(IID); llvm::CallInst *Call = Builder.CreateCall(F, Args); diff --git a/clang/test/CodeGenCoroutines/coro-builtins.c b/clang/test/CodeGenCoroutines/coro-builtins.c index e58820db67839..79f119b2b60ff 100644 --- a/clang/test/CodeGenCoroutines/coro-builtins.c +++ b/clang/test/CodeGenCoroutines/coro-builtins.c @@ -37,7 +37,7 @@ void f(int n) { // CHECK-NEXT: call ptr @llvm.coro.free(token %[[COROID]], ptr %[[FRAME]]) __builtin_coro_free(__builtin_coro_frame()); - // CHECK-NEXT: call i1 @llvm.coro.end(ptr %[[FRAME]], i1 false) + // CHECK-NEXT: call i1 @llvm.coro.end(ptr %[[FRAME]], i1 false, token none) __builtin_coro_end(__builtin_coro_frame(), 0); // CHECK-NEXT: call i8 @llvm.coro.suspend(token none, i1 true) diff --git a/clang/test/CodeGenCoroutines/coro-eh-cleanup.cpp b/clang/test/CodeGenCoroutines/coro-eh-cleanup.cpp index c4a6ae96f551e..725cf8faa6b4c 100644 --- a/clang/test/CodeGenCoroutines/coro-eh-cleanup.cpp +++ b/clang/test/CodeGenCoroutines/coro-eh-cleanup.cpp @@ -60,7 +60,7 @@ coro_t f() { // CHECK: [[COROENDBB]]: // CHECK-NEXT: %[[CLPAD:.+]] = cleanuppad within none -// CHECK-NEXT: call i1 @llvm.coro.end(ptr null, i1 true) [ "funclet"(token %[[CLPAD]]) ] +// CHECK-NEXT: call i1 @llvm.coro.end(ptr null, i1 true, token none) [ "funclet"(token %[[CLPAD]]) ] // CHECK-NEXT: cleanupret from %[[CLPAD]] unwind label // CHECK-LPAD: @_Z1fv( @@ -76,7 +76,7 @@ coro_t f() { // CHECK-LPAD: to label %{{.+}} unwind label %[[UNWINDBB:.+]] // CHECK-LPAD: [[UNWINDBB]]: -// CHECK-LPAD: %[[I1RESUME:.+]] = call i1 @llvm.coro.end(ptr null, i1 true) +// CHECK-LPAD: %[[I1RESUME:.+]] = call i1 @llvm.coro.end(ptr null, i1 true, token none) // CHECK-LPAD: br i1 %[[I1RESUME]], label %[[EHRESUME:.+]], label // CHECK-LPAD: [[EHRESUME]]: // CHECK-LPAD-NEXT: %[[exn:.+]] = load ptr, ptr %exn.slot, align 8 diff --git a/llvm/docs/Coroutines.rst b/llvm/docs/Coroutines.rst index 0a65a39119fd8..5ab732f702c42 100644 --- a/llvm/docs/Coroutines.rst +++ b/llvm/docs/Coroutines.rst @@ -151,8 +151,8 @@ lowerings: - In yield-once returned-continuation lowering, the coroutine must suspend itself exactly once (or throw an exception). The ramp function returns a continuation function pointer and yielded - values, but the continuation function simply returns `void` - when the coroutine has run to completion. + values, the continuation function may optionally return ordinary + results when the coroutine has run to completion. The coroutine frame is maintained in a fixed-size buffer that is passed to the `coro.id` intrinsic, which guarantees a certain size @@ -303,7 +303,7 @@ The LLVM IR for this coroutine looks like this: call void @free(ptr %mem) br label %suspend suspend: - %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false) + %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -630,7 +630,7 @@ store the current value produced by a coroutine. call void @free(ptr %mem) br label %suspend suspend: - %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false) + %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -1312,8 +1312,8 @@ Arguments: """""""""" As for ``llvm.core.id.retcon``, except that the return type of the -continuation prototype must be `void` instead of matching the -coroutine's return type. +continuation prototype must represent the normal return type of the continuation +(instead of matching the coroutine's return type). Semantics: """""""""" @@ -1326,7 +1326,7 @@ A frontend should emit function attribute `presplitcoroutine` for the coroutine. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: - declare i1 @llvm.coro.end(ptr , i1 ) + declare i1 @llvm.coro.end(ptr , i1 , token ) Overview: """"""""" @@ -1347,6 +1347,12 @@ The second argument should be `true` if this coro.end is in the block that is part of the unwind sequence leaving the coroutine body due to an exception and `false` otherwise. +Non-trivial (non-none) token argument can only be specified for unique-suspend +returned-continuation coroutines where it must be a token value produced by +'``llvm.coro.end.results``' intrinsic. + +Only none token is allowed for coro.end calls in unwind sections + Semantics: """""""""" The purpose of this intrinsic is to allow frontends to mark the cleanup and @@ -1378,7 +1384,7 @@ For landingpad based exception model, it is expected that frontend uses the .. code-block:: llvm ehcleanup: - %InResumePart = call i1 @llvm.coro.end(ptr null, i1 true) + %InResumePart = call i1 @llvm.coro.end(ptr null, i1 true, token none) br i1 %InResumePart, label %eh.resume, label %cleanup.cont cleanup.cont: @@ -1403,7 +1409,7 @@ referring to an enclosing cleanuppad as follows: ehcleanup: %tok = cleanuppad within none [] - %unused = call i1 @llvm.coro.end(ptr null, i1 true) [ "funclet"(token %tok) ] + %unused = call i1 @llvm.coro.end(ptr null, i1 true, token none) [ "funclet"(token %tok) ] cleanupret from %tok unwind label %RestOfTheCleanup The `CoroSplit` pass, if the funclet bundle is present, will insert @@ -1428,6 +1434,53 @@ The following table summarizes the handling of `coro.end`_ intrinsic. | | Landingpad | mark coroutine as done | mark coroutine done | +------------+-------------+------------------------+---------------------------------+ +.. _coro.end.results: + +'llvm.coro.end.results' Intrinsic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:: + + declare token @llvm.coro.end.results(...) + +Overview: +""""""""" + +The '``llvm.coro.end.results``' intrinsic captures values to be returned from +unique-suspend returned-continuation coroutines. + +Arguments: +"""""""""" + +The number of arguments must match the return type of the continuation function: + +- if the return type of the continuation function is ``void`` there must be no + arguments + +- if the return type of the continuation function is a ``struct``, the arguments + will be of element types of that ``struct`` in order; + +- otherwise, it is just the return value of the continuation function. + +.. code-block:: llvm + + define {ptr, ptr} @g(ptr %buffer, ptr %ptr, i8 %val) presplitcoroutine { + entry: + %id = call token @llvm.coro.id.retcon.once(i32 8, i32 8, ptr %buffer, + ptr @prototype, + ptr @allocate, ptr @deallocate) + %hdl = call ptr @llvm.coro.begin(token %id, ptr null) + + ... + + cleanup: + %tok = call token (...) @llvm.coro.end.results(i8 %val) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token %tok) + unreachable + + ... + + declare i8 @prototype(ptr, i1 zeroext) + 'llvm.coro.end.async' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td index cd6061a190fbb..e94b59508de7b 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -1643,7 +1643,8 @@ def int_coro_free : Intrinsic<[llvm_ptr_ty], [llvm_token_ty, llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly, ReadOnly>, NoCapture>]>; -def int_coro_end : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_i1_ty], []>; +def int_coro_end : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_i1_ty, llvm_token_ty], []>; +def int_coro_end_results : Intrinsic<[llvm_token_ty], [llvm_vararg_ty]>; def int_coro_end_async : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_i1_ty, llvm_vararg_ty], []>; diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index eedde64203e09..f57c8693e4996 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -951,6 +951,12 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { F->arg_begin()->getType()); return true; } + if (Name.equals("coro.end") && F->arg_size() == 2) { + rename(F); + NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::coro_end); + return true; + } + break; } case 'd': @@ -4207,6 +4213,13 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) { break; } + case Intrinsic::coro_end: { + SmallVector Args(CI->args()); + Args.push_back(ConstantTokenNone::get(CI->getContext())); + NewCall = Builder.CreateCall(NewFn, Args); + break; + } + case Intrinsic::vector_extract: { StringRef Name = F->getName(); Name = Name.substr(5); // Strip llvm diff --git a/llvm/lib/Transforms/Coroutines/CoroInstr.h b/llvm/lib/Transforms/Coroutines/CoroInstr.h index 014938c15a0a3..2e7d9b2ce028a 100644 --- a/llvm/lib/Transforms/Coroutines/CoroInstr.h +++ b/llvm/lib/Transforms/Coroutines/CoroInstr.h @@ -611,8 +611,37 @@ class LLVM_LIBRARY_VISIBILITY CoroAlignInst : public IntrinsicInst { } }; +/// This represents the llvm.end.results instruction. +class LLVM_LIBRARY_VISIBILITY CoroEndResults : public IntrinsicInst { +public: + op_iterator retval_begin() { return arg_begin(); } + const_op_iterator retval_begin() const { return arg_begin(); } + + op_iterator retval_end() { return arg_end(); } + const_op_iterator retval_end() const { return arg_end(); } + + iterator_range return_values() { + return make_range(retval_begin(), retval_end()); + } + iterator_range return_values() const { + return make_range(retval_begin(), retval_end()); + } + + unsigned numReturns() const { + return std::distance(retval_begin(), retval_end()); + } + + // Methods to support type inquiry through isa, cast, and dyn_cast: + static bool classof(const IntrinsicInst *I) { + return I->getIntrinsicID() == Intrinsic::coro_end_results; + } + static bool classof(const Value *V) { + return isa(V) && classof(cast(V)); + } +}; + class LLVM_LIBRARY_VISIBILITY AnyCoroEndInst : public IntrinsicInst { - enum { FrameArg, UnwindArg }; + enum { FrameArg, UnwindArg, TokenArg }; public: bool isFallthrough() const { return !isUnwind(); } @@ -620,6 +649,15 @@ class LLVM_LIBRARY_VISIBILITY AnyCoroEndInst : public IntrinsicInst { return cast(getArgOperand(UnwindArg))->isOneValue(); } + bool hasResults() const { + return !isa(getArgOperand(TokenArg)); + } + + CoroEndResults *getResults() const { + assert(hasResults()); + return cast(getArgOperand(TokenArg)); + } + // Methods to support type inquiry through isa, cast, and dyn_cast: static bool classof(const IntrinsicInst *I) { auto ID = I->getIntrinsicID(); diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp index 933771c2d0898..614067fb19745 100644 --- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp @@ -234,6 +234,8 @@ static void replaceFallthroughCoroEnd(AnyCoroEndInst *End, switch (Shape.ABI) { // The cloned functions in switch-lowering always return void. case coro::ABI::Switch: + assert(!cast(End)->hasResults() && + "switch coroutine should not return any values"); // coro.end doesn't immediately end the coroutine in the main function // in this lowering, because we need to deallocate the coroutine. if (!InResume) @@ -251,14 +253,45 @@ static void replaceFallthroughCoroEnd(AnyCoroEndInst *End, // In unique continuation lowering, the continuations always return void. // But we may have implicitly allocated storage. - case coro::ABI::RetconOnce: + case coro::ABI::RetconOnce: { maybeFreeRetconStorage(Builder, Shape, FramePtr, CG); - Builder.CreateRetVoid(); + auto *CoroEnd = cast(End); + auto *RetTy = Shape.getResumeFunctionType()->getReturnType(); + + if (!CoroEnd->hasResults()) { + assert(RetTy->isVoidTy()); + Builder.CreateRetVoid(); + break; + } + + auto *CoroResults = CoroEnd->getResults(); + unsigned NumReturns = CoroResults->numReturns(); + + if (auto *RetStructTy = dyn_cast(RetTy)) { + assert(RetStructTy->getNumElements() == NumReturns && + "numbers of returns should match resume function singature"); + Value *ReturnValue = UndefValue::get(RetStructTy); + unsigned Idx = 0; + for (Value *RetValEl : CoroResults->return_values()) + ReturnValue = Builder.CreateInsertValue(ReturnValue, RetValEl, Idx++); + Builder.CreateRet(ReturnValue); + } else if (NumReturns == 0) { + assert(RetTy->isVoidTy()); + Builder.CreateRetVoid(); + } else { + assert(NumReturns == 1); + Builder.CreateRet(*CoroResults->retval_begin()); + } + CoroResults->replaceAllUsesWith(ConstantTokenNone::get(CoroResults->getContext())); + CoroResults->eraseFromParent(); break; + } // In non-unique continuation lowering, we signal completion by returning // a null continuation. case coro::ABI::Retcon: { + assert(!cast(End)->hasResults() && + "retcon coroutine should not return any values"); maybeFreeRetconStorage(Builder, Shape, FramePtr, CG); auto RetTy = Shape.getResumeFunctionType()->getReturnType(); auto RetStructTy = dyn_cast(RetTy); diff --git a/llvm/test/Assembler/auto_upgrade_intrinsics.ll b/llvm/test/Assembler/auto_upgrade_intrinsics.ll index acca39e314033..e3603846e9e9b 100644 --- a/llvm/test/Assembler/auto_upgrade_intrinsics.ll +++ b/llvm/test/Assembler/auto_upgrade_intrinsics.ll @@ -47,6 +47,13 @@ entry: ret void } +declare i1 @llvm.coro.end(ptr, i1) +define void @test.coro.end(ptr %ptr) { +; CHECK-LABEL: @test.coro.end( +; CHECK: call i1 @llvm.coro.end(ptr %ptr, i1 false, token none) + call i1 @llvm.coro.end(ptr %ptr, i1 false) + ret void +} @a = private global [60 x i8] zeroinitializer, align 1 diff --git a/llvm/test/Transforms/Coroutines/ArgAddr.ll b/llvm/test/Transforms/Coroutines/ArgAddr.ll index a06dd66da1c58..1fbc8e1d49767 100644 --- a/llvm/test/Transforms/Coroutines/ArgAddr.ll +++ b/llvm/test/Transforms/Coroutines/ArgAddr.ll @@ -45,7 +45,7 @@ coro_Cleanup: br label %coro_Suspend coro_Suspend: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret ptr %1 } @@ -69,7 +69,7 @@ declare i32 @llvm.coro.size.i32() declare ptr @llvm.coro.begin(token, ptr) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-align16.ll b/llvm/test/Transforms/Coroutines/coro-align16.ll index fdd8af7497680..39902be9149e8 100644 --- a/llvm/test/Transforms/Coroutines/coro-align16.ll +++ b/llvm/test/Transforms/Coroutines/coro-align16.ll @@ -24,7 +24,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @capture_call(ptr) declare void @nocapture_call(ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-align32.ll b/llvm/test/Transforms/Coroutines/coro-align32.ll index 032fda5f3b2a7..3d910e951259b 100644 --- a/llvm/test/Transforms/Coroutines/coro-align32.ll +++ b/llvm/test/Transforms/Coroutines/coro-align32.ll @@ -28,7 +28,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -48,7 +48,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @capture_call(ptr) declare void @nocapture_call(ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-align64-02.ll b/llvm/test/Transforms/Coroutines/coro-align64-02.ll index 2eab5c581db31..3e2e33d2da260 100644 --- a/llvm/test/Transforms/Coroutines/coro-align64-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-align64-02.ll @@ -24,7 +24,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @capture_call(ptr) declare void @nocapture_call(ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-align64.ll b/llvm/test/Transforms/Coroutines/coro-align64.ll index aff05b62f1ac9..9623a99a8b27e 100644 --- a/llvm/test/Transforms/Coroutines/coro-align64.ll +++ b/llvm/test/Transforms/Coroutines/coro-align64.ll @@ -24,7 +24,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @capture_call(ptr) declare void @nocapture_call(ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-align8-02.ll b/llvm/test/Transforms/Coroutines/coro-align8-02.ll index 2bbdf0e0164ee..758d4ce3e21b2 100644 --- a/llvm/test/Transforms/Coroutines/coro-align8-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-align8-02.ll @@ -20,7 +20,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -40,7 +40,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @aligned_alloc(i32, i32) declare void @free(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-align8.ll b/llvm/test/Transforms/Coroutines/coro-align8.ll index a8bdba356b1fb..48a2687cc4799 100644 --- a/llvm/test/Transforms/Coroutines/coro-align8.ll +++ b/llvm/test/Transforms/Coroutines/coro-align8.ll @@ -24,7 +24,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @capture_call(ptr) declare void @nocapture_call(ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll b/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll index 31118c4c25770..bdd49413cf15b 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll @@ -24,7 +24,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -54,7 +54,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @myAlloc(i64, i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll b/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll index 9eae6cc2cfa7e..a0ab5b733fdf0 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll @@ -21,7 +21,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -49,7 +49,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @myAlloc(i64, i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-01.ll b/llvm/test/Transforms/Coroutines/coro-alloca-01.ll index 9ba39491776ea..5208c055c4fdf 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-01.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-01.ll @@ -33,7 +33,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -55,7 +55,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @print(ptr) declare noalias ptr @malloc(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-02.ll b/llvm/test/Transforms/Coroutines/coro-alloca-02.ll index 76d9a0126382e..83f56009f00e3 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-02.ll @@ -25,7 +25,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @print(ptr) declare noalias ptr @malloc(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-03.ll b/llvm/test/Transforms/Coroutines/coro-alloca-03.ll index ec76a8a553654..7740ed440a0d5 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-03.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-03.ll @@ -23,7 +23,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @capture_call(ptr) declare void @nocapture_call(ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-04.ll b/llvm/test/Transforms/Coroutines/coro-alloca-04.ll index e528d81986f10..c19cd253a9179 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-04.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-04.ll @@ -32,7 +32,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -53,7 +53,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @print(ptr) declare noalias ptr @malloc(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-05.ll b/llvm/test/Transforms/Coroutines/coro-alloca-05.ll index 6529e8fda1be6..96769e51fb80f 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-05.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-05.ll @@ -23,7 +23,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -44,7 +44,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @print(i32) declare noalias ptr @malloc(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-06.ll b/llvm/test/Transforms/Coroutines/coro-alloca-06.ll index a3444c30121ec..89149ceba4c14 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-06.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-06.ll @@ -37,7 +37,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -63,7 +63,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.lifetime.start.p0(i64, ptr nocapture) declare void @llvm.lifetime.end.p0(i64, ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-07.ll b/llvm/test/Transforms/Coroutines/coro-alloca-07.ll index 57dde64be6759..c81bf333f2059 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-07.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-07.ll @@ -36,7 +36,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -49,7 +49,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.lifetime.start.p0(i64, ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-08.ll b/llvm/test/Transforms/Coroutines/coro-alloca-08.ll index b0aeadc81e9ff..5a14a0eb98869 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-08.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-08.ll @@ -32,7 +32,7 @@ await.ready: %StrayCoroSave = call token @llvm.coro.save(ptr null) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -59,7 +59,7 @@ await.ready: br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -75,6 +75,6 @@ declare token @llvm.coro.save(ptr) #3 declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-09.ll b/llvm/test/Transforms/Coroutines/coro-alloca-09.ll index 2e0a8def2d544..5c60c5be46206 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-09.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-09.ll @@ -37,7 +37,7 @@ await.ready: %StrayCoroSave = call token @llvm.coro.save(ptr null) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -52,6 +52,6 @@ declare token @llvm.coro.save(ptr) #3 declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-loop-carried-address.ll b/llvm/test/Transforms/Coroutines/coro-alloca-loop-carried-address.ll index ffdd0ab66359f..412327a49dcf2 100644 --- a/llvm/test/Transforms/Coroutines/coro-alloca-loop-carried-address.ll +++ b/llvm/test/Transforms/Coroutines/coro-alloca-loop-carried-address.ll @@ -68,7 +68,7 @@ loop: ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -80,6 +80,6 @@ declare i64 @llvm.coro.size.i64() declare ptr @llvm.coro.begin(token, ptr writeonly) declare token @llvm.coro.save(ptr) declare i8 @llvm.coro.suspend(token, i1) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.lifetime.start(i64, ptr nocapture) declare void @llvm.lifetime.end(i64, ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-infinite-loop-bug.ll b/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-infinite-loop-bug.ll index d4415d38fd8b2..83212a79d69b6 100644 --- a/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-infinite-loop-bug.ll +++ b/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-infinite-loop-bug.ll @@ -73,7 +73,7 @@ declare ptr @llvm.coro.prepare.async(ptr) declare token @llvm.coro.id.async(i32, i32, i32, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.end.async(ptr, i1, ...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare {ptr, ptr, ptr} @llvm.coro.suspend.async(i32, ptr, ptr, ...) declare ptr @context_alloc() declare void @llvm.coro.async.context.dealloc(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-start-bug.ll b/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-start-bug.ll index 0f125ad274ea6..6a6d839fae361 100644 --- a/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-start-bug.ll +++ b/llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-start-bug.ll @@ -97,7 +97,7 @@ declare ptr @llvm.coro.prepare.async(ptr) declare token @llvm.coro.id.async(i32, i32, i32, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.end.async(ptr, i1, ...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare {ptr, ptr, ptr} @llvm.coro.suspend.async(i32, ptr, ptr, ...) declare ptr @context_alloc() declare void @llvm.coro.async.context.dealloc(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-async-dyn-align.ll b/llvm/test/Transforms/Coroutines/coro-async-dyn-align.ll index e962dc7090445..040c9881c1ab3 100644 --- a/llvm/test/Transforms/Coroutines/coro-async-dyn-align.ll +++ b/llvm/test/Transforms/Coroutines/coro-async-dyn-align.ll @@ -28,7 +28,7 @@ declare ptr @llvm.coro.async.resume() declare token @llvm.coro.id.async(i32, i32, i32, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.end.async(ptr, i1, ...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare swiftcc void @asyncReturn(ptr) declare swiftcc void @asyncSuspend(ptr) declare {ptr} @llvm.coro.suspend.async(i32, ptr, ptr, ...) diff --git a/llvm/test/Transforms/Coroutines/coro-async.ll b/llvm/test/Transforms/Coroutines/coro-async.ll index 4a49217e4df3d..f796ce3dbb0d8 100644 --- a/llvm/test/Transforms/Coroutines/coro-async.ll +++ b/llvm/test/Transforms/Coroutines/coro-async.ll @@ -211,7 +211,7 @@ entry: %continuation_actor_arg = extractvalue {ptr, ptr, ptr} %res.2, 1 tail call swiftcc void @asyncReturn(ptr %async.ctxt, ptr %continuation_task_arg, ptr %continuation_actor_arg) - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -501,7 +501,7 @@ declare ptr @llvm.coro.prepare.async(ptr) declare token @llvm.coro.id.async(i32, i32, i32, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.end.async(ptr, i1, ...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare {ptr, ptr, ptr} @llvm.coro.suspend.async(i32, ptr, ptr, ...) declare ptr @llvm.coro.async.context.alloc(ptr, ptr) declare void @llvm.coro.async.context.dealloc(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-byval-param.ll b/llvm/test/Transforms/Coroutines/coro-byval-param.ll index 5f7c1939f9f47..47059182d8ed6 100644 --- a/llvm/test/Transforms/Coroutines/coro-byval-param.ll +++ b/llvm/test/Transforms/Coroutines/coro-byval-param.ll @@ -52,7 +52,7 @@ coro.free: ; preds = %cleanup33 br label %coro.ret coro.ret: ; preds = %coro.free, %cleanup33, %init.ready, %coro.init - %10 = call i1 @llvm.coro.end(ptr null, i1 false) #10 + %10 = call i1 @llvm.coro.end(ptr null, i1 false, token none) #10 ret ptr %call2 } @@ -102,7 +102,7 @@ declare i8 @llvm.coro.suspend(token, i1) #2 declare void @_ZN4task12promise_type13final_suspendEv(ptr nonnull dereferenceable(1)) local_unnamed_addr #7 align 2 ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 ; Function Attrs: nobuiltin nounwind declare void @_ZdlPv(ptr) local_unnamed_addr #8 diff --git a/llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll b/llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll index f6f4607b3e810..2f6d23da82692 100644 --- a/llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll +++ b/llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll @@ -37,7 +37,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl catch.dispatch.1: @@ -106,7 +106,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-catchswitch.ll b/llvm/test/Transforms/Coroutines/coro-catchswitch.ll index dca9a754c9f6c..3cf6dc86f2c6d 100644 --- a/llvm/test/Transforms/Coroutines/coro-catchswitch.ll +++ b/llvm/test/Transforms/Coroutines/coro-catchswitch.ll @@ -54,7 +54,7 @@ resume: ; preds = %await2.suspend br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret void cleanuppad: @@ -80,7 +80,7 @@ declare void @print(i32) declare noalias ptr @malloc(i32) declare void @free(ptr) -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 ; Function Attrs: nobuiltin nounwind diff --git a/llvm/test/Transforms/Coroutines/coro-debug-O2.ll b/llvm/test/Transforms/Coroutines/coro-debug-O2.ll index e857b0ddf2876..a668bd1a52196 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug-O2.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-O2.ll @@ -110,7 +110,7 @@ cleanup.cont: ; preds = %after.coro.free br label %coro.ret coro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend - %end = call i1 @llvm.coro.end(ptr null, i1 false) + %end = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreachable: ; preds = %after.coro.free @@ -126,7 +126,7 @@ declare token @llvm.coro.save(ptr) declare ptr @llvm.coro.begin(token, ptr writeonly) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr nocapture readonly) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @new(i64) declare void @delete(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll b/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll index dada825379137..7f5679e4d522f 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll @@ -205,7 +205,7 @@ cleanup.cont: ; preds = %after.coro.free br label %coro.ret coro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend - %end = call i1 @llvm.coro.end(ptr null, i1 false) + %end = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreachable: ; preds = %after.coro.free @@ -334,7 +334,7 @@ cleanup.cont: ; preds = %after.coro.free br label %coro.ret coro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend - %end = call i1 @llvm.coro.end(ptr null, i1 false) + %end = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreachable: ; preds = %after.coro.free @@ -350,7 +350,7 @@ declare token @llvm.coro.save(ptr) declare ptr @llvm.coro.begin(token, ptr writeonly) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr nocapture readonly) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @new(i64) declare void @delete(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-debug-dbg.values-not_used_in_frame.ll b/llvm/test/Transforms/Coroutines/coro-debug-dbg.values-not_used_in_frame.ll index ed76c67860ee1..1b9a1bd63a2e3 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug-dbg.values-not_used_in_frame.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-dbg.values-not_used_in_frame.ll @@ -123,7 +123,7 @@ cleanup.cont: ; preds = %after.coro.free br label %coro.ret coro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend - %end = call i1 @llvm.coro.end(ptr null, i1 false) + %end = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreachable: ; preds = %after.coro.free @@ -155,7 +155,7 @@ declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @new(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-debug-dbg.values.ll b/llvm/test/Transforms/Coroutines/coro-debug-dbg.values.ll index fa6c6e9b8d2cf..54cdde8ae4ac0 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug-dbg.values.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-dbg.values.ll @@ -154,7 +154,7 @@ cleanup.cont: ; preds = %after.coro.free br label %coro.ret coro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend - %end = call i1 @llvm.coro.end(ptr null, i1 false) + %end = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreachable: ; preds = %after.coro.free @@ -186,7 +186,7 @@ declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @new(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll b/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll index 7d9aa879fc5cb..37b4126ce3730 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll @@ -182,7 +182,7 @@ cleanup.cont: ; preds = %after.coro.free br label %coro.ret coro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend - %end = call i1 @llvm.coro.end(ptr null, i1 false) + %end = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreachable: ; preds = %after.coro.free @@ -197,7 +197,7 @@ declare token @llvm.coro.save(ptr) declare ptr @llvm.coro.begin(token, ptr writeonly) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr nocapture readonly) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @new(i64) declare void @delete(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll b/llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll index d6606d7cd6ac5..e7a271a96ead1 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll @@ -74,7 +74,7 @@ cleanup: ; preds = %resume, %coro.begin br label %suspend suspend: ; preds = %cleanup, %coro.begin - %2 = call i1 @llvm.coro.end(ptr %hdl, i1 false) + %2 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -104,7 +104,7 @@ declare i1 @llvm.coro.alloc(token) #4 declare ptr @llvm.coro.begin(token, ptr writeonly) #4 ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) #4 +declare i1 @llvm.coro.end(ptr, i1, token) #4 declare noalias ptr @malloc(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-debug.ll b/llvm/test/Transforms/Coroutines/coro-debug.ll index dec20ab7a0744..064693c80ad23 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug.ll @@ -70,7 +70,7 @@ coro_Cleanup: ; preds = %sw.epilog, %sw.bb1 br label %coro_Suspend, !dbg !24 coro_Suspend: ; preds = %coro_Cleanup, %sw.default - %7 = call i1 @llvm.coro.end(ptr null, i1 false) #7, !dbg !24 + %7 = call i1 @llvm.coro.end(ptr null, i1 false, token none) #7, !dbg !24 %8 = load ptr, ptr %coro_hdl, align 8, !dbg !24 store i32 0, ptr %late_local, !dbg !24 ret ptr %8, !dbg !24 @@ -111,7 +111,7 @@ declare void @free(ptr) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) #5 +declare i1 @llvm.coro.end(ptr, i1, token) #5 ; Function Attrs: alwaysinline define private void @coro.devirt.trigger(ptr) #6 { diff --git a/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-00.ll b/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-00.ll index e30b3fa55536c..2f5b989a620e0 100644 --- a/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-00.ll +++ b/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-00.ll @@ -65,7 +65,7 @@ cleanup: ; preds = %invoke.cont15, %if.el br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreach: @@ -92,6 +92,6 @@ declare void @use_val(i32) declare void @__cxa_end_catch() ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @free(ptr) declare ptr @llvm.coro.free(token, ptr nocapture readonly) diff --git a/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-01.ll b/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-01.ll index 3959229959f43..d896c6a18b233 100644 --- a/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-01.ll +++ b/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-01.ll @@ -59,7 +59,7 @@ cleanup: ; preds = %invoke.cont15, %if.el br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreach: @@ -86,6 +86,6 @@ declare void @use_val(i32) declare void @__cxa_end_catch() ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @free(ptr) declare ptr @llvm.coro.free(token, ptr nocapture readonly) diff --git a/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-02.ll b/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-02.ll index 95a73bec09dec..79aa58b85eda8 100644 --- a/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-02.ll @@ -59,7 +59,7 @@ cleanup: ; preds = %invoke.cont15, %if.el br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -83,6 +83,6 @@ declare void @use_val(i32) declare void @__cxa_end_catch() ; Function Attrs: nounwind -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @free(ptr) declare ptr @llvm.coro.free(token, ptr nocapture readonly) diff --git a/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll b/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll index 7d1a3f2e6ef80..7d5ddabf7ea8e 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll @@ -30,7 +30,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -65,7 +65,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-00.ll b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-00.ll index 0aee256d20e14..c9700c8a09961 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-00.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-00.ll @@ -50,7 +50,7 @@ cleanup: call void @free(ptr %mem) br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -66,7 +66,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-01.ll b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-01.ll index a1d1134fab35f..584caa356e9b8 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-01.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-01.ll @@ -53,7 +53,7 @@ cleanup: call ptr @llvm.coro.free(token %0, ptr %1) br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -68,6 +68,6 @@ declare token @llvm.coro.save(ptr) #3 declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll index 923a93ca1694b..f916ebb915982 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll @@ -55,7 +55,7 @@ cleanup: call ptr @llvm.coro.free(token %0, ptr %1) br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } ; CHECK: %a.Frame = type { ptr, ptr, %"struct.task::promise_type", %struct.big_structure, i1 } @@ -69,6 +69,6 @@ declare token @llvm.coro.save(ptr) #3 declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-03.ll b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-03.ll index 94032607d98d6..525df873a0f0c 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-03.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-03.ll @@ -50,7 +50,7 @@ cleanup: call void @free(ptr %mem) br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -66,7 +66,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-04.ll b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-04.ll index 65a38e6da0a4c..27e0c47cb9042 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-04.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-04.ll @@ -55,7 +55,7 @@ cleanup: call ptr @llvm.coro.free(token %0, ptr %1) br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } ; CHECK: %a.Frame = type { ptr, ptr, %"struct.task::promise_type", %struct.big_structure, i1, [26 x i8], %struct.big_structure.2 } @@ -69,6 +69,6 @@ declare token @llvm.coro.save(ptr) #3 declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-05.ll b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-05.ll index 2722c9ec45616..6d93eeaa3211e 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-05.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-05.ll @@ -55,7 +55,7 @@ cleanup: call ptr @llvm.coro.free(token %0, ptr %1) br label %coro.ret coro.ret: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } ; CHECK: %a.Frame = type { ptr, ptr, %"struct.task::promise_type", i1, [14 x i8], %struct.big_structure } @@ -69,6 +69,6 @@ declare token @llvm.coro.save(ptr) #3 declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-frame-unreachable.ll b/llvm/test/Transforms/Coroutines/coro-frame-unreachable.ll index 17d2250611b8e..b81f7d0ed7eac 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame-unreachable.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame-unreachable.ll @@ -24,7 +24,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl no.predecessors: @@ -43,7 +43,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i1) diff --git a/llvm/test/Transforms/Coroutines/coro-frame.ll b/llvm/test/Transforms/Coroutines/coro-frame.ll index e7fa887a05fa2..c20be8ce2ff68 100644 --- a/llvm/test/Transforms/Coroutines/coro-frame.ll +++ b/llvm/test/Transforms/Coroutines/coro-frame.ll @@ -26,7 +26,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl pad: %tok = cleanuppad within none [] @@ -58,7 +58,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-materialize.ll b/llvm/test/Transforms/Coroutines/coro-materialize.ll index 7385337ab5750..8de81c3b8cfd3 100644 --- a/llvm/test/Transforms/Coroutines/coro-materialize.ll +++ b/llvm/test/Transforms/Coroutines/coro-materialize.ll @@ -41,7 +41,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -73,7 +73,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -109,7 +109,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -145,7 +145,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -186,7 +186,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -200,7 +200,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-noalias-param.ll b/llvm/test/Transforms/Coroutines/coro-noalias-param.ll index 67e51b1005f80..943d2a67978fa 100644 --- a/llvm/test/Transforms/Coroutines/coro-noalias-param.ll +++ b/llvm/test/Transforms/Coroutines/coro-noalias-param.ll @@ -19,7 +19,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret void } @@ -33,7 +33,7 @@ declare i32 @llvm.coro.size.i32() declare i8 @llvm.coro.suspend(token, i1) declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-padding.ll b/llvm/test/Transforms/Coroutines/coro-padding.ll index faed9b4b3b549..452b83bad388a 100644 --- a/llvm/test/Transforms/Coroutines/coro-padding.ll +++ b/llvm/test/Transforms/Coroutines/coro-padding.ll @@ -26,7 +26,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -54,7 +54,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-param-copy.ll b/llvm/test/Transforms/Coroutines/coro-param-copy.ll index 6e80577b56b39..83fa06b1a8cf6 100644 --- a/llvm/test/Transforms/Coroutines/coro-param-copy.ll +++ b/llvm/test/Transforms/Coroutines/coro-param-copy.ll @@ -41,7 +41,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -83,7 +83,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.memset.p0.i32(ptr, i8, i32, i1) diff --git a/llvm/test/Transforms/Coroutines/coro-preserve-final.ll b/llvm/test/Transforms/Coroutines/coro-preserve-final.ll index 730868a9f1ccd..16eeb84e7915a 100644 --- a/llvm/test/Transforms/Coroutines/coro-preserve-final.ll +++ b/llvm/test/Transforms/Coroutines/coro-preserve-final.ll @@ -80,7 +80,7 @@ coro.free: ; preds = %cleanup62 br label %coro.ret coro.ret: ; preds = %coro.free, %cleanup62, %final.suspend, %await2.suspend, %await.suspend, %init.suspend - %20 = call i1 @llvm.coro.end(ptr null, i1 false) #13 + %20 = call i1 @llvm.coro.end(ptr null, i1 false, token none) #13 ret ptr %__promise } @@ -96,7 +96,7 @@ declare i8 @llvm.coro.suspend(token, i1) #3 declare dso_local ptr @_Z5Innerv() local_unnamed_addr #8 declare dso_local void @_ZdlPv(ptr noundef) local_unnamed_addr #9 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare dso_local void @_Z5_exiti(i32 noundef) local_unnamed_addr #10 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #11 diff --git a/llvm/test/Transforms/Coroutines/coro-readnone-02.ll b/llvm/test/Transforms/Coroutines/coro-readnone-02.ll index c96377fd1c6d8..4ed962816154b 100644 --- a/llvm/test/Transforms/Coroutines/coro-readnone-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-readnone-02.ll @@ -39,7 +39,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -75,7 +75,7 @@ declare i8 @llvm.coro.suspend(token, i1) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @free(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-readnone.ll b/llvm/test/Transforms/Coroutines/coro-readnone.ll index b7bcff45c4107..1fc91cefaf975 100644 --- a/llvm/test/Transforms/Coroutines/coro-readnone.ll +++ b/llvm/test/Transforms/Coroutines/coro-readnone.ll @@ -33,7 +33,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -83,7 +83,7 @@ declare i8 @llvm.coro.suspend(token, i1) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @free(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-alloca-opaque-ptr.ll b/llvm/test/Transforms/Coroutines/coro-retcon-alloca-opaque-ptr.ll index 879e368489a6a..112ffd215b1be 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-alloca-opaque-ptr.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-alloca-opaque-ptr.ll @@ -34,7 +34,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -69,7 +69,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -77,7 +77,7 @@ declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) declare void @llvm.coro.suspend.retcon.isVoid(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare token @llvm.coro.alloca.alloc.i32(i32, i32) declare ptr @llvm.coro.alloca.get(token) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-alloca.ll b/llvm/test/Transforms/Coroutines/coro-retcon-alloca.ll index ab3da8cde729a..fc009520fe4fa 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-alloca.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-alloca.ll @@ -33,7 +33,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -69,7 +69,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -102,7 +102,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -170,7 +170,7 @@ forward: br label %back end: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -217,7 +217,7 @@ non_alloca_block: br label %suspend cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -225,7 +225,7 @@ declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) declare void @llvm.coro.suspend.retcon.isVoid(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare token @llvm.coro.alloca.alloc.i32(i32, i32) declare ptr @llvm.coro.alloca.get(token) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-frame.ll b/llvm/test/Transforms/Coroutines/coro-retcon-frame.ll index 3418e07a9b0aa..a81cdf475ae31 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-frame.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-frame.ll @@ -32,7 +32,7 @@ resume: br label %end end: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } ; Make sure we don't lose writes to the frame. @@ -52,5 +52,5 @@ end: declare token @llvm.coro.id.retcon.once(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-once-private.ll b/llvm/test/Transforms/Coroutines/coro-retcon-once-private.ll index 3476db91dc85f..e7593cc8c6f81 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-once-private.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-once-private.ll @@ -30,14 +30,14 @@ neg.cont: br label %cleanup cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } declare token @llvm.coro.id.retcon.once(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare void @prototype(ptr, i1 zeroext) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-once-value.ll b/llvm/test/Transforms/Coroutines/coro-retcon-once-value.ll index c76a76c5fb85a..b67abfb051f35 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-once-value.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-once-value.ll @@ -1,21 +1,10 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs ; RUN: opt < %s -passes='default' -S | FileCheck %s target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.12.0" define {ptr, i32} @f(ptr %buffer, ptr %array) { -; CHECK-LABEL: @f( -; CHECK-NEXT: PostSpill: -; CHECK-NEXT: store ptr [[ARRAY:%.*]], ptr [[BUFFER:%.*]], align 8 -; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[ARRAY]], align 4 -; CHECK-NEXT: [[LOAD_POS:%.*]] = icmp sgt i32 [[LOAD]], 0 -; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[LOAD_POS]], ptr @f.resume.0, ptr @f.resume.1 -; CHECK-NEXT: [[SPEC_SELECT4:%.*]] = tail call i32 @llvm.smax.i32(i32 [[LOAD]], i32 0) -; CHECK-NEXT: [[TMP0:%.*]] = insertvalue { ptr, i32 } poison, ptr [[SPEC_SELECT]], 0 -; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, i32 } [[TMP0]], i32 [[SPEC_SELECT4]], 1 -; CHECK-NEXT: ret { ptr, i32 } [[TMP1]] -; entry: %id = call token @llvm.coro.id.retcon.once(i32 8, i32 8, ptr %buffer, ptr @prototype, ptr @allocate, ptr @deallocate) %hdl = call ptr @llvm.coro.begin(token %id, ptr null) @@ -40,23 +29,11 @@ neg.cont: br label %cleanup cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } -define void @test(ptr %array) { -; CHECK-LABEL: @test( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = alloca [8 x i8], align 8 -; CHECK-NEXT: store ptr [[ARRAY:%.*]], ptr [[TMP0]], align 8 -; CHECK-NEXT: [[LOAD_I:%.*]] = load i32, ptr [[ARRAY]], align 4 -; CHECK-NEXT: [[LOAD_POS_I:%.*]] = icmp sgt i32 [[LOAD_I]], 0 -; CHECK-NEXT: [[SPEC_SELECT_I:%.*]] = select i1 [[LOAD_POS_I]], ptr @f.resume.0, ptr @f.resume.1 -; CHECK-NEXT: [[SPEC_SELECT4_I:%.*]] = tail call i32 @llvm.smax.i32(i32 [[LOAD_I]], i32 0) -; CHECK-NEXT: tail call void @print(i32 [[SPEC_SELECT4_I]]) -; CHECK-NEXT: call void [[SPEC_SELECT_I]](ptr nonnull [[TMP0]], i1 zeroext false) -; CHECK-NEXT: ret void -; +define void @test.f(ptr %array) { entry: %0 = alloca [8 x i8], align 8 %prepare = call ptr @llvm.coro.prepare.retcon(ptr @f) @@ -68,19 +45,179 @@ entry: ret void } +define {ptr, i32} @g(ptr %buffer, ptr %array, i32 %val) { +entry: + %id = call token @llvm.coro.id.retcon.once(i32 8, i32 8, ptr %buffer, ptr @prototype2, ptr @allocate, ptr @deallocate) + %hdl = call ptr @llvm.coro.begin(token %id, ptr null) + %load = load i32, ptr %array + %load.pos = icmp sgt i32 %load, 0 + br i1 %load.pos, label %pos, label %neg + +pos: + %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1(i32 %load) + br i1 %unwind0, label %cleanup, label %pos.cont + +pos.cont: + store i32 0, ptr %array, align 4 + br label %cleanup + +neg: + %unwind1 = call i1 (...) @llvm.coro.suspend.retcon.i1(i32 0) + br i1 %unwind1, label %cleanup, label %neg.cont + +neg.cont: + store i32 10, ptr %array, align 4 + br label %cleanup + +cleanup: + %new.val = add i32 %val, 123 + %tok = call token (...) @llvm.coro.end.results(ptr null, i32 %new.val, ptr @deallocate) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token %tok) + unreachable +} + +define void @test.g(ptr %array) { +entry: + %0 = alloca [8 x i8], align 8 + %prepare = call ptr @llvm.coro.prepare.retcon(ptr @f) + %yield.result = call {ptr, i32} %prepare(ptr %0, ptr %array) + %value = extractvalue {ptr, i32} %yield.result, 1 + call void @print(i32 %value) + %cont = extractvalue {ptr, i32} %yield.result, 0 + %normal.result = call {ptr, i32, ptr} %cont(ptr %0, i1 zeroext 0) + %value2 = extractvalue {ptr, i32, ptr} %normal.result, 1 + call void @print(i32 %value2) + ret void +} + ; Unfortunately, we don't seem to fully optimize this right now due ; to some sort of phase-ordering thing. declare token @llvm.coro.id.retcon.once(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) +declare token @llvm.coro.end.results(...) declare ptr @llvm.coro.prepare.retcon(ptr) declare void @prototype(ptr, i1 zeroext) +declare {ptr, i32, ptr} @prototype2(ptr, i1 zeroext) declare noalias ptr @allocate(i32 %size) declare void @deallocate(ptr %ptr) declare void @print(i32) +; CHECK-LABEL: @f( +; CHECK-NEXT: PostSpill: +; CHECK-NEXT: store ptr [[ARRAY:%.*]], ptr [[BUFFER:%.*]], align 8 +; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[ARRAY]], align 4 +; CHECK-NEXT: [[LOAD_POS:%.*]] = icmp sgt i32 [[LOAD]], 0 +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[LOAD_POS]], ptr @f.resume.0, ptr @f.resume.1 +; CHECK-NEXT: [[SPEC_SELECT4:%.*]] = tail call i32 @llvm.smax.i32(i32 [[LOAD]], i32 0) +; CHECK-NEXT: [[TMP0:%.*]] = insertvalue { ptr, i32 } poison, ptr [[SPEC_SELECT]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, i32 } [[TMP0]], i32 [[SPEC_SELECT4]], 1 +; CHECK-NEXT: ret { ptr, i32 } [[TMP1]] +; +; +; CHECK-LABEL: @f.resume.0( +; CHECK-NEXT: entryresume.0: +; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[COROEND:%.*]], label [[CLEANUP_SINK_SPLIT:%.*]] +; CHECK: cleanup.sink.split: +; CHECK-NEXT: [[ARRAY_RELOAD:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: store i32 0, ptr [[ARRAY_RELOAD]], align 4 +; CHECK-NEXT: br label [[COROEND]] +; CHECK: CoroEnd: +; CHECK-NEXT: ret void +; +; +; CHECK-LABEL: @f.resume.1( +; CHECK-NEXT: entryresume.1: +; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[COROEND:%.*]], label [[CLEANUP_SINK_SPLIT:%.*]] +; CHECK: cleanup.sink.split: +; CHECK-NEXT: [[ARRAY_RELOAD:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: store i32 10, ptr [[ARRAY_RELOAD]], align 4 +; CHECK-NEXT: br label [[COROEND]] +; CHECK: CoroEnd: +; CHECK-NEXT: ret void +; +; +; CHECK-LABEL: @test.f( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = alloca [8 x i8], align 8 +; CHECK-NEXT: store ptr [[ARRAY:%.*]], ptr [[TMP0]], align 8 +; CHECK-NEXT: [[LOAD_I:%.*]] = load i32, ptr [[ARRAY]], align 4 +; CHECK-NEXT: [[LOAD_POS_I:%.*]] = icmp sgt i32 [[LOAD_I]], 0 +; CHECK-NEXT: [[SPEC_SELECT_I:%.*]] = select i1 [[LOAD_POS_I]], ptr @f.resume.0, ptr @f.resume.1 +; CHECK-NEXT: [[SPEC_SELECT4_I:%.*]] = tail call i32 @llvm.smax.i32(i32 [[LOAD_I]], i32 0) +; CHECK-NEXT: tail call void @print(i32 [[SPEC_SELECT4_I]]) +; CHECK-NEXT: call void [[SPEC_SELECT_I]](ptr nonnull [[TMP0]], i1 zeroext false) +; CHECK-NEXT: ret void +; +; +; CHECK-LABEL: @g( +; CHECK-NEXT: PostSpill: +; CHECK-NEXT: [[TMP0:%.*]] = tail call ptr @allocate(i32 16) +; CHECK-NEXT: store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 8 +; CHECK-NEXT: [[VAL_SPILL_ADDR:%.*]] = getelementptr inbounds [[G_FRAME:%.*]], ptr [[TMP0]], i64 0, i32 1 +; CHECK-NEXT: store i32 [[VAL:%.*]], ptr [[VAL_SPILL_ADDR]], align 4 +; CHECK-NEXT: store ptr [[ARRAY:%.*]], ptr [[TMP0]], align 8 +; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[ARRAY]], align 4 +; CHECK-NEXT: [[LOAD_POS:%.*]] = icmp sgt i32 [[LOAD]], 0 +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[LOAD_POS]], ptr @g.resume.0, ptr @g.resume.1 +; CHECK-NEXT: [[SPEC_SELECT4:%.*]] = tail call i32 @llvm.smax.i32(i32 [[LOAD]], i32 0) +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, i32 } poison, ptr [[SPEC_SELECT]], 0 +; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, i32 } [[TMP1]], i32 [[SPEC_SELECT4]], 1 +; CHECK-NEXT: ret { ptr, i32 } [[TMP2]] +; +; +; CHECK-LABEL: @g.resume.0( +; CHECK-NEXT: entryresume.0: +; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[COROEND:%.*]], label [[CLEANUP_SINK_SPLIT:%.*]] +; CHECK: cleanup.sink.split: +; CHECK-NEXT: [[ARRAY_RELOAD:%.*]] = load ptr, ptr [[TMP2]], align 8 +; CHECK-NEXT: store i32 0, ptr [[ARRAY_RELOAD]], align 4 +; CHECK-NEXT: br label [[COROEND]] +; CHECK: CoroEnd: +; CHECK-NEXT: [[VAL_RELOAD_ADDR:%.*]] = getelementptr inbounds [[G_FRAME:%.*]], ptr [[TMP2]], i64 0, i32 1 +; CHECK-NEXT: [[VAL_RELOAD:%.*]] = load i32, ptr [[VAL_RELOAD_ADDR]], align 4 +; CHECK-NEXT: [[NEW_VAL:%.*]] = add i32 [[VAL_RELOAD]], 123 +; CHECK-NEXT: tail call void @deallocate(ptr [[TMP2]]) +; CHECK-NEXT: [[TMP3:%.*]] = insertvalue { ptr, i32, ptr } { ptr null, i32 undef, ptr undef }, i32 [[NEW_VAL]], 1 +; CHECK-NEXT: [[TMP4:%.*]] = insertvalue { ptr, i32, ptr } [[TMP3]], ptr @deallocate, 2 +; CHECK-NEXT: ret { ptr, i32, ptr } [[TMP4]] +; +; +; CHECK-LABEL: @g.resume.1( +; CHECK-NEXT: entryresume.1: +; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[COROEND:%.*]], label [[CLEANUP_SINK_SPLIT:%.*]] +; CHECK: cleanup.sink.split: +; CHECK-NEXT: [[ARRAY_RELOAD:%.*]] = load ptr, ptr [[TMP2]], align 8 +; CHECK-NEXT: store i32 10, ptr [[ARRAY_RELOAD]], align 4 +; CHECK-NEXT: br label [[COROEND]] +; CHECK: CoroEnd: +; CHECK-NEXT: [[VAL_RELOAD_ADDR:%.*]] = getelementptr inbounds [[G_FRAME:%.*]], ptr [[TMP2]], i64 0, i32 1 +; CHECK-NEXT: [[VAL_RELOAD:%.*]] = load i32, ptr [[VAL_RELOAD_ADDR]], align 4 +; CHECK-NEXT: [[NEW_VAL:%.*]] = add i32 [[VAL_RELOAD]], 123 +; CHECK-NEXT: tail call void @deallocate(ptr [[TMP2]]) +; CHECK-NEXT: [[TMP3:%.*]] = insertvalue { ptr, i32, ptr } { ptr null, i32 undef, ptr undef }, i32 [[NEW_VAL]], 1 +; CHECK-NEXT: [[TMP4:%.*]] = insertvalue { ptr, i32, ptr } [[TMP3]], ptr @deallocate, 2 +; CHECK-NEXT: ret { ptr, i32, ptr } [[TMP4]] +; +; +; CHECK-LABEL: @test.g( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = alloca [8 x i8], align 8 +; CHECK-NEXT: store ptr [[ARRAY:%.*]], ptr [[TMP0]], align 8 +; CHECK-NEXT: [[LOAD_I:%.*]] = load i32, ptr [[ARRAY]], align 4 +; CHECK-NEXT: [[LOAD_POS_I:%.*]] = icmp sgt i32 [[LOAD_I]], 0 +; CHECK-NEXT: [[SPEC_SELECT_I:%.*]] = select i1 [[LOAD_POS_I]], ptr @f.resume.0, ptr @f.resume.1 +; CHECK-NEXT: [[SPEC_SELECT4_I:%.*]] = tail call i32 @llvm.smax.i32(i32 [[LOAD_I]], i32 0) +; CHECK-NEXT: tail call void @print(i32 [[SPEC_SELECT4_I]]) +; CHECK-NEXT: [[NORMAL_RESULT:%.*]] = call { ptr, i32, ptr } [[SPEC_SELECT_I]](ptr nonnull [[TMP0]], i1 zeroext false) +; CHECK-NEXT: [[VALUE2:%.*]] = extractvalue { ptr, i32, ptr } [[NORMAL_RESULT]], 1 +; CHECK-NEXT: call void @print(i32 [[VALUE2]]) +; CHECK-NEXT: ret void +; diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-once-value2.ll b/llvm/test/Transforms/Coroutines/coro-retcon-once-value2.ll index 17a0a1d0e6b9e..c33e60e98cd8b 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-once-value2.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-once-value2.ll @@ -19,18 +19,64 @@ cont: br label %cleanup cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } +define {ptr, ptr} @g(ptr %buffer, ptr %ptr, i8 %val) presplitcoroutine { +entry: + %temp = alloca i32, align 4 + %id = call token @llvm.coro.id.retcon.once(i32 8, i32 8, ptr %buffer, ptr @prototype2, ptr @allocate, ptr @deallocate) + %hdl = call ptr @llvm.coro.begin(token %id, ptr null) + %oldvalue = load i32, ptr %ptr + store i32 %oldvalue, ptr %temp + %unwind = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %temp) + br i1 %unwind, label %cleanup, label %cont + +cont: + %newvalue = load i32, ptr %temp + store i32 %newvalue, ptr %ptr + br label %cleanup + +cleanup: + %tok = call token (...) @llvm.coro.end.results(i8 %val) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token %tok) + unreachable +} + + +define {ptr, ptr} @h(ptr %buffer, ptr %ptr) presplitcoroutine { +entry: + %temp = alloca i32, align 4 + %id = call token @llvm.coro.id.retcon.once(i32 8, i32 8, ptr %buffer, ptr @prototype3, ptr @allocate, ptr @deallocate) + %hdl = call ptr @llvm.coro.begin(token %id, ptr null) + %oldvalue = load i32, ptr %ptr + store i32 %oldvalue, ptr %temp + %unwind = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %temp) + br i1 %unwind, label %cleanup, label %cont + +cont: + %newvalue = load i32, ptr %temp + store i32 %newvalue, ptr %ptr + br label %cleanup + +cleanup: + %tok = call token (...) @llvm.coro.end.results(ptr null, i32 123, ptr @deallocate) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token %tok) + unreachable +} + declare token @llvm.coro.id.retcon.once(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) +declare token @llvm.coro.end.results(...) declare void @prototype(ptr, i1 zeroext) +declare i8 @prototype2(ptr, i1 zeroext) +declare {ptr, i32, ptr} @prototype3(ptr, i1 zeroext) declare noalias ptr @allocate(i32 %size) declare fastcc void @deallocate(ptr %ptr) @@ -44,21 +90,79 @@ declare void @print(i32) ; CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[TMP0]], align 8 ; CHECK-NEXT: [[OLDVALUE:%.*]] = load i32, ptr [[PTR]], align 4 ; CHECK-NEXT: store i32 [[OLDVALUE]], ptr [[TEMP]], align 4 -; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, ptr } { ptr @f.resume.0, ptr poison }, ptr [[TEMP]], 1 -; CHECK-NEXT: ret { ptr, ptr } [[TMP2]] +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @f.resume.0, ptr poison }, ptr [[TEMP]], 1 +; CHECK-NEXT: ret { ptr, ptr } [[TMP1]] ; ; ; CHECK-LABEL: @f.resume.0( ; CHECK-NEXT: entryresume.0: -; CHECK-NEXT: [[FRAMEPTR:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 -; CHECK-NEXT: [[TEMP:%.*]] = getelementptr inbounds [[F_FRAME:%.*]], ptr [[FRAMEPTR]], i32 0, i32 1 +; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: [[TEMP:%.*]] = getelementptr inbounds [[F_FRAME:%.*]], ptr [[TMP2]], i32 0, i32 1 ; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[COROEND:%.*]], label [[CONT:%.*]] ; CHECK: cont: -; CHECK-NEXT: [[PTR_RELOAD:%.*]] = load ptr, ptr [[FRAMEPTR]], align 8 +; CHECK-NEXT: [[PTR_RELOAD:%.*]] = load ptr, ptr [[TMP2]], align 8 ; CHECK-NEXT: [[NEWVALUE:%.*]] = load i32, ptr [[TEMP]], align 4 ; CHECK-NEXT: store i32 [[NEWVALUE]], ptr [[PTR_RELOAD]], align 4 ; CHECK-NEXT: br label [[COROEND]] ; CHECK: CoroEnd: -; CHECK-NEXT: call fastcc void @deallocate(ptr [[FRAMEPTR]]) +; CHECK-NEXT: call fastcc void @deallocate(ptr [[TMP2]]) ; CHECK-NEXT: ret void ; +; +; CHECK-LABEL: @g( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call ptr @allocate(i32 16) +; CHECK-NEXT: store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 8 +; CHECK-NEXT: [[TEMP:%.*]] = getelementptr inbounds [[G_FRAME:%.*]], ptr [[TMP0]], i32 0, i32 1 +; CHECK-NEXT: [[VAL_SPILL_ADDR:%.*]] = getelementptr inbounds [[G_FRAME]], ptr [[TMP0]], i32 0, i32 2 +; CHECK-NEXT: store i8 [[VAL:%.*]], ptr [[VAL_SPILL_ADDR]], align 1 +; CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[TMP0]], align 8 +; CHECK-NEXT: [[OLDVALUE:%.*]] = load i32, ptr [[PTR]], align 4 +; CHECK-NEXT: store i32 [[OLDVALUE]], ptr [[TEMP]], align 4 +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @g.resume.0, ptr poison }, ptr [[TEMP]], 1 +; CHECK-NEXT: ret { ptr, ptr } [[TMP1]] +; +; +; CHECK-LABEL: @g.resume.0( +; CHECK-NEXT: entryresume.0: +; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: [[TEMP:%.*]] = getelementptr inbounds [[G_FRAME:%.*]], ptr [[TMP2]], i32 0, i32 1 +; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[CLEANUP:%.*]], label [[CONT:%.*]] +; CHECK: cont: +; CHECK-NEXT: [[PTR_RELOAD:%.*]] = load ptr, ptr [[TMP2]], align 8 +; CHECK-NEXT: [[NEWVALUE:%.*]] = load i32, ptr [[TEMP]], align 4 +; CHECK-NEXT: store i32 [[NEWVALUE]], ptr [[PTR_RELOAD]], align 4 +; CHECK-NEXT: br label [[CLEANUP]] +; CHECK: cleanup: +; CHECK-NEXT: [[VAL_RELOAD_ADDR:%.*]] = getelementptr inbounds [[G_FRAME]], ptr [[TMP2]], i32 0, i32 2 +; CHECK-NEXT: [[VAL_RELOAD:%.*]] = load i8, ptr [[VAL_RELOAD_ADDR]], align 1 +; CHECK-NEXT: call fastcc void @deallocate(ptr [[TMP2]]) +; CHECK-NEXT: ret i8 [[VAL_RELOAD]] +; +; +; CHECK-LABEL: @h( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call ptr @allocate(i32 16) +; CHECK-NEXT: store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 8 +; CHECK-NEXT: [[TEMP:%.*]] = getelementptr inbounds [[H_FRAME:%.*]], ptr [[TMP0]], i32 0, i32 1 +; CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[TMP0]], align 8 +; CHECK-NEXT: [[OLDVALUE:%.*]] = load i32, ptr [[PTR]], align 4 +; CHECK-NEXT: store i32 [[OLDVALUE]], ptr [[TEMP]], align 4 +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @h.resume.0, ptr poison }, ptr [[TEMP]], 1 +; CHECK-NEXT: ret { ptr, ptr } [[TMP1]] +; +; +; CHECK-LABEL: @h.resume.0( +; CHECK-NEXT: entryresume.0: +; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP0:%.*]], align 8 +; CHECK-NEXT: [[TEMP:%.*]] = getelementptr inbounds [[H_FRAME:%.*]], ptr [[TMP2]], i32 0, i32 1 +; CHECK-NEXT: br i1 [[TMP1:%.*]], label [[COROEND:%.*]], label [[CONT:%.*]] +; CHECK: cont: +; CHECK-NEXT: [[PTR_RELOAD:%.*]] = load ptr, ptr [[TMP2]], align 8 +; CHECK-NEXT: [[NEWVALUE:%.*]] = load i32, ptr [[TEMP]], align 4 +; CHECK-NEXT: store i32 [[NEWVALUE]], ptr [[PTR_RELOAD]], align 4 +; CHECK-NEXT: br label [[COROEND]] +; CHECK: CoroEnd: +; CHECK-NEXT: call fastcc void @deallocate(ptr [[TMP2]]) +; CHECK-NEXT: ret { ptr, i32, ptr } { ptr null, i32 123, ptr @deallocate } +; diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-opaque-ptr.ll b/llvm/test/Transforms/Coroutines/coro-retcon-opaque-ptr.ll index 559d3af024694..f456b6e7bc858 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-opaque-ptr.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-opaque-ptr.ll @@ -26,7 +26,7 @@ resume: ; preds = %loop br label %loop cleanup: ; preds = %loop - %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false) + %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) unreachable } @@ -70,14 +70,14 @@ resume: ; preds = %loop br label %loop cleanup: ; preds = %loop - %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false) + %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) unreachable } declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare ptr @prototype(ptr, i1 zeroext) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-remat.ll b/llvm/test/Transforms/Coroutines/coro-retcon-remat.ll index 70de163caff5d..fd16ba96181b9 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-remat.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-remat.ll @@ -31,14 +31,14 @@ resume1: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare { ptr, i32 } @f_prototype(ptr, i1 zeroext) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-resume-values.ll b/llvm/test/Transforms/Coroutines/coro-retcon-resume-values.ll index 09a17f8ab3b38..f4333a12bb34a 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-resume-values.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-resume-values.ll @@ -27,7 +27,7 @@ resume: cleanup: call void @print(i32 %n.val) - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -66,7 +66,7 @@ entry: declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare { i32, i1 } @llvm.coro.suspend.retcon.sl_i32i1s(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare ptr @prototype(ptr, i32, i1 zeroext) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-resume-values2.ll b/llvm/test/Transforms/Coroutines/coro-retcon-resume-values2.ll index 7c00464211034..2caa6430ca012 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-resume-values2.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-resume-values2.ll @@ -15,14 +15,14 @@ entry: %sum4 = call i32 @add(i32 %sum3, i32 %value1) %sum5 = call i32 @add(i32 %sum4, i32 %value2) call void @print(i32 %sum5) - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i32 @llvm.coro.suspend.retcon.i32(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare ptr @prototype(ptr, i32) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-unreachable.ll b/llvm/test/Transforms/Coroutines/coro-retcon-unreachable.ll index f598e0a3e0d7c..8ed03849fb63b 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-unreachable.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-unreachable.ll @@ -23,7 +23,7 @@ define hidden swiftcc { ptr, ptr } @no_suspends(ptr %buffer, i64 %arg) #1 { bb1: call void @print(i64 %arg) - call i1 @llvm.coro.end(ptr %begin, i1 false) + call i1 @llvm.coro.end(ptr %begin, i1 false, token none) unreachable } @@ -41,7 +41,7 @@ declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #6 declare i1 @llvm.coro.suspend.retcon.i1(...) #5 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #6 declare void @llvm.coro.alloca.free(token) #5 -declare i1 @llvm.coro.end(ptr, i1) #5 +declare i1 @llvm.coro.end(ptr, i1, token) #5 declare void @llvm.trap() diff --git a/llvm/test/Transforms/Coroutines/coro-retcon-value.ll b/llvm/test/Transforms/Coroutines/coro-retcon-value.ll index 0b0f5dfd56c95..6a150c6a79807 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon-value.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon-value.ll @@ -25,7 +25,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -64,7 +64,7 @@ entry: declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i8 @llvm.coro.suspend.retcon.i8(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare {ptr, i32} @prototype(ptr, i8 zeroext) diff --git a/llvm/test/Transforms/Coroutines/coro-retcon.ll b/llvm/test/Transforms/Coroutines/coro-retcon.ll index 774c609ed6c44..b12a646ef53f9 100644 --- a/llvm/test/Transforms/Coroutines/coro-retcon.ll +++ b/llvm/test/Transforms/Coroutines/coro-retcon.ll @@ -33,7 +33,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -103,7 +103,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -137,14 +137,14 @@ cleanup: call void @use_var_ptr(ptr %a) %al = load i32, ptr %a call void @use_var(i32 %al) - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare void @use_var(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-spill-after-phi.ll b/llvm/test/Transforms/Coroutines/coro-spill-after-phi.ll index a464c8ac2e221..cbe57a8d61132 100644 --- a/llvm/test/Transforms/Coroutines/coro-spill-after-phi.ll +++ b/llvm/test/Transforms/Coroutines/coro-spill-after-phi.ll @@ -50,7 +50,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -63,7 +63,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare i32 @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll b/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll index 9653bd5b28eea..f238955d1c3e9 100644 --- a/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll +++ b/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll @@ -33,7 +33,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -62,7 +62,7 @@ declare i8 @llvm.coro.suspend(token, i1) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print.i32(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-spill-defs-before-corobegin.ll b/llvm/test/Transforms/Coroutines/coro-spill-defs-before-corobegin.ll index 12b24df00c1de..801c4a1776135 100644 --- a/llvm/test/Transforms/Coroutines/coro-spill-defs-before-corobegin.ll +++ b/llvm/test/Transforms/Coroutines/coro-spill-defs-before-corobegin.ll @@ -36,7 +36,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl lpad: @@ -70,7 +70,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare i32 @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll b/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll index 411067362825e..3293e5c84b987 100644 --- a/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll @@ -29,7 +29,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -57,7 +57,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-spill-promise.ll b/llvm/test/Transforms/Coroutines/coro-spill-promise.ll index 8e15d41a1c35b..47e891a57d222 100644 --- a/llvm/test/Transforms/Coroutines/coro-spill-promise.ll +++ b/llvm/test/Transforms/Coroutines/coro-spill-promise.ll @@ -28,7 +28,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -48,7 +48,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare double @print(double) diff --git a/llvm/test/Transforms/Coroutines/coro-split-00.ll b/llvm/test/Transforms/Coroutines/coro-split-00.ll index c75aff50dab6c..b35bd720b86f9 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-00.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-00.ll @@ -28,7 +28,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -72,7 +72,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) allockind("alloc,uninitialized") "alloc-family"="malloc" declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-01.ll b/llvm/test/Transforms/Coroutines/coro-split-01.ll index 039f80db57acf..7a03495e75d8d 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-01.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-01.ll @@ -26,7 +26,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } define i32 @main() { @@ -49,7 +49,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-02.ll b/llvm/test/Transforms/Coroutines/coro-split-02.ll index ed09f009f9b83..31e8e8155035c 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-02.ll @@ -34,7 +34,7 @@ await.ready: call void @print(i32 %val) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -60,6 +60,6 @@ declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare void @"\01??3@YAXPEAX@Z"(ptr) local_unnamed_addr #10 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-split-alloc.ll b/llvm/test/Transforms/Coroutines/coro-split-alloc.ll index 8759c525b65ab..f6f50e2f3c76c 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-alloc.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-alloc.ll @@ -33,7 +33,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -57,7 +57,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @custom_alloctor(i32, i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-dbg.ll b/llvm/test/Transforms/Coroutines/coro-split-dbg.ll index 781571d4a2ce4..184d4a564ab72 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-dbg.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-dbg.ll @@ -38,7 +38,7 @@ coro_Cleanup: ; preds = %for.cond br label %coro_Suspend, !dbg !36 coro_Suspend: ; preds = %for.cond, %if.then, %coro_Cleanup - tail call i1 @llvm.coro.end(ptr null, i1 false) #9, !dbg !38 + tail call i1 @llvm.coro.end(ptr null, i1 false, token none) #9, !dbg !38 ret ptr %2, !dbg !39 } @@ -57,7 +57,7 @@ declare i8 @llvm.coro.suspend(token, i1) #7 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #5 declare void @free(ptr nocapture) local_unnamed_addr #6 -declare i1 @llvm.coro.end(ptr, i1) #7 +declare i1 @llvm.coro.end(ptr, i1, token) #7 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #5 declare void @llvm.dbg.value(metadata, metadata, metadata) #1 diff --git a/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll b/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll index d2bb1bbb98891..d7d60bb2bfa22 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll @@ -17,7 +17,7 @@ resume: invoke void @print(i32 1) to label %suspend unwind label %lpad suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) call void @print(i32 0) ; should not be present in f.resume ret ptr %hdl @@ -26,7 +26,7 @@ lpad: cleanup call void @print(i32 2) - %need.resume = call i1 @llvm.coro.end(ptr null, i1 true) + %need.resume = call i1 @llvm.coro.end(ptr null, i1 true, token none) br i1 %need.resume, label %eh.resume, label %cleanup.cont cleanup.cont: @@ -80,7 +80,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare ptr @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll b/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll index 835d399d55b54..b25c4b9f5a700 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll @@ -17,14 +17,14 @@ resume: invoke void @print(i32 1) to label %suspend unwind label %lpad suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) call void @print(i32 0) ; should not be present in f.resume ret ptr %hdl lpad: %tok = cleanuppad within none [] call void @print(i32 2) - %unused = call i1 @llvm.coro.end(ptr null, i1 true) [ "funclet"(token %tok) ] + %unused = call i1 @llvm.coro.end(ptr null, i1 true, token none) [ "funclet"(token %tok) ] cleanupret from %tok unwind label %cleanup.cont cleanup.cont: @@ -74,7 +74,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare ptr @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-final-suspend.ll b/llvm/test/Transforms/Coroutines/coro-split-final-suspend.ll index df99e8905b7b9..fbefd43f73c36 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-final-suspend.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-final-suspend.ll @@ -28,7 +28,7 @@ resume: invoke void @print(i32 1) to label %suspend unwind label %lpad suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) call void @print(i32 0) ret ptr %hdl @@ -37,7 +37,7 @@ lpad: cleanup call void @print(i32 2) - %need.resume = call i1 @llvm.coro.end(ptr null, i1 true) + %need.resume = call i1 @llvm.coro.end(ptr null, i1 true, token none) br i1 %need.resume, label %eh.resume, label %cleanup.cont cleanup.cont: @@ -97,7 +97,7 @@ resume: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) call void @print(i32 0) ret ptr %hdl } @@ -122,7 +122,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare ptr @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-hidden.ll b/llvm/test/Transforms/Coroutines/coro-split-hidden.ll index aebc0bb8d93ba..fa4f0ab13bebc 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-hidden.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-hidden.ll @@ -30,7 +30,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -74,7 +74,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) allockind("alloc,uninitialized") declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll index 41787c4a31ea9..e8596b78460a5 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll @@ -36,7 +36,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -58,7 +58,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail.ll index 718e272c1d46f..0406135687904 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail.ll @@ -28,7 +28,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -51,7 +51,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll index 3a1e8694b2773..cd1635b93d2cc 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll @@ -48,7 +48,7 @@ final.suspend: pre.exit: br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreach: unreachable @@ -83,7 +83,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare i8 @switch_result() diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail10.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail10.ll index c8f681cbcf6cd..9d73c8bbc57b8 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail10.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail10.ll @@ -30,7 +30,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -44,7 +44,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail11.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail11.ll index e892fa9fc21cc..9bc5b4f0c65d9 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail11.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail11.ll @@ -30,7 +30,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -44,7 +44,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail12.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail12.ll index 66f640c34f774..e7f4bcb9b0ff2 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail12.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail12.ll @@ -55,7 +55,7 @@ coro.free: br label %coro.end coro.end: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -72,7 +72,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @delete(ptr nonnull) #2 diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail13.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail13.ll index 29823cee57a08..2384f9382685b 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail13.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail13.ll @@ -38,7 +38,7 @@ lpad: %lpval = landingpad { ptr, i32 } cleanup - %need.resume = call i1 @llvm.coro.end(ptr null, i1 true) + %need.resume = call i1 @llvm.coro.end(ptr null, i1 true, token none) resume { ptr, i32 } %lpval coro.free: @@ -46,7 +46,7 @@ coro.free: br label %coro.end coro.end: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -63,7 +63,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @delete(ptr nonnull) #2 diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll index 8dc347b7c4ae9..38fc12815c033 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll @@ -36,7 +36,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -57,7 +57,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll index 30ab7a2e861ac..b777f000e33a6 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll @@ -44,7 +44,7 @@ final.suspend: pre.exit: br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void unreach: unreachable @@ -79,7 +79,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare i8 @switch_result() diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll index 93bb7ef49f290..1e0fcdb87a72d 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll @@ -38,7 +38,7 @@ coro.free: br label %coro.end coro.end: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -54,7 +54,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @delete(ptr nonnull) #2 diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll index b892b6b304099..d19606491335e 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll @@ -32,7 +32,7 @@ await.ready: call void @llvm.lifetime.end.p0(i64 1, ptr %alloc.var) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -49,7 +49,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @consume(ptr) diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll index 846d2b5ab6b2a..eea711861c488 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll @@ -35,7 +35,7 @@ await.ready: call void @llvm.lifetime.end.p0(i64 1, ptr %alloc.var) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -83,7 +83,7 @@ coro.free: br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -101,7 +101,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @delete(ptr nonnull) #2 diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll index 3280bfd603279..c32fe9b0ee304 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll @@ -35,7 +35,7 @@ await.ready: call void @llvm.lifetime.end.p0(i64 1, ptr %alloc.var) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -83,7 +83,7 @@ coro.free: br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -101,7 +101,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @delete(ptr nonnull) #2 diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail8.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail8.ll index 25da65e2c4400..31b18d746be5f 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail8.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail8.ll @@ -32,7 +32,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -46,7 +46,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @print() diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail9.ll b/llvm/test/Transforms/Coroutines/coro-split-musttail9.ll index 6b41cad6be35c..76376dbbbe3d8 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-musttail9.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-musttail9.ll @@ -32,7 +32,7 @@ await.ready: i8 1, label %exit ] exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -46,7 +46,7 @@ declare token @llvm.coro.save(ptr) #2 declare ptr @llvm.coro.frame() #3 declare i8 @llvm.coro.suspend(token, i1) #2 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #1 -declare i1 @llvm.coro.end(ptr, i1) #2 +declare i1 @llvm.coro.end(ptr, i1, token) #2 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #1 declare ptr @malloc(i64) declare void @print() diff --git a/llvm/test/Transforms/Coroutines/coro-split-no-lieftime.ll b/llvm/test/Transforms/Coroutines/coro-split-no-lieftime.ll index bdd3747ecad67..157807dc05363 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-no-lieftime.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-no-lieftime.ll @@ -37,7 +37,7 @@ cleanup: br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -52,7 +52,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.lifetime.start.p0(i64, ptr nocapture) declare void @llvm.lifetime.end.p0(i64, ptr nocapture) diff --git a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll index 442e1d24e85de..1d0cf94c1a979 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll @@ -37,7 +37,7 @@ await.ready: call void @print(i32 %val) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -76,7 +76,7 @@ await.ready: call void @print(i32 %val) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -91,6 +91,6 @@ declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare void @"\01??3@YAXPEAX@Z"(ptr) local_unnamed_addr #10 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll index 771468cd4ac02..38a2a33efe051 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll @@ -48,7 +48,7 @@ after.await: br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -68,6 +68,6 @@ declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare void @"\01??3@YAXPEAX@Z"(ptr) local_unnamed_addr #10 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll index 6b845f97368eb..de377a6a38b94 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll @@ -36,7 +36,7 @@ await.ready: call void @print(i32 %val) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } ; CHECK-LABEL: @a.gep.resume( @@ -59,6 +59,6 @@ declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare void @"\01??3@YAXPEAX@Z"(ptr) local_unnamed_addr #10 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll index ddb45108d6786..821045583092d 100644 --- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll +++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll @@ -35,7 +35,7 @@ await.ready: call void @print(i32 %val) br label %exit exit: - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 @llvm.coro.end(ptr null, i1 false, token none) ret void } @@ -61,6 +61,6 @@ declare ptr @llvm.coro.frame() #5 declare i8 @llvm.coro.suspend(token, i1) #3 declare void @"\01??3@YAXPEAX@Z"(ptr) local_unnamed_addr #10 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2 -declare i1 @llvm.coro.end(ptr, i1) #3 +declare i1 @llvm.coro.end(ptr, i1, token) #3 declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #4 declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #4 diff --git a/llvm/test/Transforms/Coroutines/coro-swifterror.ll b/llvm/test/Transforms/Coroutines/coro-swifterror.ll index 1fba4e4163102..f192dbac3197e 100644 --- a/llvm/test/Transforms/Coroutines/coro-swifterror.ll +++ b/llvm/test/Transforms/Coroutines/coro-swifterror.ll @@ -34,7 +34,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -76,7 +76,7 @@ resume: br label %loop cleanup: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) unreachable } @@ -86,7 +86,7 @@ declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) declare { i1, ptr } @llvm.coro.suspend.retcon.i1p0p0i8(...) declare i1 @llvm.coro.suspend.retcon.i1(...) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.prepare.retcon(ptr) declare ptr @f_prototype(ptr, i1 zeroext, ptr swifterror) diff --git a/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll b/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll index 14a5be073211c..e3f09ba29cbf7 100644 --- a/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll +++ b/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll @@ -9,7 +9,7 @@ declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) declare i64 @llvm.coro.size.i64() declare ptr @llvm.coro.begin(token, ptr writeonly) declare i8 @llvm.coro.suspend(token, i1) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.free(token, ptr nocapture readonly) declare token @llvm.coro.save(ptr) @@ -42,7 +42,7 @@ wakeup: ; preds = %entry br label %cleanup suspend: ; preds = %cleanup, %entry - %unused = call i1 @llvm.coro.end(ptr %coro.state, i1 false) + %unused = call i1 @llvm.coro.end(ptr %coro.state, i1 false, token none) ret void cleanup: ; preds = %wakeup, %entry diff --git a/llvm/test/Transforms/Coroutines/ex0.ll b/llvm/test/Transforms/Coroutines/ex0.ll index 4ef0910e5e72d..9809488c85b37 100644 --- a/llvm/test/Transforms/Coroutines/ex0.ll +++ b/llvm/test/Transforms/Coroutines/ex0.ll @@ -24,7 +24,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -52,7 +52,7 @@ declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/ex1.ll b/llvm/test/Transforms/Coroutines/ex1.ll index fd969c2c1f6a8..2db5ef6067cad 100644 --- a/llvm/test/Transforms/Coroutines/ex1.ll +++ b/llvm/test/Transforms/Coroutines/ex1.ll @@ -20,7 +20,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -48,7 +48,7 @@ declare i32 @llvm.coro.size.i32() declare ptr @llvm.coro.begin(token, ptr) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) diff --git a/llvm/test/Transforms/Coroutines/ex2.ll b/llvm/test/Transforms/Coroutines/ex2.ll index ade3bc7b98852..d9999d46b38cf 100644 --- a/llvm/test/Transforms/Coroutines/ex2.ll +++ b/llvm/test/Transforms/Coroutines/ex2.ll @@ -29,7 +29,7 @@ dyn.free: call void @CustomFree(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -63,7 +63,7 @@ declare i32 @llvm.coro.size.i32() declare ptr @llvm.coro.begin(token, ptr) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) diff --git a/llvm/test/Transforms/Coroutines/ex3.ll b/llvm/test/Transforms/Coroutines/ex3.ll index 60dfc33bf1359..e7fbc97d8f14f 100644 --- a/llvm/test/Transforms/Coroutines/ex3.ll +++ b/llvm/test/Transforms/Coroutines/ex3.ll @@ -32,7 +32,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -67,7 +67,7 @@ declare i32 @llvm.coro.size.i32() declare ptr @llvm.coro.begin(token, ptr) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) diff --git a/llvm/test/Transforms/Coroutines/ex4.ll b/llvm/test/Transforms/Coroutines/ex4.ll index d4dba1cf818dd..7c7a869e4a500 100644 --- a/llvm/test/Transforms/Coroutines/ex4.ll +++ b/llvm/test/Transforms/Coroutines/ex4.ll @@ -27,7 +27,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -63,7 +63,7 @@ declare i32 @llvm.coro.size.i32() declare ptr @llvm.coro.begin(token, ptr) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare void @llvm.coro.resume(ptr) declare void @llvm.coro.destroy(ptr) diff --git a/llvm/test/Transforms/Coroutines/ex5.ll b/llvm/test/Transforms/Coroutines/ex5.ll index e6daec528ce40..bf5cbec266c91 100644 --- a/llvm/test/Transforms/Coroutines/ex5.ll +++ b/llvm/test/Transforms/Coroutines/ex5.ll @@ -31,7 +31,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret ptr %hdl } @@ -46,7 +46,7 @@ declare ptr @llvm.coro.begin(token, ptr) declare token @llvm.coro.save(ptr) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) ; CHECK-LABEL: @main define i32 @main() { diff --git a/llvm/test/Transforms/Coroutines/no-suspend.ll b/llvm/test/Transforms/Coroutines/no-suspend.ll index dbbdd7feda187..53eb98f1273a9 100644 --- a/llvm/test/Transforms/Coroutines/no-suspend.ll +++ b/llvm/test/Transforms/Coroutines/no-suspend.ll @@ -32,7 +32,7 @@ dyn.free: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void } @@ -81,7 +81,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void } @@ -129,7 +129,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void lpad: %lpval = landingpad { ptr, i32 } @@ -190,7 +190,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void } @@ -244,7 +244,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void } @@ -291,7 +291,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void lpad: %lpval = landingpad { ptr, i32 } @@ -343,7 +343,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void } @@ -388,7 +388,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) ret void lpad: %lpval = landingpad { ptr, i32 } @@ -410,7 +410,7 @@ declare ptr @llvm.coro.begin(token, ptr) declare token @llvm.coro.save(ptr %hdl) declare i8 @llvm.coro.suspend(token, i1) declare ptr @llvm.coro.free(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.subfn.addr(ptr, i8) diff --git a/llvm/test/Transforms/Coroutines/phi-coro-end.ll b/llvm/test/Transforms/Coroutines/phi-coro-end.ll index 52cecce869e4d..aab76faed3f1a 100644 --- a/llvm/test/Transforms/Coroutines/phi-coro-end.ll +++ b/llvm/test/Transforms/Coroutines/phi-coro-end.ll @@ -17,7 +17,7 @@ cleanup: suspend: %r = phi i32 [%n, %entry], [1, %cleanup] - call i1 @llvm.coro.end(ptr %hdl, i1 false) + call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) call void @print(i32 %r) ret ptr %hdl } @@ -41,7 +41,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/Coroutines/remarks.ll b/llvm/test/Transforms/Coroutines/remarks.ll index be1a213f67a92..5eaddbfc3d107 100644 --- a/llvm/test/Transforms/Coroutines/remarks.ll +++ b/llvm/test/Transforms/Coroutines/remarks.ll @@ -33,7 +33,7 @@ cleanup: call void @free(ptr %mem) br label %suspend suspend: - call i1 @llvm.coro.end(ptr %hdl, i1 0) + call i1 @llvm.coro.end(ptr %hdl, i1 0, token none) ret ptr %hdl } @@ -60,7 +60,7 @@ declare void @llvm.coro.destroy(ptr) declare token @llvm.coro.id(i32, ptr, ptr, ptr) declare i1 @llvm.coro.alloc(token) declare ptr @llvm.coro.begin(token, ptr) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare noalias ptr @malloc(i32) declare void @print(i32) diff --git a/llvm/test/Transforms/FunctionAttrs/noreturn.ll b/llvm/test/Transforms/FunctionAttrs/noreturn.ll index ae26eba6fc40e..fa80f6c2eced4 100644 --- a/llvm/test/Transforms/FunctionAttrs/noreturn.ll +++ b/llvm/test/Transforms/FunctionAttrs/noreturn.ll @@ -81,9 +81,9 @@ define void @unreachable() { ; CHECK: @coro define void @coro() presplitcoroutine { call token @llvm.coro.id.retcon.once(i32 0, i32 0, ptr null, ptr @coro, ptr null, ptr null) - call i1 @llvm.coro.end(ptr null, i1 false) + call i1 (ptr, i1, ...) @llvm.coro.end(ptr null, i1 false) unreachable } declare token @llvm.coro.id.retcon.once(i32 %size, i32 %align, ptr %buffer, ptr %prototype, ptr %alloc, ptr %free) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, ...) diff --git a/llvm/test/Transforms/LICM/sink-with-coroutine.ll b/llvm/test/Transforms/LICM/sink-with-coroutine.ll index 0b3f2e1c630a1..2013df11d9c44 100644 --- a/llvm/test/Transforms/LICM/sink-with-coroutine.ll +++ b/llvm/test/Transforms/LICM/sink-with-coroutine.ll @@ -22,7 +22,7 @@ define i64 @licm(i64 %n) #0 { ; CHECK-NEXT: [[T6:%.*]] = icmp ult i64 [[T5]], [[N]] ; CHECK-NEXT: br i1 [[T6]], label [[LOOP]], label [[BB2]] ; CHECK: bb2: -; CHECK-NEXT: [[RES:%.*]] = call i1 @llvm.coro.end(ptr null, i1 false) +; CHECK-NEXT: [[RES:%.*]] = call i1 @llvm.coro.end(ptr null, i1 false, token none) ; CHECK-NEXT: ret i64 0 ; entry: @@ -46,7 +46,7 @@ await.ready: br i1 %t6, label %loop, label %bb2 bb2: - %res = call i1 @llvm.coro.end(ptr null, i1 false) + %res = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret i64 0 } @@ -82,7 +82,7 @@ define i64 @hoist_threadlocal() presplitcoroutine { ; CHECK: loop.end: ; CHECK-NEXT: br i1 [[CMP]], label [[EXIT]], label [[FOR_BODY]] ; CHECK: exit: -; CHECK-NEXT: [[RES:%.*]] = call i1 @llvm.coro.end(ptr null, i1 false) +; CHECK-NEXT: [[RES:%.*]] = call i1 @llvm.coro.end(ptr null, i1 false, token none) ; CHECK-NEXT: ret i64 0 ; entry: @@ -119,12 +119,12 @@ loop.end: br i1 %cmp, label %exit, label %for.body exit: - %res = call i1 @llvm.coro.end(ptr null, i1 false) + %res = call i1 @llvm.coro.end(ptr null, i1 false, token none) ret i64 0 } declare i8 @llvm.coro.suspend(token, i1) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare nonnull ptr @readonly_funcs() readonly declare nonnull ptr @llvm.threadlocal.address(ptr nonnull) nounwind readnone willreturn declare void @not.reachable() diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td index 1492a38e5e062..51017b5e050ff 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td @@ -503,8 +503,9 @@ def LLVM_CoroSuspendOp : LLVM_IntrOp<"coro.suspend", [], [], [], 1> { def LLVM_CoroEndOp : LLVM_IntrOp<"coro.end", [], [], [], 1> { let arguments = (ins LLVM_i8Ptr:$handle, - I1:$unwind); - let assemblyFormat = "$handle `,` $unwind attr-dict `:` functional-type(operands, results)"; + I1:$unwind, + LLVM_TokenType:$retvals); + let assemblyFormat = "$handle `,` $unwind `,` $retvals attr-dict `:` functional-type(operands, results)"; } def LLVM_CoroFreeOp : LLVM_IntrOp<"coro.free", [], [], [], 1> { diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td index 57dce72e102e7..72ceac8b6f6ba 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -1465,6 +1465,31 @@ def LLVM_NullOp let assemblyFormat = "attr-dict `:` qualified(type($res))"; } +def LLVM_NoneTokenOp + : LLVM_Op<"mlir.none", [Pure]> { + let summary = "Defines a value containing an empty token to LLVM type."; + let description = [{ + Unlike LLVM IR, MLIR does not have first-class token values. They must be + explicitly created as SSA values using `llvm.mlir.none`. This operation has + no operands or attributes, and returns a none token value of a wrapped LLVM IR + pointer type. + + Examples: + + ```mlir + %0 = llvm.mlir.none : !llvm.token + ``` + }]; + + string llvmBuilder = [{ + $res = llvm::ConstantTokenNone::get(builder.getContext()); + }]; + + let results = (outs LLVM_TokenType:$res); + let builders = [LLVM_OneResultOpBuilder]; + let assemblyFormat = "attr-dict `:` type($res)"; +} + def LLVM_UndefOp : LLVM_Op<"mlir.undef", [Pure]>, LLVM_Builder<"$res = llvm::UndefValue::get($_resultType);"> { let summary = "Creates an undefined value of LLVM dialect type."; diff --git a/mlir/lib/Conversion/AsyncToLLVM/AsyncToLLVM.cpp b/mlir/lib/Conversion/AsyncToLLVM/AsyncToLLVM.cpp index 234d06c08da6d..1c3fbe8057c5b 100644 --- a/mlir/lib/Conversion/AsyncToLLVM/AsyncToLLVM.cpp +++ b/mlir/lib/Conversion/AsyncToLLVM/AsyncToLLVM.cpp @@ -534,11 +534,12 @@ class CoroEndOpConversion : public OpConversionPattern { // We are not in the block that is part of the unwind sequence. auto constFalse = rewriter.create( op->getLoc(), rewriter.getI1Type(), rewriter.getBoolAttr(false)); + auto noneToken = rewriter.create(op->getLoc()); // Mark the end of a coroutine: @llvm.coro.end. auto coroHdl = adaptor.getHandle(); rewriter.create(op->getLoc(), rewriter.getI1Type(), - ValueRange({coroHdl, constFalse})); + ValueRange({coroHdl, constFalse, noneToken})); rewriter.eraseOp(op); return success(); diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index 35b2fcd3d3abe..e82f85c822a01 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -990,6 +990,11 @@ FailureOr ModuleImport::convertConstant(llvm::Constant *constant) { return builder.create(loc, type).getResult(); } + // Convert none token constants. + if (auto *noneToken = dyn_cast(constant)) { + return builder.create(loc).getResult(); + } + // Convert poison. if (auto *poisonVal = dyn_cast(constant)) { Type type = convertType(poisonVal->getType()); diff --git a/mlir/test/Target/LLVMIR/Import/intrinsic.ll b/mlir/test/Target/LLVMIR/Import/intrinsic.ll index 6067c73067e3f..56c3cfbb5c7c2 100644 --- a/mlir/test/Target/LLVMIR/Import/intrinsic.ll +++ b/mlir/test/Target/LLVMIR/Import/intrinsic.ll @@ -701,7 +701,7 @@ define void @coro_suspend(i32 %0, i1 %1, ptr %2) { ; CHECK-LABEL: llvm.func @coro_end define void @coro_end(ptr %0, i1 %1) { ; CHECK: llvm.intr.coro.end - call i1 @llvm.coro.end(ptr %0, i1 %1) + call i1 @llvm.coro.end(ptr %0, i1 %1, token none) ret void } @@ -1021,7 +1021,7 @@ declare i64 @llvm.coro.align.i64() declare i32 @llvm.coro.align.i32() declare token @llvm.coro.save(ptr) declare i8 @llvm.coro.suspend(token, i1) -declare i1 @llvm.coro.end(ptr, i1) +declare i1 @llvm.coro.end(ptr, i1, token) declare ptr @llvm.coro.free(token, ptr nocapture readonly) declare void @llvm.coro.resume(ptr) declare i32 @llvm.eh.typeid.for(ptr) diff --git a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir index 2c37e53e4e556..427c09976ef14 100644 --- a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir +++ b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir @@ -690,8 +690,9 @@ llvm.func @coro_suspend(%arg0: i32, %arg1 : i1, %arg2 : !llvm.ptr) { // CHECK-LABEL: @coro_end llvm.func @coro_end(%arg0: !llvm.ptr, %arg1 : i1) { + %none = llvm.mlir.none : !llvm.token // CHECK: call i1 @llvm.coro.end - %0 = llvm.intr.coro.end %arg0, %arg1 : (!llvm.ptr, i1) -> i1 + %0 = llvm.intr.coro.end %arg0, %arg1, %none : (!llvm.ptr, i1, !llvm.token) -> i1 llvm.return } @@ -1043,7 +1044,7 @@ llvm.func @ssa_copy(%arg: f32) -> f32 { // CHECK-DAG: declare i32 @llvm.coro.size.i32() // CHECK-DAG: declare token @llvm.coro.save(ptr) // CHECK-DAG: declare i8 @llvm.coro.suspend(token, i1) -// CHECK-DAG: declare i1 @llvm.coro.end(ptr, i1) +// CHECK-DAG: declare i1 @llvm.coro.end(ptr, i1, token) // CHECK-DAG: declare ptr @llvm.coro.free(token, ptr nocapture readonly) // CHECK-DAG: declare void @llvm.coro.resume(ptr) // CHECK-DAG: declare <8 x i32> @llvm.vp.add.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)