[clang] [llvm] [mlir] Revert "Reapply "[Coroutines] Add llvm.coro.is_in_ramp and drop return value of llvm.coro.end #153404"" (PR #159236)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 16 21:04:16 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Weibo He (NewSigma)
<details>
<summary>Changes</summary>
Reverts llvm/llvm-project#<!-- -->155339 because of CI fail
---
Patch is 155.29 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/159236.diff
150 Files Affected:
- (modified) clang/lib/CodeGen/CGCoroutine.cpp (+6-8)
- (modified) clang/test/CodeGenCoroutines/coro-builtins.c (+1-1)
- (modified) clang/test/CodeGenCoroutines/coro-eh-cleanup.cpp (+3-3)
- (modified) clang/test/CodeGenCoroutines/coro-lambda.cpp (+1-1)
- (modified) clang/test/CodeGenCoroutines/coro-params.cpp (+2-2)
- (modified) llvm/docs/Coroutines.rst (+17-42)
- (modified) llvm/include/llvm/IR/Intrinsics.td (+2-3)
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroInstr.h (-12)
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroShape.h (-2)
- (modified) llvm/lib/Transforms/Coroutines/CoroCleanup.cpp (+1-1)
- (modified) llvm/lib/Transforms/Coroutines/CoroCloner.h (-1)
- (modified) llvm/lib/Transforms/Coroutines/CoroSplit.cpp (+18-30)
- (modified) llvm/lib/Transforms/Coroutines/Coroutines.cpp (-4)
- (modified) llvm/test/Analysis/GlobalsModRef/nonescaping-noalias.ll (+2-2)
- (modified) llvm/test/Assembler/auto_upgrade_intrinsics.ll (+3-3)
- (modified) llvm/test/Instrumentation/AddressSanitizer/coro-byval-param.ll (+2-2)
- (modified) llvm/test/Instrumentation/HWAddressSanitizer/coro-byval-param.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ArgAddr.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-align16.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-align32.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-align64-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-align64.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-align8-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-align8.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-01.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-03.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-04.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-05.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-06.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-07.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-08.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-09.ll (+1-1)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-loop-carried-address.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-outside-frame.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-alloca-with-addrspace.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-infinite-loop-bug.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async-addr-lifetime-start-bug.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-async-coro-id-async-bug.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async-declaration.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async-dyn-align.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-async-end-bug.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async-no-cse-swift-async-context-addr.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async-nomerge.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-async-phi.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-async.ll (+12-12)
- (modified) llvm/test/Transforms/Coroutines/coro-await-suspend-handle-in-ramp.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-await-suspend-lower-invoke.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-await-suspend-lower.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-byval-param.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-catchswitch.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-debug-O2.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-debug-dbg.values-not_used_in_frame.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-debug-dbg.values.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-debug.ll (+4-4)
- (modified) llvm/test/Transforms/Coroutines/coro-early-twice.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-00.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-01.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-eh-aware-edge-split-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-00.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-01.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-03.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-04.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-reuse-alloca-05.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame-unreachable.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-frame.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-lifetime-end.ll (+4-4)
- (modified) llvm/test/Transforms/Coroutines/coro-materialize.ll (+6-6)
- (modified) llvm/test/Transforms/Coroutines/coro-noalias-param.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-only-destroy-when-complete.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-padding.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-param-copy.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-readnone-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-readnone.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-alloca-opaque-ptr.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-alloca.ll (+6-6)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-frame.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-once-private.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-once-value.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-once-value2.ll (+4-4)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-opaque-ptr.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-remat.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-resume-values.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-resume-values2.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-unreachable.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon-value.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-retcon.ll (+4-4)
- (modified) llvm/test/Transforms/Coroutines/coro-spill-after-phi.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-spill-defs-before-corobegin.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-spill-promise.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-spill-suspend.ll (+1-1)
- (modified) llvm/test/Transforms/Coroutines/coro-split-00.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-01.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-alloc.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-dbg-labels-inlined.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-dbg-labels.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-dbg.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-eh-00.ll (+4-5)
- (modified) llvm/test/Transforms/Coroutines/coro-split-eh-01.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-split-final-suspend.ll (+5-6)
- (modified) llvm/test/Transforms/Coroutines/coro-split-hidden.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail-chain-pgo-counter-promo.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail-ppc64le.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail1.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail10.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail12.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail13.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail2.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail3.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail4.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail5.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail6.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail7.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail8.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-musttail9.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-no-lifetime.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-noinline.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/coro-swifterror.ll (+3-3)
- (modified) llvm/test/Transforms/Coroutines/coro-zero-alloca.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ex0.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ex1.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ex2.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ex3.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ex4.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/ex5.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/no-suspend.ll (+9-9)
- (modified) llvm/test/Transforms/Coroutines/phi-coro-end.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/remarks.ll (+2-2)
- (modified) llvm/test/Transforms/Coroutines/swift-async-dbg.ll (+3-3)
- (modified) llvm/test/Transforms/FunctionAttrs/noreturn.ll (+2-2)
- (modified) llvm/test/Transforms/LICM/sink-with-coroutine.ll (+5-4)
- (modified) llvm/unittests/Transforms/Coroutines/ExtraRematTest.cpp (+4-4)
- (modified) mlir/test/Target/LLVMIR/Import/intrinsic.ll (+2-2)
- (modified) mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir (+3-3)
``````````diff
diff --git a/clang/lib/CodeGen/CGCoroutine.cpp b/clang/lib/CodeGen/CGCoroutine.cpp
index b76450152203d..827385f9c1a1f 100644
--- a/clang/lib/CodeGen/CGCoroutine.cpp
+++ b/clang/lib/CodeGen/CGCoroutine.cpp
@@ -575,19 +575,17 @@ 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);
- CGF.Builder.CreateCall(
- CoroEndFn,
- {NullPtr, CGF.Builder.getTrue(),
- llvm::ConstantTokenNone::get(CoroEndFn->getContext())},
- 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.
auto *ResumeBB = CGF.getEHResumeBlock(/*isCleanup=*/true);
auto *CleanupContBB = CGF.createBasicBlock("cleanup.cont");
- auto *CoroIsInRampFn = CGM.getIntrinsic(llvm::Intrinsic::coro_is_in_ramp);
- auto *CoroIsInRamp = CGF.Builder.CreateCall(CoroIsInRampFn);
- CGF.Builder.CreateCondBr(CoroIsInRamp, CleanupContBB, ResumeBB);
+ CGF.Builder.CreateCondBr(CoroEnd, ResumeBB, CleanupContBB);
CGF.EmitBlock(CleanupContBB);
}
}
diff --git a/clang/test/CodeGenCoroutines/coro-builtins.c b/clang/test/CodeGenCoroutines/coro-builtins.c
index 0c2553274f09f..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 void @llvm.coro.end(ptr %[[FRAME]], i1 false, token none)
+ // 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 6b61ccde5728b..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 void @llvm.coro.end(ptr null, i1 true, token none) [ "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,8 +76,8 @@ coro_t f() {
// CHECK-LPAD: to label %{{.+}} unwind label %[[UNWINDBB:.+]]
// CHECK-LPAD: [[UNWINDBB]]:
-// CHECK-LPAD: %[[InRamp:.+]] = call i1 @llvm.coro.is_in_ramp()
-// CHECK-LPAD: br i1 %[[InRamp]], label %{{.+}}, label %[[EHRESUME:.+]]
+// 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
// CHECK-LPAD-NEXT: %[[sel:.+]] = load i32, ptr %ehselector.slot, align 4
diff --git a/clang/test/CodeGenCoroutines/coro-lambda.cpp b/clang/test/CodeGenCoroutines/coro-lambda.cpp
index b24a190ab41fb..26c51070f9e2d 100644
--- a/clang/test/CodeGenCoroutines/coro-lambda.cpp
+++ b/clang/test/CodeGenCoroutines/coro-lambda.cpp
@@ -55,4 +55,4 @@ void f() {
// CHECK: alloca %"struct.Task::promise_type"
// CHECK: call token @llvm.coro.id(
// CHECK: call i8 @llvm.coro.suspend(
-// CHECK: call void @llvm.coro.end(
+// CHECK: call i1 @llvm.coro.end(
diff --git a/clang/test/CodeGenCoroutines/coro-params.cpp b/clang/test/CodeGenCoroutines/coro-params.cpp
index 79e77a21017fa..719726cca29c5 100644
--- a/clang/test/CodeGenCoroutines/coro-params.cpp
+++ b/clang/test/CodeGenCoroutines/coro-params.cpp
@@ -117,7 +117,7 @@ void f(int val, MoveOnly moParam, MoveAndCopy mcParam, TrivialABI trivialParam)
// CHECK-NEXT: call ptr @llvm.coro.free(
// The original trivial_abi parameter is destroyed when returning from the ramp.
- // CHECK: call void @llvm.coro.end
+ // CHECK: call i1 @llvm.coro.end
// CHECK: call void @_ZN10TrivialABID1Ev(ptr {{[^,]*}} %[[TrivialAlloca]])
}
@@ -242,6 +242,6 @@ void msabi(MSParm p) {
co_return;
// The local alloca is used for the destructor call at the end of the ramp.
- // MSABI: call void @llvm.coro.end
+ // MSABI: call i1 @llvm.coro.end
// MSABI: call void @"??1MSParm@@QEAA at XZ"(ptr{{.*}} %[[ParamAlloca]])
}
diff --git a/llvm/docs/Coroutines.rst b/llvm/docs/Coroutines.rst
index 13d2da42eaca7..dde73c9c3cc23 100644
--- a/llvm/docs/Coroutines.rst
+++ b/llvm/docs/Coroutines.rst
@@ -303,7 +303,7 @@ The LLVM IR for this coroutine looks like this:
call void @free(ptr %mem)
br label %suspend
suspend:
- call void @llvm.coro.end(ptr %hdl, i1 false, token none)
+ %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
ret ptr %hdl
}
@@ -637,7 +637,7 @@ store the current value produced by a coroutine.
call void @free(ptr %mem)
br label %suspend
suspend:
- call void @llvm.coro.end(ptr %hdl, i1 false, token none)
+ %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
ret ptr %hdl
}
@@ -806,7 +806,7 @@ The LLVM IR for a coroutine using a Coroutine with a custom ABI looks like:
call void @free(ptr %mem)
br label %suspend
suspend:
- call void @llvm.coro.end(ptr %hdl, i1 false, token none)
+ %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
ret ptr %hdl
}
@@ -1444,7 +1444,7 @@ A frontend should emit function attribute `presplitcoroutine` for the coroutine.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
::
- declare void @llvm.coro.end(ptr <handle>, i1 <unwind>, token <result.token>)
+ declare i1 @llvm.coro.end(ptr <handle>, i1 <unwind>, token <result.token>)
Overview:
"""""""""
@@ -1502,9 +1502,8 @@ For landingpad based exception model, it is expected that frontend uses the
.. code-block:: llvm
ehcleanup:
- call void @llvm.coro.end(ptr null, i1 true, token none)
- %InRamp = call i1 @llvm.coro.is_in_ramp()
- br i1 %InRamp, label %cleanup.cont, label %eh.resume
+ %InResumePart = call i1 @llvm.coro.end(ptr null, i1 true, token none)
+ br i1 %InResumePart, label %eh.resume, label %cleanup.cont
cleanup.cont:
; rest of the cleanup
@@ -1516,10 +1515,10 @@ For landingpad based exception model, it is expected that frontend uses the
%lpad.val29 = insertvalue { ptr, i32 } %lpad.val, i32 %sel, 1
resume { ptr, i32 } %lpad.val29
-The `CoroSpit` pass replaces `coro.is_in_ramp` with ``True`` in the ramp functions,
-thus allowing to proceed to the rest of the cleanup code that is only needed during
-initial invocation of the coroutine. Otherwise, it is replaced with ``False``,
-thus leading to immediate unwind to the caller.
+The `CoroSpit` pass replaces `coro.end` with ``True`` in the resume functions,
+thus leading to immediate unwind to the caller, whereas in start function it
+is replaced with ``False``, thus allowing to proceed to the rest of the cleanup
+code that is only needed during initial invocation of the coroutine.
For Windows Exception handling model, a frontend should attach a funclet bundle
referring to an enclosing cleanuppad as follows:
@@ -1528,7 +1527,7 @@ referring to an enclosing cleanuppad as follows:
ehcleanup:
%tok = cleanuppad within none []
- call void @llvm.coro.end(ptr null, i1 true, token none) [ "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
@@ -1593,7 +1592,7 @@ The number of arguments must match the return type of the continuation function:
cleanup:
%tok = call token (...) @llvm.coro.end.results(i8 %val)
- call void @llvm.coro.end(ptr %hdl, i1 0, token %tok)
+ call i1 @llvm.coro.end(ptr %hdl, i1 0, token %tok)
unreachable
...
@@ -1605,7 +1604,7 @@ The number of arguments must match the return type of the continuation function:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
::
- declare void @llvm.coro.end.async(ptr <handle>, i1 <unwind>, ...)
+ declare i1 @llvm.coro.end.async(ptr <handle>, i1 <unwind>, ...)
Overview:
"""""""""
@@ -1636,10 +1635,10 @@ the function call.
.. code-block:: llvm
- call void (ptr, i1, ...) @llvm.coro.end.async(
- ptr %hdl, i1 0,
- ptr @must_tail_call_return,
- ptr %ctxt, ptr %task, ptr %actor)
+ call i1 (ptr, i1, ...) @llvm.coro.end.async(
+ ptr %hdl, i1 0,
+ ptr @must_tail_call_return,
+ ptr %ctxt, ptr %task, ptr %actor)
unreachable
.. _coro.suspend:
@@ -2118,30 +2117,6 @@ Example:
%hdl.result = ... ; get address of returned coroutine handle
ret ptr %hdl.result
-'llvm.coro.is_in_ramp' Intrinsic
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-::
-
- declare i1 @llvm.coro.is_in_ramp()
-
-Overview:
-"""""""""
-
-The '``llvm.coro.is_in_ramp``' intrinsic returns a bool value that marks coroutine ramp
-function and resume/destroy function.
-
-Arguments:
-""""""""""
-
-None
-
-Semantics:
-""""""""""
-
-The `CoroSpit` pass replaces `coro.is_in_ramp` with ``True`` ramp functions.
-Otherwise, it is replaced with ``False``, allowing the frontend to separate
-ramp function and resume/destroy function.
-
Coroutine Transformation Passes
===============================
CoroEarly
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 45ae7f9ee3fef..fb9ea10ac9127 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1775,13 +1775,12 @@ def int_coro_free : Intrinsic<[llvm_ptr_ty], [llvm_token_ty, llvm_ptr_ty],
[IntrReadMem, IntrArgMemOnly,
ReadOnly<ArgIndex<1>>,
NoCapture<ArgIndex<1>>]>;
-def int_coro_end : Intrinsic<[], [llvm_ptr_ty, llvm_i1_ty, llvm_token_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_ptr_ty, llvm_i1_ty, llvm_vararg_ty], []>;
+ : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty, llvm_i1_ty, llvm_vararg_ty], []>;
def int_coro_frame : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
-def int_coro_is_in_ramp : Intrinsic<[llvm_i1_ty], [], [IntrNoMem], "llvm.coro.is_in_ramp">;
def int_coro_noop : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
def int_coro_size : Intrinsic<[llvm_anyint_ty], [], [IntrNoMem]>;
def int_coro_align : Intrinsic<[llvm_anyint_ty], [], [IntrNoMem]>;
diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroInstr.h b/llvm/include/llvm/Transforms/Coroutines/CoroInstr.h
index 38daf25cacd83..0688068167ae6 100644
--- a/llvm/include/llvm/Transforms/Coroutines/CoroInstr.h
+++ b/llvm/include/llvm/Transforms/Coroutines/CoroInstr.h
@@ -428,18 +428,6 @@ class CoroFrameInst : public IntrinsicInst {
}
};
-/// This represents the llvm.coro.is_in_ramp instruction.
-class CoroIsInRampInst : public IntrinsicInst {
-public:
- // Methods to support type inquiry through isa, cast, and dyn_cast:
- static bool classof(const IntrinsicInst *I) {
- return I->getIntrinsicID() == Intrinsic::coro_is_in_ramp;
- }
- static bool classof(const Value *V) {
- return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
- }
-};
-
/// This represents the llvm.coro.free instruction.
class CoroFreeInst : public IntrinsicInst {
enum { IdArg, FrameArg };
diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroShape.h b/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
index 11b004572957f..c54081de2d9da 100644
--- a/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
+++ b/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
@@ -53,7 +53,6 @@ enum class ABI {
struct Shape {
CoroBeginInst *CoroBegin = nullptr;
SmallVector<AnyCoroEndInst *, 4> CoroEnds;
- SmallVector<CoroIsInRampInst *, 2> CoroIsInRampInsts;
SmallVector<CoroSizeInst *, 2> CoroSizes;
SmallVector<CoroAlignInst *, 2> CoroAligns;
SmallVector<AnyCoroSuspendInst *, 4> CoroSuspends;
@@ -66,7 +65,6 @@ struct Shape {
void clear() {
CoroBegin = nullptr;
CoroEnds.clear();
- CoroIsInRampInsts.clear();
CoroSizes.clear();
CoroAligns.clear();
CoroSuspends.clear();
diff --git a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
index 81efca9dfd209..c00e9c7bbee06 100644
--- a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
@@ -75,8 +75,8 @@ bool Lowerer::lower(Function &F) {
case Intrinsic::coro_subfn_addr:
lowerSubFn(Builder, cast<CoroSubFnInst>(II));
break;
+ case Intrinsic::coro_end:
case Intrinsic::coro_suspend_retcon:
- case Intrinsic::coro_is_in_ramp:
if (IsPrivateAndUnprocessed) {
II->replaceAllUsesWith(PoisonValue::get(II->getType()));
} else
diff --git a/llvm/lib/Transforms/Coroutines/CoroCloner.h b/llvm/lib/Transforms/Coroutines/CoroCloner.h
index 26ec4f3ed6a8c..d1887980fb3bc 100644
--- a/llvm/lib/Transforms/Coroutines/CoroCloner.h
+++ b/llvm/lib/Transforms/Coroutines/CoroCloner.h
@@ -120,7 +120,6 @@ class BaseCloner {
void replaceRetconOrAsyncSuspendUses();
void replaceCoroSuspends();
void replaceCoroEnds();
- void replaceCoroIsInRamp();
void replaceSwiftErrorOps();
void salvageDebugInfo();
void handleFinalSuspend();
diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
index c2d7bcc346776..02c38d02cff64 100644
--- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -213,7 +213,7 @@ static bool replaceCoroEndAsync(AnyCoroEndInst *End) {
/// Replace a non-unwind call to llvm.coro.end.
static void replaceFallthroughCoroEnd(AnyCoroEndInst *End,
const coro::Shape &Shape, Value *FramePtr,
- bool InRamp, CallGraph *CG) {
+ bool InResume, CallGraph *CG) {
// Start inserting right before the coro.end.
IRBuilder<> Builder(End);
@@ -225,7 +225,7 @@ static void replaceFallthroughCoroEnd(AnyCoroEndInst *End,
"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 (InRamp)
+ if (!InResume)
return;
Builder.CreateRetVoid();
break;
@@ -345,7 +345,8 @@ static void markCoroutineAsDone(IRBuilder<> &Builder, const coro::Shape &Shape,
/// Replace an unwind call to llvm.coro.end.
static void replaceUnwindCoroEnd(AnyCoroEndInst *End, const coro::Shape &Shape,
- Value *FramePtr, bool InRamp, CallGraph *CG) {
+ Value *FramePtr, bool InResume,
+ CallGraph *CG) {
IRBuilder<> Builder(End);
switch (Shape.ABI) {
@@ -358,7 +359,7 @@ static void replaceUnwindCoroEnd(AnyCoroEndInst *End, const coro::Shape &Shape,
// FIXME: We should refactor this once there is other language
// which uses Switch-Resumed style other than C++.
markCoroutineAsDone(Builder, Shape, FramePtr);
- if (InRamp)
+ if (!InResume)
return;
break;
}
@@ -382,11 +383,15 @@ static void replaceUnwindCoroEnd(AnyCoroEndInst *End, const coro::Shape &Shape,
}
static void replaceCoroEnd(AnyCoroEndInst *End, const coro::Shape &Shape,
- Value *FramePtr, bool InRamp, CallGraph *CG) {
+ Value *FramePtr, bool InResume, CallGraph *CG) {
if (End->isUnwind())
- replaceUnwindCoroEnd(End, Shape, FramePtr, InRamp, CG);
+ replaceUnwindCoroEnd(End, Shape, FramePtr, InResume, CG);
else
- replaceFallthroughCoroEnd(End, Shape, FramePtr, InRamp, CG);
+ replaceFallthroughCoroEnd(End, Shape, FramePtr, InResume, CG);
+
+ auto &Context = End->getContext();
+ End->replaceAllUsesWith(InResume ? ConstantInt::getTrue(Context)
+ : ConstantInt::getFalse(Context));
End->eraseFromParent();
}
@@ -553,16 +558,7 @@ void coro::BaseCloner::replaceCoroEnds() {
// We use a null call graph because there's no call graph node for
// the cloned function yet. We'll just be rebuilding that later.
auto *NewCE = cast<AnyCoroEndInst>(VMap[CE]);
- replaceCoroEnd(NewCE, Shape, NewFramePtr, /*in ramp*/ false, nullptr);
- }
-}
-
-void coro::BaseCloner::replaceCoroIsInRamp() {
- auto &Ctx = OrigF.getContext();
- for (auto *II : Shape.CoroIsInRampInsts) {
- auto *NewII = cast<CoroIsInRampInst>(VMap[II]);
- NewII->replaceAllUsesWith(ConstantInt::getFalse(Ctx));
- NewII->eraseFromParent();
+ replaceCoroEnd(NewCE, Shape, NewFramePtr, /*in resume*/ true, nullptr);
}
}
@@ -1081,8 +1077,6 @@ void coro::BaseCloner::create() {
// Remove coro.end intrinsics.
replaceCoroEnds();
- replaceCoroIsInRamp();
-
// Salvage debug info that points into the coroutine frame.
salvageDebugInfo();
}
@@ -1962,19 +1956,14 @@ class PrettyStackTraceFunction : public PrettyStackTraceEntry {
static void removeCoroEndsFromRampFunction(const coro::Shape &Shape) {
if (Shape.ABI != coro::ABI::Switch) {
for (auto *End : Shape.CoroEnds) {
- replaceCoroEnd(End, Shape, Shape.FramePtr, /*in ramp*/ true, nullptr);
+ replaceCoroEnd(End, Shape, Shape.FramePtr, /*in resume*/ false, nullptr);
}
} else {
- for (llvm::AnyCoroEndInst *End : Shape.CoroEnds)
+ for (llvm::AnyCoroEndInst *End : Shape.CoroEnds) {
+ auto &Context = End->getContext();
+ End->replaceAllUsesWith(ConstantInt::getFalse(Context));
End->eraseFromParent();
- }
-}
-
-static void removeCoroIsInRampFromRampFunction(const coro::Shape &Shape) {
- for (auto *II : Shape.CoroIsInRampInsts) {
- auto &Ctx = II->getContext();
- II->replaceAllUsesWith(ConstantInt::getTrue(Ctx));
- II->eraseFromParent();
+ }
}
}
@@ -2039,7 +2028,6 @@ static void doSplitCoroutine(Function &F, SmallVectorImpl<Function *> &Clones,
coro::salvageDebugInfo(ArgToAllocaMap, *DVR, false /*UseEntryValue*/);
removeCoroEndsFromRampFunction(Shape);
- removeCoroIsInRampFromRampFunction(Shape);
if (shouldCreateNoAllocVariant)
SwitchCoroutineSplitter::createNoAllocVariant(F, Shape, Clones);
diff --git a/llvm/lib/Transforms/Coroutines/Coroutines.cpp b/llvm/lib/Transforms/Coroutines/Coroutines.cpp
index 47c2d0d462e00..28a89a8f87dbd 100644
--- a/llvm/lib/Transforms/Coroutines/Coroutines.cpp
+++ b/llvm/lib/Transforms/Coroutines/Coroutines.cpp
@@ -93,7 +93,6 @@ static Intrinsic::ID NonOverloadedCoroIntrinsics[] = {
Intrinsic::coro_save,
Intrinsic::coro_subfn_addr,
Intrinsic::coro_suspend,
- Intrinsic::coro_is_in_ramp,
};
bool coro::isSuspendBlock(BasicBlock *BB) {
@@ -276,9 +275,6 @@ void coro::Shape::analyze(Function &F,
}
}
break;
- case Intrinsic::coro_is_in_ramp:
- CoroIsInRampInsts.push_back(cast<CoroIsInRampInst>(II));
- break;
case Intrinsic::coro_promise:
assert(CoroPromise == nullptr &&
"CoroEarly must ensure coro.promise unique");
diff --git a/llvm/test/Analysis/GlobalsModRef/nonescaping-noalias.ll b/llvm/test/Analysis/GlobalsModRef/nonescaping-noalias.ll
index e2eb4f6e7b9e9..eed93cf0df8ef 100644
--- a/llvm/test/Analysis/GlobalsModRef/nonescaping-noalias.ll
+++ b/llvm/test/Analysis/GlobalsModR...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/159236
More information about the cfe-commits
mailing list