diff --git a/lib/Transforms/Coroutines/CoroSplit.cpp b/lib/Transforms/Coroutines/CoroSplit.cpp index 402066cd36f..c73bc5df63f 100644 --- a/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/lib/Transforms/Coroutines/CoroSplit.cpp @@ -913,6 +913,21 @@ void CoroCloner::create() { Shape.FrameSize, Shape.FrameAlign); break; case coro::ABI::Async: { + auto *ActiveAsyncSuspend = cast(ActiveSuspend); + if (OrigF.hasParamAttribute(Shape.AsyncLowering.ContextArgNo, + Attribute::SwiftAsync)) { + uint32_t ArgAttributeIndices = + ActiveAsyncSuspend->getStorageArgumentIndex(); + auto ContextArgIndex = ArgAttributeIndices & 0xff; + addAsyncContextAttrs(NewAttrs, Context, ContextArgIndex); + + // `swiftasync` must preceed `swiftself` so 0 is not a valid index for + // `swiftself`. + auto SwiftSelfIndex = ArgAttributeIndices >> 8; + if (SwiftSelfIndex) + addSwiftSelfAttrs(NewAttrs, Context, SwiftSelfIndex); + } + // Transfer the original function's attributes. auto FnAttrs = OrigF.getAttributes().getFnAttributes(); NewAttrs = @@ -952,24 +967,9 @@ void CoroCloner::create() { // followed by a return. // Don't change returns to unreachable because that will trip up the verifier. // These returns should be unreachable from the clone. - case coro::ABI::Async: { - auto *ActiveAsyncSuspend = cast(ActiveSuspend); - if (OrigF.hasParamAttribute(Shape.AsyncLowering.ContextArgNo, - Attribute::SwiftAsync)) { - uint32_t ArgAttributeIndices = - ActiveAsyncSuspend->getStorageArgumentIndex(); - auto ContextArgIndex = ArgAttributeIndices & 0xff; - addAsyncContextAttrs(NewAttrs, Context, ContextArgIndex); - - // `swiftasync` must preceed `swiftself` so 0 is not a valid index for - // `swiftself`. - auto SwiftSelfIndex = ArgAttributeIndices >> 8; - if (SwiftSelfIndex) - addSwiftSelfAttrs(NewAttrs, Context, SwiftSelfIndex); - } + case coro::ABI::Async: break; } - } NewF->setAttributes(NewAttrs); NewF->setCallingConv(Shape.getResumeFunctionCC());