https://github.com/vogelsgesang updated 
https://github.com/llvm/llvm-project/pull/198943

>From 83d94490272eaf8944b31464c6b9575a73e71b3c Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <[email protected]>
Date: Wed, 20 May 2026 22:28:49 +0000
Subject: [PATCH 1/2] [coro][coro] Use C calling convention for C++20
 coroutines

Change the calling convention for resume / destroy functions of C++
coroutines from `fastcc` to the C calling convention.

The resume / destroy functions are exposed as part of the coroutine ABI
and must be compatible with other compilers and other versions of LLVM.
fastcc is an LLVM-internal, unstable calling convention, though.

In practice, fastcc and the C calling convention are in sync for
`void func(void*)` function signatures on almost all platforms.
Therefore, I think we can still do this change without widespread
ABI breakage.

However, `fastcc` and `ccc` differ for:
* i686 (x86-32): fastcc passes the pointer in %ecx
  (CC_X86_32_FastCC), ccc passes it on the stack. Hard ABI break
  against the platform C ABI.
* MIPS O32, PowerPC64 ELFv1, Lanai: fastcc and ccc disagree on the
  parameter save / home area.

Afaik, those are all legacy ABIs and a recent feature like C++20
coroutines is unlikely to be used by projects still targeting legacy
ABIS.

Historical context: I tried to figure out why `fastcc` was used. It is
around since the original commit f93082e71a94 from 2016, predating C++20
symmetric transfer and the cross-vendor coroutine ABI work. I could not
find any discussion of whether this should use `fastcc` on the review or
on the mailing list.

As a side-effect, this also fixes #91123.

Co-authored-by: Cursor <[email protected]>
---
 clang/test/CodeGenCoroutines/coro-gro4.cpp       |  4 ++--
 .../coro-symmetric-transfer-03.cpp               |  2 +-
 .../coro-symmetric-transfer-04.cpp               |  2 +-
 clang/test/CodeGenCoroutines/pr65018.cpp         |  2 +-
 llvm/docs/Coroutines.rst                         |  6 +++---
 .../llvm/Transforms/Coroutines/CoroShape.h       |  5 ++++-
 llvm/lib/Transforms/Coroutines/CoroCleanup.cpp   |  1 -
 llvm/lib/Transforms/Coroutines/CoroEarly.cpp     |  1 -
 llvm/lib/Transforms/Coroutines/CoroSplit.cpp     |  1 -
 .../Coroutines/coro-alloc-with-param-O0.ll       |  6 +++---
 .../Coroutines/coro-alloc-with-param-O2.ll       |  6 +++---
 .../test/Transforms/Coroutines/coro-alloca-07.ll |  6 +++---
 .../coro-await-suspend-handle-in-ramp.ll         | 16 +++++++++-------
 .../coro-await-suspend-lower-invoke.ll           |  8 ++++----
 .../Coroutines/coro-await-suspend-lower.ll       |  8 ++++----
 llvm/test/Transforms/Coroutines/coro-debug-O2.ll |  2 +-
 .../Coroutines/coro-debug-coro-frame.ll          |  2 +-
 .../coro-debug-dbg.values-not_used_in_frame.ll   |  2 +-
 .../Coroutines/coro-debug-frame-variable.ll      |  2 +-
 .../Coroutines/coro-debug-spill-dbg.declare.ll   |  6 +++---
 llvm/test/Transforms/Coroutines/coro-debug.ll    |  6 +++---
 .../Coroutines/coro-eh-aware-edge-split-00.ll    |  2 +-
 .../Coroutines/coro-eh-aware-edge-split-01.ll    |  6 +++---
 .../Coroutines/coro-eh-aware-edge-split-02.ll    |  6 +++---
 .../Coroutines/coro-frame-arrayalloca.ll         |  6 +++---
 llvm/test/Transforms/Coroutines/coro-frame.ll    |  6 +++---
 .../Transforms/Coroutines/coro-noop-pacbti.ll    |  2 +-
 llvm/test/Transforms/Coroutines/coro-noop.ll     |  2 +-
 llvm/test/Transforms/Coroutines/coro-padding.ll  |  6 +++---
 .../Transforms/Coroutines/coro-resume-destroy.ll |  6 +++---
 .../Coroutines/coro-spill-corobegin.ll           |  6 +++---
 .../Coroutines/coro-spill-promise-02.ll          |  6 +++---
 .../Transforms/Coroutines/coro-spill-promise.ll  |  6 +++---
 .../Transforms/Coroutines/coro-spill-suspend.ll  |  6 +++---
 .../Coroutines/coro-split-dbg-labels-inlined.ll  |  4 ++--
 .../Coroutines/coro-split-dbg-labels.ll          |  2 +-
 .../Transforms/Coroutines/coro-split-eh-00.ll    |  2 +-
 .../Transforms/Coroutines/coro-split-eh-01.ll    |  2 +-
 ...oro-split-musttail-chain-pgo-counter-promo.ll | 10 +++++-----
 .../Transforms/Coroutines/coro-split-musttail.ll |  6 +++---
 .../Coroutines/coro-split-musttail1.ll           | 10 +++++-----
 .../Coroutines/coro-split-musttail2.ll           |  6 +++---
 .../Coroutines/coro-split-musttail3.ll           | 10 +++++-----
 .../Coroutines/coro-split-musttail4.ll           |  2 +-
 .../Coroutines/coro-split-musttail5.ll           |  2 +-
 .../Coroutines/coro-split-musttail6.ll           |  4 ++--
 .../Coroutines/coro-split-musttail7.ll           |  4 ++--
 .../Coroutines/coro-split-sink-lifetime-01.ll    | 12 ++++++------
 .../Coroutines/coro-split-sink-lifetime-02.ll    |  6 +++---
 .../Coroutines/coro-split-sink-lifetime-03.ll    |  6 +++---
 .../Coroutines/coro-split-sink-lifetime-04.ll    |  6 +++---
 .../Transforms/Coroutines/coro-split-tbaa-md.ll  |  6 +++---
 .../Transforms/Coroutines/coro-zero-alloca.ll    |  6 +++---
 53 files changed, 134 insertions(+), 132 deletions(-)

diff --git a/clang/test/CodeGenCoroutines/coro-gro4.cpp 
b/clang/test/CodeGenCoroutines/coro-gro4.cpp
index 4ee15bb688981..042adadb10958 100644
--- a/clang/test/CodeGenCoroutines/coro-gro4.cpp
+++ b/clang/test/CodeGenCoroutines/coro-gro4.cpp
@@ -44,8 +44,8 @@ wrapper fn() { co_return; }
 // CHECK: call void @gro_destroy()
 // CHECK: ret void
 
-// CHECK: define internal fastcc void @_Z2fnv.resume
+// CHECK: define internal void @_Z2fnv.resume
 // CHECK-NOT: call void @gro_destroy()
 
-// CHECK: define internal fastcc void @_Z2fnv.destroy
+// CHECK: define internal void @_Z2fnv.destroy
 // CHECK-NOT: call void @gro_destroy()
diff --git a/clang/test/CodeGenCoroutines/coro-symmetric-transfer-03.cpp 
b/clang/test/CodeGenCoroutines/coro-symmetric-transfer-03.cpp
index 33384b2f4839e..d4c8bd342d259 100644
--- a/clang/test/CodeGenCoroutines/coro-symmetric-transfer-03.cpp
+++ b/clang/test/CodeGenCoroutines/coro-symmetric-transfer-03.cpp
@@ -64,5 +64,5 @@ Task task0() {
 // CHECK-LABEL: define{{.*}} void @_Z5task0v.resume
 // This checks we are still in the scope of the current function.
 // CHECK-NOT: {{^}}}
-// CHECK: musttail call fastcc void
+// CHECK: musttail call void
 // CHECK-NEXT: ret void
diff --git a/clang/test/CodeGenCoroutines/coro-symmetric-transfer-04.cpp 
b/clang/test/CodeGenCoroutines/coro-symmetric-transfer-04.cpp
index cf9170d7e7110..7e233c0ae9e76 100644
--- a/clang/test/CodeGenCoroutines/coro-symmetric-transfer-04.cpp
+++ b/clang/test/CodeGenCoroutines/coro-symmetric-transfer-04.cpp
@@ -62,5 +62,5 @@ Task task0() {
 // CHECK-LABEL: define{{.*}} void @_Z5task0v.resume
 // This checks we are still in the scope of the current function.
 // CHECK-NOT: {{^}}}
-// CHECK: musttail call fastcc void
+// CHECK: musttail call void
 // CHECK-NEXT: ret void
diff --git a/clang/test/CodeGenCoroutines/pr65018.cpp 
b/clang/test/CodeGenCoroutines/pr65018.cpp
index 2fdfe684b592f..f1cde461cabc2 100644
--- a/clang/test/CodeGenCoroutines/pr65018.cpp
+++ b/clang/test/CodeGenCoroutines/pr65018.cpp
@@ -45,6 +45,6 @@ MyTask FooBar() {
 
 // CHECK: %[[RET:.+]] = 
{{.*}}call{{.*}}@_ZN7Awaiter13await_suspendESt16coroutine_handleIvE
 // CHECK: %[[RESUME_ADDR:.+]] = load ptr, ptr %[[RET]],
-// CHECK: musttail call fastcc void %[[RESUME_ADDR]]({{.*}}%[[RET]]
+// CHECK: musttail call void %[[RESUME_ADDR]]({{.*}}%[[RET]]
 // CHECK: ret
 
diff --git a/llvm/docs/Coroutines.rst b/llvm/docs/Coroutines.rst
index bb38343ef294e..4b156afcfffb1 100644
--- a/llvm/docs/Coroutines.rst
+++ b/llvm/docs/Coroutines.rst
@@ -382,7 +382,7 @@ Outlined resume part of the coroutine will reside in 
function `f.resume`:
 
 .. code-block:: llvm
 
-  define internal fastcc void @f.resume(ptr %frame.ptr.resume) {
+  define internal void @f.resume(ptr %frame.ptr.resume) {
   entry:
     %inc.spill.addr = getelementptr %f.frame, ptr %frame.ptr.resume, i64 0, 
i32 2
     %inc.spill = load i32, ptr %inc.spill.addr, align 4
@@ -396,7 +396,7 @@ Whereas function `f.destroy` will contain the cleanup code 
for the coroutine:
 
 .. code-block:: llvm
 
-  define internal fastcc void @f.destroy(ptr %frame.ptr.destroy) {
+  define internal void @f.destroy(ptr %frame.ptr.destroy) {
   entry:
     tail call void @free(ptr %frame.ptr.destroy)
     ret void
@@ -506,7 +506,7 @@ as follows:
 
 .. code-block:: llvm
 
-  define internal fastcc void @f.Resume(ptr %FramePtr) {
+  define internal void @f.Resume(ptr %FramePtr) {
   entry.Resume:
     %index.addr = getelementptr inbounds %f.Frame, ptr %FramePtr, i64 0, i32 2
     %index = load i8, ptr %index.addr, align 1
diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroShape.h 
b/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
index f4673d61f097d..28931e3260e68 100644
--- a/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
+++ b/llvm/include/llvm/Transforms/Coroutines/CoroShape.h
@@ -211,7 +211,10 @@ struct Shape {
   CallingConv::ID getResumeFunctionCC() const {
     switch (ABI) {
     case coro::ABI::Switch:
-      return CallingConv::Fast;
+      // Use the platform C calling convention so that resume/destroy
+      // function pointers stored in the coroutine frame are
+      // interoperable with other compilers.
+      return CallingConv::C;
 
     case coro::ABI::Retcon:
     case coro::ABI::RetconOnce:
diff --git a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp 
b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
index e06d913b794fc..1078fbffb13e3 100644
--- a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
@@ -183,7 +183,6 @@ void Lowerer::lowerCoroNoop(IntrinsicInst *II) {
         FnTy, GlobalValue::LinkageTypes::InternalLinkage,
         M.getDataLayout().getProgramAddressSpace(), "__NoopCoro_ResumeDestroy",
         &M);
-    NoopFn->setCallingConv(CallingConv::Fast);
     buildDebugInfoForNoopResumeDestroyFunc(NoopFn);
     auto *Entry = BasicBlock::Create(C, "entry", NoopFn);
     ReturnInst::Create(C, Entry);
diff --git a/llvm/lib/Transforms/Coroutines/CoroEarly.cpp 
b/llvm/lib/Transforms/Coroutines/CoroEarly.cpp
index 0c67ceccf4c4d..e8a95fe88d4e1 100644
--- a/llvm/lib/Transforms/Coroutines/CoroEarly.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroEarly.cpp
@@ -44,7 +44,6 @@ void Lowerer::lowerResumeOrDestroy(CallBase &CB,
                                    CoroSubFnInst::ResumeKind Index) {
   Value *ResumeAddr = makeSubFnCall(CB.getArgOperand(0), Index, &CB);
   CB.setCalledOperand(ResumeAddr);
-  CB.setCallingConv(CallingConv::Fast);
 }
 
 // Coroutine promise field is always at the fixed offset from the beginning of
diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp 
b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
index 897463186431f..7915fbf4cce05 100644
--- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -136,7 +136,6 @@ static void lowerAwaitSuspend(IRBuilder<> &Builder, 
CoroAwaitSuspendInst *CB,
     FunctionType *ResumeTy = FunctionType::get(
         Type::getVoidTy(Ctx), PointerType::getUnqual(Ctx), false);
     auto *ResumeCall = Builder.CreateCall(ResumeTy, ResumeAddr, {NewCall});
-    ResumeCall->setCallingConv(CallingConv::Fast);
 
     // We can't insert the 'ret' instruction and adjust the cc until the
     // function has been split, so remember this for later.
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 b996ffeeaa4f5..1af1412834376 100644
--- a/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll
+++ b/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O0.ll
@@ -63,7 +63,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f_copy.resume(
+; CHECK-LABEL: define internal void @f_copy.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[THIS_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -74,7 +74,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f_copy.destroy(
+; CHECK-LABEL: define internal void @f_copy.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -82,7 +82,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f_copy.cleanup(
+; CHECK-LABEL: define internal void @f_copy.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
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 f8c40879067e2..26edf668835b4 100644
--- a/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll
+++ b/llvm/test/Transforms/Coroutines/coro-alloc-with-param-O2.ll
@@ -58,7 +58,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f_direct.resume(
+; CHECK-LABEL: define internal void @f_direct.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[THIS_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -69,7 +69,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f_direct.destroy(
+; CHECK-LABEL: define internal void @f_direct.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -77,7 +77,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f_direct.cleanup(
+; CHECK-LABEL: define internal void @f_direct.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-alloca-07.ll 
b/llvm/test/Transforms/Coroutines/coro-alloca-07.ll
index 3be4177909b7d..6acd8b6285775 100644
--- a/llvm/test/Transforms/Coroutines/coro-alloca-07.ll
+++ b/llvm/test/Transforms/Coroutines/coro-alloca-07.ll
@@ -84,7 +84,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(48) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[ALIAS_PHI_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, 
ptr [[HDL]], i64 32
@@ -95,7 +95,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(48) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -103,7 +103,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(48) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git 
a/llvm/test/Transforms/Coroutines/coro-await-suspend-handle-in-ramp.ll 
b/llvm/test/Transforms/Coroutines/coro-await-suspend-handle-in-ramp.ll
index 4aef572f47a35..17074492b914a 100644
--- a/llvm/test/Transforms/Coroutines/coro-await-suspend-handle-in-ramp.ll
+++ b/llvm/test/Transforms/Coroutines/coro-await-suspend-handle-in-ramp.ll
@@ -17,12 +17,13 @@ entry:
     i8 1, label %cleanup
   ]
 
-; Check the calling convention for resuming function is fastcc
-; CHECK:     define {{[^@]*}} @f()
+; The `call void` below uses the default calling convention. This must match
+; the calling convention of the `@f.resume` function, tested further down.
+; CHECK:      define void @f() {
 ; CHECK:      entry:
 ; CHECK:        %[[NEXT_HDL:.+]] = call ptr @await_suspend_wrapper_handle(
 ; CHECK-NEXT:   %[[CONT:.+]] = call ptr @llvm.coro.subfn.addr(ptr 
%[[NEXT_HDL]], i8 0)
-; CHECK-NEXT:   call fastcc void %[[CONT]](ptr %[[NEXT_HDL]])
+; CHECK-NEXT:   call void %[[CONT]](ptr %[[NEXT_HDL]])
 step:
   br label %cleanup
 
@@ -36,10 +37,11 @@ ret:
   ret void
 }
 
-; check that we were haven't accidentally went out of @f body
-; CHECK-LABEL: @f.resume(
-; CHECK-LABEL: @f.destroy(
-; CHECK-LABEL: @f.cleanup(
+; Check that the clones use the same calling convention as the ramp's resuming
+; call (i.e. the default as there is no specifc calling convention mentioned).
+; CHECK-LABEL: define internal void @f.resume(
+; CHECK-LABEL: define internal void @f.destroy(
+; CHECK-LABEL: define internal void @f.cleanup(
 
 declare ptr @await_suspend_wrapper_handle(ptr, ptr)
 
diff --git a/llvm/test/Transforms/Coroutines/coro-await-suspend-lower-invoke.ll 
b/llvm/test/Transforms/Coroutines/coro-await-suspend-lower-invoke.ll
index 87309042f18bf..20acaed0abe0d 100644
--- a/llvm/test/Transforms/Coroutines/coro-await-suspend-lower-invoke.ll
+++ b/llvm/test/Transforms/Coroutines/coro-await-suspend-lower-invoke.ll
@@ -117,7 +117,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*]]:
 ; CHECK-NEXT:    [[AWAITER_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 0
@@ -156,7 +156,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:            to label %[[STEP2_CONTINUE:.*]] unwind label %[[PAD]]
 ; CHECK:       [[STEP2_CONTINUE]]:
 ; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @llvm.coro.subfn.addr(ptr [[TMP3]], 
i8 0)
-; CHECK-NEXT:    musttail call fastcc void [[TMP4]](ptr [[TMP3]])
+; CHECK-NEXT:    musttail call void [[TMP4]](ptr [[TMP3]])
 ; CHECK-NEXT:    ret void
 ; CHECK:       [[PAD]]:
 ; CHECK-NEXT:    [[LP:%.*]] = landingpad { ptr, i32 }
@@ -175,7 +175,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    unreachable
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[AWAITER_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 0
@@ -184,7 +184,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[AWAITER_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 0
diff --git a/llvm/test/Transforms/Coroutines/coro-await-suspend-lower.ll 
b/llvm/test/Transforms/Coroutines/coro-await-suspend-lower.ll
index bb3fa099de763..f4fe291b09bc7 100644
--- a/llvm/test/Transforms/Coroutines/coro-await-suspend-lower.ll
+++ b/llvm/test/Transforms/Coroutines/coro-await-suspend-lower.ll
@@ -94,7 +94,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*]]:
 ; CHECK-NEXT:    [[AWAITER_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 0
@@ -129,7 +129,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    store i2 -1, ptr [[INDEX_ADDR15]], align 1
 ; CHECK-NEXT:    [[TMP3:%.*]] = call ptr @await_suspend_wrapper_handle(ptr 
[[AWAITER_RELOAD_ADDR]], ptr [[HDL]])
 ; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @llvm.coro.subfn.addr(ptr [[TMP3]], 
i8 0)
-; CHECK-NEXT:    musttail call fastcc void [[TMP4]](ptr [[TMP3]])
+; CHECK-NEXT:    musttail call void [[TMP4]](ptr [[TMP3]])
 ; CHECK-NEXT:    ret void
 ; CHECK:       [[CLEANUP]]:
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -141,7 +141,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    unreachable
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[AWAITER_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 0
@@ -150,7 +150,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[AWAITER_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 0
diff --git a/llvm/test/Transforms/Coroutines/coro-debug-O2.ll 
b/llvm/test/Transforms/Coroutines/coro-debug-O2.ll
index 4daaa5960f0ae..fce7c19ec8c9d 100644
--- a/llvm/test/Transforms/Coroutines/coro-debug-O2.ll
+++ b/llvm/test/Transforms/Coroutines/coro-debug-O2.ll
@@ -2,7 +2,7 @@
 
 ; Checks the dbg informations about promise and coroutine frames under O2.
 
-; CHECK-LABEL: define internal fastcc void @f.resume({{.*}})
+; CHECK-LABEL: define internal void @f.resume({{.*}})
 ; CHECK:       entry.resume:
 ; CHECK:        #dbg_value(ptr poison, ![[PROMISEVAR_RESUME:[0-9]+]], 
!DIExpression(DW_OP_deref, DW_OP_plus_uconst, 16
 ; CHECK:        #dbg_value(ptr %begin, ![[CORO_FRAME:[0-9]+]], 
!DIExpression(DW_OP_deref)
diff --git a/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll 
b/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll
index 28f8beddcdb7b..629ab5be972f8 100644
--- a/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll
+++ b/llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll
@@ -7,7 +7,7 @@
 ; CHECK:        %[[begin:.*]] = call noalias nonnull ptr @llvm.coro.begin(
 ; CHECK:        #dbg_declare(ptr %[[begin]], ![[CORO_FRAME:[0-9]+]], 
!DIExpression(),
 ;
-; CHECK:       define internal fastcc void @f.resume(
+; CHECK:       define internal void @f.resume(
 ; CHECK:       entry.resume:
 ; CHECK:            %[[FramePtr_RESUME:.*]] = alloca ptr
 ; CHECK:            #dbg_declare(ptr %[[FramePtr_RESUME]], 
![[CORO_FRAME_IN_RESUME:[0-9]+]], !DIExpression(DW_OP_deref)
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 483c1a8e8608a..8c9248c6e2289 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
@@ -2,7 +2,7 @@
 ; RUN: opt < %s -passes='module(coro-early),cgscc(coro-split,coro-split)' -S | 
FileCheck %s
 ;
 ; This file is based on coro-debug-frame-variable.ll.
-; CHECK:  define internal fastcc void @_Z3foov.resume(ptr noundef nonnull 
align 16 dereferenceable(80) %begin) !dbg ![[RESUME_FN_DBG_NUM:[0-9]+]]
+; CHECK:  define internal void @_Z3foov.resume(ptr noundef nonnull align 16 
dereferenceable(80) %begin) !dbg ![[RESUME_FN_DBG_NUM:[0-9]+]]
 ; CHECK:       await.ready:
 ; CHECK:         #dbg_value(i32 poison, ![[IVAR_RESUME:[0-9]+]], !DIExpression(
 ; CHECK:         #dbg_value(i32 poison, ![[JVAR_RESUME:[0-9]+]], !DIExpression(
diff --git a/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll 
b/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll
index 0ef24a6b1e2a6..65a05ee2552e3 100644
--- a/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll
+++ b/llvm/test/Transforms/Coroutines/coro-debug-frame-variable.ll
@@ -36,7 +36,7 @@
 ; CHECK:         #dbg_declare(ptr %[[MEMORY]], ![[IVAR:[0-9]+]], 
!DIExpression(DW_OP_plus_uconst, 20), ![[IDBGLOC]]
 ; CHECK:       await.ready:
 ;
-; CHECK-LABEL: define internal fastcc void @_Z3foov.resume({{.*}}) {{.*}} {
+; CHECK-LABEL: define internal void @_Z3foov.resume({{.*}}) {{.*}} {
 ; CHECK:       entry.resume:
 ; CHECK-NEXT:    %[[DBG_PTR:.*]] = alloca ptr
 ; CHECK-NEXT:    #dbg_declare(ptr %[[DBG_PTR]], ![[XVAR_RESUME:[0-9]+]],   
!DIExpression(DW_OP_deref, DW_OP_plus_uconst, 32),
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 f57bc20d64ff6..52b83516b559a 100644
--- a/llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll
+++ b/llvm/test/Transforms/Coroutines/coro-debug-spill-dbg.declare.ll
@@ -17,17 +17,17 @@
 ;
 ; We want to make sure that the "this" pointer is accessable in debugger 
before and after the suspension point.
 ;
-; CHECK: define internal fastcc void @foo.resume(ptr noundef nonnull align 8 
dereferenceable(32) %[[HDL:.*]])
+; CHECK: define internal void @foo.resume(ptr noundef nonnull align 8 
dereferenceable(32) %[[HDL:.*]])
 ; CHECK-NEXT: entry.resume:
 ; CHECK-NEXT:   %[[HDL]].debug = alloca ptr, align 8
 ; CHECK-NEXT:   #dbg_declare(ptr %[[HDL]].debug, ![[THIS_RESUME:[0-9]+]], 
!DIExpression(DW_OP_deref, DW_OP_plus_uconst, 24),
 ;
-; CHECK: define internal fastcc void @foo.destroy(ptr noundef nonnull align 8 
dereferenceable(32) %[[HDL]])
+; CHECK: define internal void @foo.destroy(ptr noundef nonnull align 8 
dereferenceable(32) %[[HDL]])
 ; CHECK-NEXT: entry.destroy:
 ; CHECK-NEXT:   %[[HDL]].debug = alloca ptr, align 8
 ; CHECK-NEXT:   #dbg_declare(ptr %[[HDL]].debug, ![[THIS_DESTROY:[0-9]+]], 
!DIExpression(DW_OP_deref, DW_OP_plus_uconst, 24),
 ;
-; CHECK: define internal fastcc void @foo.cleanup(ptr noundef nonnull align 8 
dereferenceable(32) %[[HDL]])
+; CHECK: define internal void @foo.cleanup(ptr noundef nonnull align 8 
dereferenceable(32) %[[HDL]])
 ; CHECK-NEXT: entry.cleanup:
 ; CHECK-NEXT:   %[[HDL]].debug = alloca ptr, align 8
 ; CHECK-NEXT:   #dbg_declare(ptr %[[HDL]].debug, ![[THIS_CLEANUP:[0-9]+]], 
!DIExpression(DW_OP_deref, DW_OP_plus_uconst, 24),
diff --git a/llvm/test/Transforms/Coroutines/coro-debug.ll 
b/llvm/test/Transforms/Coroutines/coro-debug.ll
index 4c66cb94667b5..00643b5a0176c 100644
--- a/llvm/test/Transforms/Coroutines/coro-debug.ll
+++ b/llvm/test/Transforms/Coroutines/coro-debug.ll
@@ -162,7 +162,7 @@ attributes #0 = { noinline nounwind presplitcoroutine }
 ; Also check that it contains `#dbg_declare` and `#dbg_value` debug 
instructions
 ; making the debug variables available to the debugger.
 ;
-; CHECK: define internal fastcc void @flink.resume(ptr noundef nonnull align 8 
dereferenceable(32) %0) #0 personality i32 0 !dbg ![[RESUME:[0-9]+]]
+; CHECK: define internal void @flink.resume(ptr noundef nonnull align 8 
dereferenceable(32) %0) #0 personality i32 0 !dbg ![[RESUME:[0-9]+]]
 ; CHECK: entry.resume:
 ; CHECK: %[[DBG_PTR:.*]] = alloca ptr
 ; CHECK-NEXT: #dbg_declare(ptr %[[DBG_PTR]], ![[RESUME_X:[0-9]+]], 
!DIExpression(DW_OP_deref, DW_OP_plus_uconst, [[EXPR_TAIL:.*]])
@@ -186,8 +186,8 @@ attributes #0 = { noinline nounwind presplitcoroutine }
 
 ; Check that the destroy and cleanup functions are present and capture their 
debug info id.
 ;
-; CHECK: define internal fastcc void @flink.destroy(ptr noundef nonnull align 
8 dereferenceable(32) %0) #0 personality i32 0 !dbg ![[DESTROY:[0-9]+]]
-; CHECK: define internal fastcc void @flink.cleanup(ptr noundef nonnull align 
8 dereferenceable(32) %0) #0 personality i32 0 !dbg ![[CLEANUP:[0-9]+]]
+; CHECK: define internal void @flink.destroy(ptr noundef nonnull align 8 
dereferenceable(32) %0) #0 personality i32 0 !dbg ![[DESTROY:[0-9]+]]
+; CHECK: define internal void @flink.cleanup(ptr noundef nonnull align 8 
dereferenceable(32) %0) #0 personality i32 0 !dbg ![[CLEANUP:[0-9]+]]
 
 ; Check that the linkage name of the original function is set correctly.
 ;
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 a9b7cdb8be0fa..0959dc9b12873 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
@@ -4,7 +4,7 @@
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 define void @f(i1 %cond) presplitcoroutine personality i32 0 {
 entry:
   %id = call token @llvm.coro.id(i32 16, ptr null, ptr @f, ptr null)
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 8ec2dd2f8ac9a..767318f126315 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
@@ -90,7 +90,7 @@ declare ptr @llvm.coro.free(token, ptr nocapture readonly)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @g.resume(
+; CHECK-LABEL: define internal void @g.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[COND_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 25
@@ -121,7 +121,7 @@ declare ptr @llvm.coro.free(token, ptr nocapture readonly)
 ; CHECK-NEXT:    unreachable
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @g.destroy(
+; CHECK-LABEL: define internal void @g.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -129,7 +129,7 @@ declare ptr @llvm.coro.free(token, ptr nocapture readonly)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @g.cleanup(
+; CHECK-LABEL: define internal void @g.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
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 373ee8211c9d9..2aab332f448c1 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
@@ -90,7 +90,7 @@ declare ptr @llvm.coro.free(token, ptr nocapture readonly)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @h.resume(
+; CHECK-LABEL: define internal void @h.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[COND_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 25
@@ -123,7 +123,7 @@ declare ptr @llvm.coro.free(token, ptr nocapture readonly)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @h.destroy(
+; CHECK-LABEL: define internal void @h.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -131,7 +131,7 @@ declare ptr @llvm.coro.free(token, ptr nocapture readonly)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @h.cleanup(
+; CHECK-LABEL: define internal void @h.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll 
b/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll
index e3dbd1f02531a..fc99d0811b392 100644
--- a/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll
+++ b/llvm/test/Transforms/Coroutines/coro-frame-arrayalloca.ll
@@ -72,7 +72,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(56) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[PREFIX_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -86,7 +86,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(56) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -94,7 +94,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(56) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-frame.ll 
b/llvm/test/Transforms/Coroutines/coro-frame.ll
index 0f538a403ed82..2af186e405d54 100644
--- a/llvm/test/Transforms/Coroutines/coro-frame.ll
+++ b/llvm/test/Transforms/Coroutines/coro-frame.ll
@@ -72,7 +72,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(40) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[R_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -86,7 +86,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(40) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -94,7 +94,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(40) [[HDL:%.*]]) 
personality i32 0 {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-noop-pacbti.ll 
b/llvm/test/Transforms/Coroutines/coro-noop-pacbti.ll
index 910b6b07e1628..6fb8312f97bdf 100644
--- a/llvm/test/Transforms/Coroutines/coro-noop-pacbti.ll
+++ b/llvm/test/Transforms/Coroutines/coro-noop-pacbti.ll
@@ -1,7 +1,7 @@
 
 ; RUN: opt < %s -S -passes=coro-cleanup | FileCheck %s
 
-; CHECK:      define internal fastcc void @__NoopCoro_ResumeDestroy(ptr %0) #1 
{
+; CHECK:      define internal void @__NoopCoro_ResumeDestroy(ptr %0) #1 {
 ; CHECK-NEXT: entry:
 ; CHECK-NEXT:   ret void
 ; CHECK-NEXT: }
diff --git a/llvm/test/Transforms/Coroutines/coro-noop.ll 
b/llvm/test/Transforms/Coroutines/coro-noop.ll
index 0f61db42c5dec..3736d3f1762f5 100644
--- a/llvm/test/Transforms/Coroutines/coro-noop.ll
+++ b/llvm/test/Transforms/Coroutines/coro-noop.ll
@@ -25,7 +25,7 @@ declare ptr @llvm.coro.noop()
 !4 = !{i32 2, !"Debug Info Version", i32 3}
 
 
-; CHECK: define internal fastcc void @__NoopCoro_ResumeDestroy(ptr %0) !dbg 
![[RESUME:[0-9]+]] {
+; CHECK: define internal void @__NoopCoro_ResumeDestroy(ptr %0) !dbg 
![[RESUME:[0-9]+]] {
 ; CHECK-NEXT: entry
 ; CHECK-NEXT:    ret void
 
diff --git a/llvm/test/Transforms/Coroutines/coro-padding.ll 
b/llvm/test/Transforms/Coroutines/coro-padding.ll
index 039e75a603ce3..dd72c41d33917 100644
--- a/llvm/test/Transforms/Coroutines/coro-padding.ll
+++ b/llvm/test/Transforms/Coroutines/coro-padding.ll
@@ -61,7 +61,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 32 dereferenceable(64) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[DATA_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 32
@@ -71,7 +71,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 32 dereferenceable(64) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -79,7 +79,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 32 dereferenceable(64) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-resume-destroy.ll 
b/llvm/test/Transforms/Coroutines/coro-resume-destroy.ll
index 157aa8e372e69..191170afd7a61 100644
--- a/llvm/test/Transforms/Coroutines/coro-resume-destroy.ll
+++ b/llvm/test/Transforms/Coroutines/coro-resume-destroy.ll
@@ -6,11 +6,11 @@ define void @callResume(ptr %hdl) {
 ; CHECK-NEXT: entry
 entry:
 ; CHECK-NEXT: %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
-; CHECK-NEXT: call fastcc void %0(ptr %hdl)
+; CHECK-NEXT: call void %0(ptr %hdl)
   call void @llvm.coro.resume(ptr %hdl)
 
 ; CHECK-NEXT: %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
-; CHECK-NEXT: call fastcc void %1(ptr %hdl)
+; CHECK-NEXT: call void %1(ptr %hdl)
   call void @llvm.coro.destroy(ptr %hdl)
 
   ret void
@@ -22,7 +22,7 @@ define void @eh(ptr %hdl) personality ptr null {
 ; CHECK-NEXT: entry
 entry:
 ;  CHECK-NEXT: %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
-;  CHECK-NEXT: invoke fastcc void %0(ptr %hdl)
+;  CHECK-NEXT: invoke void %0(ptr %hdl)
   invoke void @llvm.coro.resume(ptr %hdl)
           to label %cont unwind label %ehcleanup
 cont:
diff --git a/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll 
b/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll
index 7cc5fdb21da2b..3b6eb0f73dcc4 100644
--- a/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll
+++ b/llvm/test/Transforms/Coroutines/coro-spill-corobegin.ll
@@ -69,7 +69,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[INNERHDL_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -82,7 +82,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -90,7 +90,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(32) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll 
b/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll
index 29d21ca019204..d1594ade2d3b2 100644
--- a/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll
+++ b/llvm/test/Transforms/Coroutines/coro-spill-promise-02.ll
@@ -71,7 +71,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 64 dereferenceable(128) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[DATA_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -83,7 +83,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 64 dereferenceable(128) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -91,7 +91,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 64 dereferenceable(128) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-spill-promise.ll 
b/llvm/test/Transforms/Coroutines/coro-spill-promise.ll
index 6dfb37638e983..4a001a8895a09 100644
--- a/llvm/test/Transforms/Coroutines/coro-spill-promise.ll
+++ b/llvm/test/Transforms/Coroutines/coro-spill-promise.ll
@@ -65,7 +65,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 64 dereferenceable(128) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[DATA_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -77,7 +77,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 64 dereferenceable(128) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -85,7 +85,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 64 dereferenceable(128) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)
diff --git a/llvm/test/Transforms/Coroutines/coro-spill-suspend.ll 
b/llvm/test/Transforms/Coroutines/coro-spill-suspend.ll
index 86b585bdab011..4134d59cea4c9 100644
--- a/llvm/test/Transforms/Coroutines/coro-spill-suspend.ll
+++ b/llvm/test/Transforms/Coroutines/coro-spill-suspend.ll
@@ -59,7 +59,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*]]:
 ; CHECK-NEXT:    [[INDEX_ADDR:%.*]] = getelementptr inbounds i8, ptr [[HDL]], 
i64 16
@@ -90,7 +90,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    unreachable
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[INDEX_ADDR:%.*]] = getelementptr inbounds i8, ptr [[HDL]], 
i64 16
@@ -114,7 +114,7 @@ declare void @free(ptr)
 ; CHECK-NEXT:    unreachable
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[INDEX_ADDR:%.*]] = getelementptr inbounds i8, ptr [[HDL]], 
i64 16
diff --git a/llvm/test/Transforms/Coroutines/coro-split-dbg-labels-inlined.ll 
b/llvm/test/Transforms/Coroutines/coro-split-dbg-labels-inlined.ll
index 995795b8de1fa..d50031953a8af 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-dbg-labels-inlined.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-dbg-labels-inlined.ll
@@ -33,13 +33,13 @@ coro_Suspend:
 }
 
 ; Check that the resume function contains the `#dbg_label` instructions.
-; CHECK-LABEL:   define internal fastcc void @f.resume({{.*}})
+; CHECK-LABEL:   define internal void @f.resume({{.*}})
 ; CHECK-SAME:      !dbg ![[RESUME_SUBPROGRAM:[0-9]+]]
 ; CHECK:         resume.0:
 ; CHECK-NEXT:        #dbg_label(![[RESUME_0:[0-9]+]], 
![[RESUME_LABEL_LOC:[0-9]+]])
 
 ; Check that the destroy function contains the `#dbg_label` instructions.
-; CHECK-LABEL:   define internal fastcc void @f.destroy({{.*}})
+; CHECK-LABEL:   define internal void @f.destroy({{.*}})
 ; CHECK-SAME:      !dbg ![[DESTROY_SUBPROGRAM:[0-9]+]]
 ; CHECK:         resume.0:
 ; CHECK-NEXT:        #dbg_label(![[DESTROY_0:[0-9]+]], 
![[DESTROY_LABEL_LOC:[0-9]+]])
diff --git a/llvm/test/Transforms/Coroutines/coro-split-dbg-labels.ll 
b/llvm/test/Transforms/Coroutines/coro-split-dbg-labels.ll
index 4c5d9fb81c272..c3b13c89fdede 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-dbg-labels.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-dbg-labels.ll
@@ -76,7 +76,7 @@ coro_Suspend:                                     ; preds = 
%for.cond, %if.then,
 ; CHECK-NEXT:        #dbg_label(![[RESUME_1:[0-9]+]], !{{[0-9]+}})
 
 ; Check that the destroy function contains the `#dbg_label` instructions.
-; CHECK-LABEL:   define internal fastcc void @f.destroy({{.*}}) #1 !dbg !38 {
+; CHECK-LABEL:   define internal void @f.destroy({{.*}}) #1 !dbg !38 {
 ; CHECK:         resume.0:        ; preds = %resume.entry
 ; CHECK-NEXT:        #dbg_label(![[DESTROY_0:[0-9]+]], !{{[0-9]+}})
 ; CHECK:         resume.1:        ; preds = %resume.entry
diff --git a/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll 
b/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll
index 96777c51c3fcc..2916e5d880e4a 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-eh-00.ll
@@ -57,7 +57,7 @@ eh.resume:
 ; VERIFY Resume Parts
 
 ; Verify that resume function does not contains both print calls appearing 
after coro.end
-; CHECK-LABEL: define internal fastcc void @f.resume
+; CHECK-LABEL: define internal void @f.resume
 ; CHECK: invoke void @print(i32 1)
 ; CHECK:   to label %CoroEnd unwind label %lpad
 
diff --git a/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll 
b/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll
index c3fb94f77d4b2..026ffd9d8fec1 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-eh-01.ll
@@ -51,7 +51,7 @@ cleanup.cont:
 ; VERIFY Resume Parts
 
 ; Verify that resume function does not contains both print calls appearing 
after coro.end
-; CHECK-LABEL: define internal fastcc void @f2.resume
+; CHECK-LABEL: define internal void @f2.resume
 ; CHECK: invoke void @print(i32 1)
 ; CHECK:   to label %CoroEnd unwind label %lpad
 
diff --git 
a/llvm/test/Transforms/Coroutines/coro-split-musttail-chain-pgo-counter-promo.ll
 
b/llvm/test/Transforms/Coroutines/coro-split-musttail-chain-pgo-counter-promo.ll
index 70f15f6129d8e..5cd2d2a2c58aa 100644
--- 
a/llvm/test/Transforms/Coroutines/coro-split-musttail-chain-pgo-counter-promo.ll
+++ 
b/llvm/test/Transforms/Coroutines/coro-split-musttail-chain-pgo-counter-promo.ll
@@ -1,12 +1,12 @@
 ; REQUIRES: x86-registered-target
 ; RUN: opt -passes='pgo-instr-gen,instrprof,coro-split' 
-do-counter-promotion=true -S < %s | FileCheck %s
 
-; CHECK-LABEL: define internal fastcc void @f.resume
-; CHECK: musttail call fastcc void 
+; CHECK-LABEL: define internal void @f.resume
+; CHECK: musttail call void 
 ; CHECK-NEXT: ret void
-; CHECK: musttail call fastcc void 
+; CHECK: musttail call void 
 ; CHECK-NEXT: ret void
-; CHECK-LABEL: define internal fastcc void @f.destroy
+; CHECK-LABEL: define internal void @f.destroy
 target triple = "x86_64-grtev4-linux-gnu"
 
 %CoroutinePromise = type { ptr, i64, [8 x i8], ptr} 
@@ -131,7 +131,7 @@ define ptr @f(i32 %0) presplitcoroutine align 32 {
   %48 = inttoptr i64 %40 to ptr
   %49 = call ptr @llvm.coro.subfn.addr(ptr %48, i8 0)
   %50 = ptrtoint ptr %49 to i64
-  call fastcc void %49(ptr %48) #9
+  call void %49(ptr %48) #9
   %51 = call i8 @llvm.coro.suspend(token %37, i1 true) #28
   switch i8 %51, label %61 [
     i8 0, label %53
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail.ll
index 85f04d1edc23c..c41d9c1e5e328 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail.ll
@@ -10,7 +10,7 @@ entry:
 
   %save = call token @llvm.coro.save(ptr null)
   %addr1 = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-  call fastcc void %addr1(ptr null)
+  call void %addr1(ptr null)
 
   %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)
   switch i8 %suspend, label %exit [
@@ -34,12 +34,12 @@ exit:
 ; Verify that in the initial function resume is not marked with musttail.
 ; CHECK-LABEL: @f(
 ; CHECK: %[[addr1:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-; CHECK-NOT: musttail call fastcc void %[[addr1]](ptr null)
+; CHECK-NOT: musttail call void %[[addr1]](ptr null)
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @f.resume(
 ; CHECK: %[[addr2:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr2]]
+; CHECK-NEXT: musttail call void %[[addr2]]
 ; CHECK-NEXT: ret void
 
 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll
index 9f38c4f68de14..c92280e04fd04 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail1.ll
@@ -10,7 +10,7 @@ entry:
 
   %save = call token @llvm.coro.save(ptr null)
   %addr1 = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-  call fastcc void %addr1(ptr null)
+  call void %addr1(ptr null)
 
   %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)
   switch i8 %suspend, label %exit [
@@ -54,23 +54,23 @@ unreach:
 ; Verify that in the initial function resume is not marked with musttail.
 ; CHECK-LABEL: @f(
 ; CHECK: %[[addr1:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-; CHECK-NOT: musttail call fastcc void %[[addr1]](ptr null)
+; CHECK-NOT: musttail call void %[[addr1]](ptr null)
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @f.resume(
 ; CHECK: %[[hdl:.+]] = call ptr @g()
 ; CHECK-NEXT: call ptr @await_suspend_function
 ; CHECK-NEXT: %[[addr2:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr2]]
+; CHECK-NEXT: musttail call void %[[addr2]]
 ; CHECK-NEXT: ret void
 ; CHECK: %[[hdl2:.+]] = call ptr @h()
 ; CHECK-NEXT: call ptr @await_suspend_function
 ; CHECK-NEXT: %[[addr3:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr3]]
+; CHECK-NEXT: musttail call void %[[addr3]]
 ; CHECK-NEXT: ret void
 ; CHECK: call ptr @await_suspend_function
 ; CHECK: %[[addr4:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr4]]
+; CHECK-NEXT: musttail call void %[[addr4]]
 ; CHECK-NEXT: ret void
 
 
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll
index 291920084dcb9..cc5fe44170beb 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail2.ll
@@ -14,7 +14,7 @@ entry:
   %vFrame = call noalias nonnull ptr @llvm.coro.begin(token %id, ptr %alloc)
 
   %save = call token @llvm.coro.save(ptr null)
-  call fastcc void @fakeresume1(ptr null)
+  call void @fakeresume1(ptr null)
 
   %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)
   switch i8 %suspend, label %exit [
@@ -37,13 +37,13 @@ exit:
 
 ; Verify that in the initial function resume is not marked with musttail.
 ; CHECK-LABEL: @g(
-; CHECK-NOT: musttail call fastcc void @fakeresume1(ptr null)
+; CHECK-NOT: musttail call void @fakeresume1(ptr null)
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @g.resume(
 ; CHECK: call ptr @await_suspend_function
 ; CHECK-NEXT: call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void
+; CHECK-NEXT: musttail call void
 ; CHECK-NEXT: ret void
 
 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll
index 6dbcbc7b301ae..b16842d830853 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail3.ll
@@ -10,7 +10,7 @@ entry:
 
   %save = call token @llvm.coro.save(ptr null)
   %addr1 = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-  call fastcc void %addr1(ptr null)
+  call void %addr1(ptr null)
 
   %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)
   %cmp = icmp eq i8 %suspend, 0
@@ -50,23 +50,23 @@ unreach:
 ; Verify that in the initial function resume is not marked with musttail.
 ; CHECK-LABEL: @f(
 ; CHECK: %[[addr1:.+]] = call ptr @llvm.coro.subfn.addr(ptr null, i8 0)
-; CHECK-NOT: musttail call fastcc void %[[addr1]](ptr null)
+; CHECK-NOT: musttail call void %[[addr1]](ptr null)
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @f.resume(
 ; CHECK: %[[hdl:.+]] = call ptr @g()
 ; CHECK-NEXT: call ptr @await_suspend_function
 ; CHECK-NEXT: %[[addr2:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr2]]
+; CHECK-NEXT: musttail call void %[[addr2]]
 ; CHECK-NEXT: ret void
 ; CHECK: %[[hdl2:.+]] = call ptr @h()
 ; CHECK-NEXT: call ptr @await_suspend_function
 ; CHECK-NEXT: %[[addr3:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr3]]
+; CHECK-NEXT: musttail call void %[[addr3]]
 ; CHECK-NEXT: ret void
 ; CHECK: call ptr @await_suspend_function
 ; CHECK: %[[addr4:.+]] = call ptr @llvm.coro.subfn.addr
-; CHECK-NEXT: musttail call fastcc void %[[addr4]]
+; CHECK-NEXT: musttail call void %[[addr4]]
 ; CHECK-NEXT: ret void
 
 
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll
index 18ec5d2eda658..a350188b38e09 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail4.ll
@@ -43,7 +43,7 @@ coro.end:
 }
 
 ; CHECK-LABEL: @f.resume(
-; CHECK:          musttail call fastcc void
+; CHECK:          musttail call void
 ; CHECK-NEXT:     ret void
 
 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll
index d0e044a9b9a68..d5372a9a7eac4 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail5.ll
@@ -38,7 +38,7 @@ exit:
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @g.resume(
-; CHECK:          musttail call fastcc void
+; CHECK:          musttail call void
 ; CHECK-NEXT:     ret void
 
 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll
index 9160f9b952dcb..78c6d42ae81a0 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail6.ll
@@ -42,7 +42,7 @@ exit:
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @g.resume(
-; CHECK:      musttail call fastcc void
+; CHECK:      musttail call void
 ; CHECK-NEXT: ret void
 
 ; It has a cleanup bb.
@@ -90,7 +90,7 @@ exit:
 
 ; Verify that in the resume part resume call is marked with musttail.
 ; CHECK-LABEL: @f.resume(
-; CHECK:      musttail call fastcc void
+; CHECK:      musttail call void
 ; CHECK-NEXT: ret void
 
 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
diff --git a/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll 
b/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll
index b8989c0b06455..7e02e1566af28 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-musttail7.ll
@@ -48,7 +48,7 @@ exit:
 ; CHECK-LABEL: @g.resume(
 ; CHECK:         %[[FRAME:[0-9]+]] = call ptr @await_suspend_function(ptr 
null, ptr null)
 ; CHECK:         %[[RESUMEADDR:[0-9]+]] = call ptr @llvm.coro.subfn.addr(ptr 
%[[FRAME]], i8 0)
-; CHECK:         musttail call fastcc void %[[RESUMEADDR]](ptr %[[FRAME]])
+; CHECK:         musttail call void %[[RESUMEADDR]](ptr %[[FRAME]])
 ; CHECK-NEXT:    ret void
 
 ; It has a cleanup bb.
@@ -98,7 +98,7 @@ exit:
 ; CHECK-LABEL: @f.resume(
 ; CHECK:         %[[FRAME:[0-9]+]] = call ptr @await_suspend_function(ptr 
null, ptr null)
 ; CHECK:         %[[RESUMEADDR:[0-9]+]] = call ptr @llvm.coro.subfn.addr(ptr 
%[[FRAME]], i8 0)
-; CHECK:         musttail call fastcc void %[[RESUMEADDR]](ptr %[[FRAME]])
+; CHECK:         musttail call void %[[RESUMEADDR]](ptr %[[FRAME]])
 ; CHECK-NEXT:    ret void
 
 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #1
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 e1460ead3dba4..27bdfa847302d 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-01.ll
@@ -142,7 +142,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.resume(
+; CHECK-LABEL: define internal void @a.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca i32, align 4
@@ -156,7 +156,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.destroy(
+; CHECK-LABEL: define internal void @a.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca i32, align 4
@@ -165,7 +165,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.cleanup(
+; CHECK-LABEL: define internal void @a.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca i32, align 4
@@ -174,7 +174,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a_optnone.resume(
+; CHECK-LABEL: define internal void @a_optnone.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) 
#[[ATTR0]] {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[REF_TMP7:%.*]] = alloca 
%"struct.lean_future<int>::Awaiter", align 8
@@ -201,7 +201,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a_optnone.destroy(
+; CHECK-LABEL: define internal void @a_optnone.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) 
#[[ATTR0]] {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[REF_TMP7:%.*]] = alloca 
%"struct.lean_future<int>::Awaiter", align 8
@@ -228,7 +228,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a_optnone.cleanup(
+; CHECK-LABEL: define internal void @a_optnone.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) 
#[[ATTR0]] {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[REF_TMP7:%.*]] = alloca 
%"struct.lean_future<int>::Awaiter", align 8
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 ae41f9a6b3c4f..bd867ea4ea808 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-02.ll
@@ -100,7 +100,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.resume(
+; CHECK-LABEL: define internal void @a.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[REF_TMP7:%.*]] = alloca 
%"struct.lean_future<int>::Awaiter", align 8
@@ -118,7 +118,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.destroy(
+; CHECK-LABEL: define internal void @a.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[REF_TMP7:%.*]] = alloca 
%"struct.lean_future<int>::Awaiter", align 8
@@ -136,7 +136,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.cleanup(
+; CHECK-LABEL: define internal void @a.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[REF_TMP7:%.*]] = alloca 
%"struct.lean_future<int>::Awaiter", align 8
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 f1ad26eb7b090..f31182c2f3e4f 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-03.ll
@@ -73,7 +73,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.gep.resume(
+; CHECK-LABEL: define internal void @a.gep.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca [[I8_ARRAY:%.*]], align 8
@@ -86,7 +86,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.gep.destroy(
+; CHECK-LABEL: define internal void @a.gep.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca [[I8_ARRAY:%.*]], align 8
@@ -95,7 +95,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.gep.cleanup(
+; CHECK-LABEL: define internal void @a.gep.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca [[I8_ARRAY:%.*]], align 8
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 3671e9882269f..599d2cdd86c6d 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-sink-lifetime-04.ll
@@ -74,7 +74,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.resume(
+; CHECK-LABEL: define internal void @a.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca i8, align 1
@@ -88,7 +88,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.destroy(
+; CHECK-LABEL: define internal void @a.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca i8, align 1
@@ -97,7 +97,7 @@ declare void @llvm.lifetime.end.p0(ptr nocapture) #4
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @a.cleanup(
+; CHECK-LABEL: define internal void @a.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[VFRAME:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    [[TESTVAL:%.*]] = alloca i8, align 1
diff --git a/llvm/test/Transforms/Coroutines/coro-split-tbaa-md.ll 
b/llvm/test/Transforms/Coroutines/coro-split-tbaa-md.ll
index b6557410d8bf8..f7f99102e5903 100644
--- a/llvm/test/Transforms/Coroutines/coro-split-tbaa-md.ll
+++ b/llvm/test/Transforms/Coroutines/coro-split-tbaa-md.ll
@@ -81,7 +81,7 @@ declare void @free(ptr) willreturn allockind("free") 
"alloc-family"="malloc"
 ; CHECK-NEXT:    ret ptr [[HDL]]
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.resume(
+; CHECK-LABEL: define internal void @f.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[X_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[HDL]], i64 16
@@ -92,7 +92,7 @@ declare void @free(ptr) willreturn allockind("free") 
"alloc-family"="malloc"
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.destroy(
+; CHECK-LABEL: define internal void @f.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[MEM:%.*]] = call ptr @llvm.coro.free(token poison, ptr 
[[HDL]])
@@ -100,7 +100,7 @@ declare void @free(ptr) willreturn allockind("free") 
"alloc-family"="malloc"
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @f.cleanup(
+; CHECK-LABEL: define internal void @f.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) [[HDL:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    ret void
diff --git a/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll 
b/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll
index f8b2cf7482374..ca54d61d90331 100644
--- a/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll
+++ b/llvm/test/Transforms/Coroutines/coro-zero-alloca.ll
@@ -67,7 +67,7 @@ cleanup:                                          ; preds = 
%wakeup, %entry
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @foo.resume(
+; CHECK-LABEL: define internal void @foo.resume(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) 
[[CORO_STATE:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_RESUME:.*:]]
 ; CHECK-NEXT:    [[A1_RELOAD_ADDR:%.*]] = getelementptr inbounds i8, ptr 
[[CORO_STATE]], i64 16
@@ -83,7 +83,7 @@ cleanup:                                          ; preds = 
%wakeup, %entry
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @foo.destroy(
+; CHECK-LABEL: define internal void @foo.destroy(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) 
[[CORO_STATE:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_DESTROY:.*:]]
 ; CHECK-NEXT:    [[CORO_MEMFREE:%.*]] = call ptr @llvm.coro.free(token poison, 
ptr [[CORO_STATE]])
@@ -91,7 +91,7 @@ cleanup:                                          ; preds = 
%wakeup, %entry
 ; CHECK-NEXT:    ret void
 ;
 ;
-; CHECK-LABEL: define internal fastcc void @foo.cleanup(
+; CHECK-LABEL: define internal void @foo.cleanup(
 ; CHECK-SAME: ptr noundef nonnull align 8 dereferenceable(24) 
[[CORO_STATE:%.*]]) {
 ; CHECK-NEXT:  [[ENTRY_CLEANUP:.*:]]
 ; CHECK-NEXT:    call void @free(ptr null)

>From e4b62854fb22e482609ad2fe2bd9e97723c86452 Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <[email protected]>
Date: Thu, 21 May 2026 00:19:49 +0000
Subject: [PATCH 2/2] Add release notes

---
 clang/docs/ReleaseNotes.rst | 6 ++++++
 llvm/docs/ReleaseNotes.md   | 7 +++++++
 2 files changed, 13 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4fe64e88e7ff2..6f5f9bacf5c18 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -107,6 +107,12 @@ ABI Changes in This Version
 - Clang now uses MSVC-compatible manglings for supported AArch64 SVE builtin
   types when targeting the Microsoft ABI. This changes symbol names for
   affected declarations compared to previous Clang releases. (#GH196170)
+- The resume and destroy functions of C++20 coroutines now use the platform C
+  calling convention instead of LLVM's internal ``fastcc``. This makes the
+  coroutine ABI stable across LLVM versions and interoperable with other
+  compilers. On most targets this is not a breaking change because ``fastcc``
+  and the platform C calling convention agree for ``void(ptr)``. It is an ABI
+  break on i686, MIPS O32, PowerPC64 ELFv1, and Lanai.
 
 AST Dumping Potentially Breaking Changes
 ----------------------------------------
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index d15159924dba4..013b5d0a52067 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -80,6 +80,13 @@ Makes programs 10x faster by doing Special New Thing.
 * The standard textual output for floating-point literals is changed to take
   advantage of the new floating-point literals formats.
 
+* The resume/destroy functions emitted for the switch-resume ABI (C++20
+  coroutines) now use `CallingConv::C` instead of `CallingConv::Fast`. This
+  stabilizes the coroutine ABI across LLVM versions and aligns it with other
+  vendors. The change is observationally identical on targets where `fastcc`
+  and `ccc` agree for `void(ptr)` (x86_64, AArch64, RISC-V, ...) but is an ABI
+  break on i686, MIPS O32, PowerPC64 ELFv1, and Lanai.
+
 ### Changes to LLVM infrastructure
 
 * Removed ``Constant::isZeroValue``. It was functionally identical to

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to