aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Coroutines/CoroCleanup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Coroutines/CoroCleanup.cpp')
-rw-r--r--llvm/lib/Transforms/Coroutines/CoroCleanup.cpp25
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,