[llvm] 01b4890 - Add @llvm.coro.async.size.replace intrinsic.
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 23 06:47:17 PST 2021
Missing langref changes.
On Tue, Feb 23, 2021 at 5:45 PM Arnold Schwaighofer via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Nate Chandler
> Date: 2021-02-23T06:43:52-08:00
> New Revision: 01b4890e47f0988695e68ea4e1fd6961b645ee73
>
> URL: https://github.com/llvm/llvm-project/commit/01b4890e47f0988695e68ea4e1fd6961b645ee73
> DIFF: https://github.com/llvm/llvm-project/commit/01b4890e47f0988695e68ea4e1fd6961b645ee73.diff
>
> LOG: Add @llvm.coro.async.size.replace intrinsic.
>
> The new intrinsic replaces the size in one specified AsyncFunctionPointer with
> the size in another. This ability is necessary for functions which merely
> forward to async functions such as those defined for partial applications.
>
> Reviewed By: aschwaighofer
>
> Differential Revision: https://reviews.llvm.org/D97229
>
> Added:
>
>
> Modified:
> llvm/include/llvm/IR/Intrinsics.td
> llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
> llvm/lib/Transforms/Coroutines/CoroInstr.h
> llvm/lib/Transforms/Coroutines/Coroutines.cpp
> llvm/test/Transforms/Coroutines/coro-async.ll
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
> index 99e18d001100..582fe613f75c 100644
> --- a/llvm/include/llvm/IR/Intrinsics.td
> +++ b/llvm/include/llvm/IR/Intrinsics.td
> @@ -1216,6 +1216,7 @@ def int_coro_async_context_dealloc : Intrinsic<[],
> def int_coro_async_resume : Intrinsic<[llvm_ptr_ty],
> [],
> []>;
> +def int_coro_async_size_replace : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty], []>;
> def int_coro_suspend_async
> : Intrinsic<[llvm_any_ty], [llvm_ptr_ty, llvm_ptr_ty, llvm_vararg_ty], []>;
> def int_coro_prepare_async : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty],
>
> diff --git a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
> index 298149f8b546..5b09cdb35791 100644
> --- a/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
> +++ b/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
> @@ -80,6 +80,23 @@ bool Lowerer::lowerRemainingCoroIntrinsics(Function &F) {
> case Intrinsic::coro_subfn_addr:
> lowerSubFn(Builder, cast<CoroSubFnInst>(II));
> break;
> + case Intrinsic::coro_async_size_replace:
> + auto *Target = cast<ConstantStruct>(
> + cast<GlobalVariable>(II->getArgOperand(0)->stripPointerCasts())
> + ->getInitializer());
> + auto *Source = cast<ConstantStruct>(
> + cast<GlobalVariable>(II->getArgOperand(1)->stripPointerCasts())
> + ->getInitializer());
> + auto *TargetSize = Target->getOperand(1);
> + auto *SourceSize = Source->getOperand(1);
> + if (TargetSize->isElementWiseEqual(SourceSize)) {
> + break;
> + }
> + auto *TargetRelativeFunOffset = Target->getOperand(0);
> + auto *NewFuncPtrStruct = ConstantStruct::get(
> + Target->getType(), TargetRelativeFunOffset, SourceSize);
> + Target->replaceAllUsesWith(NewFuncPtrStruct);
> + break;
> }
> II->eraseFromParent();
> Changed = true;
> @@ -95,10 +112,10 @@ bool Lowerer::lowerRemainingCoroIntrinsics(Function &F) {
> }
>
> static bool declaresCoroCleanupIntrinsics(const Module &M) {
> - return coro::declaresIntrinsics(M, {"llvm.coro.alloc", "llvm.coro.begin",
> - "llvm.coro.subfn.addr", "llvm.coro.free",
> - "llvm.coro.id", "llvm.coro.id.retcon",
> - "llvm.coro.id.retcon.once"});
> + return coro::declaresIntrinsics(
> + M, {"llvm.coro.alloc", "llvm.coro.begin", "llvm.coro.subfn.addr",
> + "llvm.coro.free", "llvm.coro.id", "llvm.coro.id.retcon",
> + "llvm.coro.id.retcon.once", "llvm.coro.async.size.replace"});
> }
>
> PreservedAnalyses CoroCleanupPass::run(Function &F,
>
> diff --git a/llvm/lib/Transforms/Coroutines/CoroInstr.h b/llvm/lib/Transforms/Coroutines/CoroInstr.h
> index 9fa2fd12f80b..7f6e95f48b9c 100644
> --- a/llvm/lib/Transforms/Coroutines/CoroInstr.h
> +++ b/llvm/lib/Transforms/Coroutines/CoroInstr.h
> @@ -376,6 +376,18 @@ class LLVM_LIBRARY_VISIBILITY CoroAsyncResumeInst : public IntrinsicInst {
> }
> };
>
> +/// This represents the llvm.coro.async.size.replace instruction.
> +class LLVM_LIBRARY_VISIBILITY CoroAsyncSizeReplace : 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_async_size_replace;
> + }
> + static bool classof(const Value *V) {
> + return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
> + }
> +};
> +
> /// This represents the llvm.coro.frame instruction.
> class LLVM_LIBRARY_VISIBILITY CoroFrameInst : public IntrinsicInst {
> public:
>
> diff --git a/llvm/lib/Transforms/Coroutines/Coroutines.cpp b/llvm/lib/Transforms/Coroutines/Coroutines.cpp
> index 3b2b3c6ee1a3..e35875b476f5 100644
> --- a/llvm/lib/Transforms/Coroutines/Coroutines.cpp
> +++ b/llvm/lib/Transforms/Coroutines/Coroutines.cpp
> @@ -126,6 +126,7 @@ static bool isCoroutineIntrinsicName(StringRef Name) {
> "llvm.coro.alloc",
> "llvm.coro.async.context.alloc",
> "llvm.coro.async.context.dealloc",
> + "llvm.coro.async.size.replace",
> "llvm.coro.async.store_resume",
> "llvm.coro.begin",
> "llvm.coro.destroy",
>
> diff --git a/llvm/test/Transforms/Coroutines/coro-async.ll b/llvm/test/Transforms/Coroutines/coro-async.ll
> index aa834052d1ac..fb00a47fdd07 100644
> --- a/llvm/test/Transforms/Coroutines/coro-async.ll
> +++ b/llvm/test/Transforms/Coroutines/coro-async.ll
> @@ -27,6 +27,15 @@ declare void @my_other_async_function(i8* %async.ctxt)
> to i32),
> i32 128 ; Initial async context size without space for frame
> }>
> + at my_async_function_pa_fp = constant <{ i32, i32 }>
> + <{ i32 trunc (
> + i64 sub (
> + i64 ptrtoint (void (i8*, %async.task*, %async.actor*)* @my_async_function_pa to i64),
> + i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32 }>, <{ i32, i32 }>* @my_async_function_pa_fp, i32 0, i32 1) to i64)
> + )
> + to i32),
> + i32 8
> +}>
>
> ; Function that implements the dispatch to the callee function.
> define swiftcc void @my_async_function.my_other_async_function_fp.apply(i8* %fnPtr, i8* %async.ctxt, %async.task* %task, %async.actor* %actor) {
> @@ -99,8 +108,15 @@ entry:
> unreachable
> }
>
> +define void @my_async_function_pa(i8* %ctxt, %async.task* %task, %async.actor* %actor) {
> + call void @llvm.coro.async.size.replace(i8* bitcast (<{i32, i32}>* @my_async_function_pa_fp to i8*), i8* bitcast (<{i32, i32}>* @my_async_function_fp to i8*))
> + call swiftcc void @my_async_function(i8* %ctxt, %async.task* %task, %async.actor* %actor)
> + ret void
> +}
> +
> ; Make sure we update the async function pointer
> ; CHECK: @my_async_function_fp = constant <{ i32, i32 }> <{ {{.*}}, i32 176 }
> +; CHECK: @my_async_function_pa_fp = constant <{ i32, i32 }> <{ {{.*}}, i32 176 }
> ; CHECK: @my_async_function2_fp = constant <{ i32, i32 }> <{ {{.*}}, i32 176 }
>
> ; CHECK-LABEL: define swiftcc void @my_async_function(i8* %async.ctxt, %async.task* %task, %async.actor* %actor) {
> @@ -511,3 +527,4 @@ declare void @llvm.coro.async.context.dealloc(i8*)
> declare swiftcc void @asyncReturn(i8*, %async.task*, %async.actor*)
> declare swiftcc void @asyncSuspend(i8*, %async.task*, %async.actor*)
> declare i8* @llvm.coro.async.resume()
> +declare void @llvm.coro.async.size.replace(i8*, i8*)
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list