diff options
Diffstat (limited to 'llvm/lib/Transforms/Coroutines/CoroCleanup.cpp')
-rw-r--r-- | llvm/lib/Transforms/Coroutines/CoroCleanup.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
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, |