llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: Weibo He (NewSigma)

<details>
<summary>Changes</summary>

Update a test in inline/ML, which seem to be enabled only in specific 
environments.

Reapply #<!-- -->155339 

---

Patch is 156.17 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/159278.diff


151 Files Affected:

- (modified) clang/lib/CodeGen/CGCoroutine.cpp (+8-6) 
- (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 (+42-17) 
- (modified) llvm/include/llvm/IR/Intrinsics.td (+3-2) 
- (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 (+30-18) 
- (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 (+5-4) 
- (modified) llvm/test/Transforms/Coroutines/coro-split-eh-01.ll (+3-3) 
- (modified) llvm/test/Transforms/Coroutines/coro-split-final-suspend.ll (+6-5) 
- (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/Inline/ML/state-tracking-coro.ll (+2-2) 
- (modified) llvm/test/Transforms/LICM/sink-with-coroutine.ll (+4-5) 
- (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 827385f9c1a1f..b76450152203d 100644
--- a/clang/lib/CodeGen/CGCoroutine.cpp
+++ b/clang/lib/CodeGen/CGCoroutine.cpp
@@ -575,17 +575,19 @@ 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(),
-                              
llvm::ConstantTokenNone::get(CoroEndFn->getContext())},
-                             Bundles);
+    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");
-      CGF.Builder.CreateCondBr(CoroEnd, ResumeBB, CleanupContBB);
+      auto *CoroIsInRampFn = 
CGM.getIntrinsic(llvm::Intrinsic::coro_is_in_ramp);
+      auto *CoroIsInRamp = CGF.Builder.CreateCall(CoroIsInRampFn);
+      CGF.Builder.CreateCondBr(CoroIsInRamp, CleanupContBB, ResumeBB);
       CGF.EmitBlock(CleanupContBB);
     }
   }
diff --git a/clang/test/CodeGenCoroutines/coro-builtins.c 
b/clang/test/CodeGenCoroutines/coro-builtins.c
index 79f119b2b60ff..0c2553274f09f 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, token none)
+  // CHECK-NEXT: call void  @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 725cf8faa6b4c..6b61ccde5728b 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, token none) [ 
"funclet"(token %[[CLPAD]]) ]
+// CHECK-NEXT: call void @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:   %[[I1RESUME:.+]] = call i1 @llvm.coro.end(ptr null, i1 true, 
token none)
-// CHECK-LPAD:   br i1  %[[I1RESUME]], label %[[EHRESUME:.+]], label
+// CHECK-LPAD:   %[[InRamp:.+]] = call i1 @llvm.coro.is_in_ramp()
+// CHECK-LPAD:   br i1  %[[InRamp]], label %{{.+}}, label %[[EHRESUME:.+]]
 // 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 26c51070f9e2d..b24a190ab41fb 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 i1 @llvm.coro.end(
+//   CHECK: call void @llvm.coro.end(
diff --git a/clang/test/CodeGenCoroutines/coro-params.cpp 
b/clang/test/CodeGenCoroutines/coro-params.cpp
index 719726cca29c5..79e77a21017fa 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 i1 @llvm.coro.end
+  // CHECK: call void @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 i1 @llvm.coro.end
+  // MSABI: call void @llvm.coro.end
   // MSABI: call void @"??1MSParm@@QEAA@XZ"(ptr{{.*}} %[[ParamAlloca]])
 }
diff --git a/llvm/docs/Coroutines.rst b/llvm/docs/Coroutines.rst
index dde73c9c3cc23..13d2da42eaca7 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:
-    %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
+    call void @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:
-    %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
+    call void @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:
-    %unused = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
+    call void @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 i1 @llvm.coro.end(ptr <handle>, i1 <unwind>, token <result.token>)
+  declare void @llvm.coro.end(ptr <handle>, i1 <unwind>, token <result.token>)
 
 Overview:
 """""""""
@@ -1502,8 +1502,9 @@ 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, token none)
-      br i1 %InResumePart, label %eh.resume, label %cleanup.cont
+      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
 
     cleanup.cont:
       ; rest of the cleanup
@@ -1515,10 +1516,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.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.
+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.
 
 For Windows Exception handling model, a frontend should attach a funclet bundle
 referring to an enclosing cleanuppad as follows:
@@ -1527,7 +1528,7 @@ referring to an enclosing cleanuppad as follows:
 
     ehcleanup:
       %tok = cleanuppad within none []
-      %unused = call i1 @llvm.coro.end(ptr null, i1 true, token none) [ 
"funclet"(token %tok) ]
+      call void @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
@@ -1592,7 +1593,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 i1 @llvm.coro.end(ptr %hdl, i1 0, token %tok)
+    call void @llvm.coro.end(ptr %hdl, i1 0, token %tok)
     unreachable
 
   ...
@@ -1604,7 +1605,7 @@ The number of arguments must match the return type of the 
continuation function:
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 ::
 
-  declare i1 @llvm.coro.end.async(ptr <handle>, i1 <unwind>, ...)
+  declare void @llvm.coro.end.async(ptr <handle>, i1 <unwind>, ...)
 
 Overview:
 """""""""
@@ -1635,10 +1636,10 @@ the function call.
 
 .. code-block:: llvm
 
-  call i1 (ptr, i1, ...) @llvm.coro.end.async(
-                           ptr %hdl, i1 0,
-                           ptr @must_tail_call_return,
-                           ptr %ctxt, ptr %task, ptr %actor)
+  call void (ptr, i1, ...) @llvm.coro.end.async(
+                             ptr %hdl, i1 0,
+                             ptr @must_tail_call_return,
+                             ptr %ctxt, ptr %task, ptr %actor)
   unreachable
 
 .. _coro.suspend:
@@ -2117,6 +2118,30 @@ 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 fb9ea10ac9127..45ae7f9ee3fef 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1775,12 +1775,13 @@ 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_i1_ty], [llvm_ptr_ty, llvm_i1_ty, 
llvm_token_ty], []>;
+def int_coro_end : Intrinsic<[], [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], []>;
+    : Intrinsic<[], [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 0688068167ae6..38daf25cacd83 100644
--- a/llvm/include/llvm/Transforms/Coroutines/CoroInstr.h
+++ b/llvm/include/llvm/Transforms/Coroutines/CoroInstr.h
@@ -428,6 +428,18 @@ 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 c54081de2d9da..11b004572957f 100644
--- a/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
+++ b/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
@@ -53,6 +53,7 @@ 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;
@@ -65,6 +66,7 @@ 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 c00e9c7bbee06..81efca9dfd209 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 d1887980fb3bc..26ec4f3ed6a8c 100644
--- a/llvm/lib/Transforms/Coroutines/CoroCloner.h
+++ b/llvm/lib/Transforms/Coroutines/CoroCloner.h
@@ -120,6 +120,7 @@ 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 02c38d02cff64..c2d7bcc346776 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 InResume, CallGraph *CG) {
+                                      bool InRamp, 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 (!InResume)
+    if (InRamp)
       return;
     Builder.CreateRetVoid();
     break;
@@ -345,8 +345,7 @@ 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 InResume,
-                                 CallGraph *CG) {
+                                 Value *FramePtr, bool InRamp, CallGraph *CG) {
   IRBuilder<> Builder(End);
 
   switch (Shape.ABI) {
@@ -359,7 +358,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 (!InResume)
+    if (InRamp)
       return;
     break;
   }
@@ -383,15 +382,11 @@ static void replaceUnwindCoroEnd(AnyCoroEndInst *End, 
const coro::Shape &Shape,
 }
 
 static void replaceCoroEnd(AnyCoroEndInst *End, const coro::Shape &Shape,
-                           Value *FramePtr, bool InResume, CallGraph *CG) {
+                           Value *FramePtr, bool InRamp, CallGraph *CG) {
   if (End->isUnwind())
-    replaceUnwindCoroEnd(End, Shape, FramePtr, InResume, CG);
+    replaceUnwindCoroEnd(End, Shape, FramePtr, InRamp, CG);
   else
-    replaceFallthroughCoroEnd(End, Shape, FramePtr, InResume, CG);
-
-  auto &Context = End->getContext();
-  End->replaceAllUsesWith(InResume ? ConstantInt::getTrue(Context)
-                                   : ConstantInt::getFalse(Context));
+    replaceFallthroughCoroEnd(End, Shape, FramePtr, InRamp, CG);
   End->eraseFromParent();
 }
 
@@ -558,7 +553,16 @@ 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 resume*/ true, nullptr);
+    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();
   }
 }
 
@@ -1077,6 +1081,8 @@ void coro::BaseCloner::create() {
   // Remove coro.end intrinsics.
   replaceCoroEnds();
 
+  replaceCoroIsInRamp();
+
   // Salvage debug info that points into the coroutine frame.
   salvageDebugInfo();
 }
@@ -1956,14 +1962,19 @@ 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 resume*/ false, nullptr);
+      replaceCoroEnd(End, Shape, Shape.FramePtr, /*in ramp*/ true, nullptr);
     }
   } else {
-    for (llvm::AnyCoroEndInst *End : Shape.CoroEnds) {
-      auto &Context = End->getContext();
-      End->replaceAllUsesWith(ConstantInt::getFalse(Context));
+    for (llvm::AnyCoroEndInst *End : Shape.CoroEnds)
       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();
   }
 }
 
@@ -2028,6 +2039,7 @@ 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 ac93f748ce65c..223f88352da8d 100644
--- a/llvm/lib/Transforms/Coroutines/Coroutines.cpp
+++ b/llvm/lib/Transforms/Coroutines/Coroutines.cpp
@@ -93,6 +93,7 @@ static Intrinsic::ID NonOverloadedCoroIntrinsics[] = {
     Intrinsic::coro_save,
     Intrinsic::coro_subfn_addr,
     Intrinsic::coro_suspend,
+    Intrinsic::coro_is_in_ramp,
 };
 
 bool coro::isSuspendBlock(BasicBlock *BB) {
@@ -275,6 +276,9 @@ 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 eed93cf0df8ef..e2eb4f6e7b9e9 100644
--- a/llvm/test/Analysis/GlobalsModRef/nonescaping-noalias.ll
+++ b/llvm/test/Analysis/GlobalsModR...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/159278
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to