diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-02-11 12:38:04 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-02-11 12:38:11 +0000 |
commit | e3b557809604d036af6e00c60f012c2025b59a5e (patch) | |
tree | 8a11ba2269a3b669601e2fd41145b174008f4da8 /llvm/lib/Transforms/Coroutines/Coroutines.cpp | |
parent | 08e8dd7b9db7bb4a9de26d44c1cbfd24e869c014 (diff) |
Diffstat (limited to 'llvm/lib/Transforms/Coroutines/Coroutines.cpp')
-rw-r--r-- | llvm/lib/Transforms/Coroutines/Coroutines.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Coroutines/Coroutines.cpp b/llvm/lib/Transforms/Coroutines/Coroutines.cpp index 1742e9319c3b..ce4262e593b6 100644 --- a/llvm/lib/Transforms/Coroutines/Coroutines.cpp +++ b/llvm/lib/Transforms/Coroutines/Coroutines.cpp @@ -171,6 +171,7 @@ static CoroSaveInst *createCoroSave(CoroBeginInst *CoroBegin, // Collect "interesting" coroutine intrinsics. void coro::Shape::buildFrom(Function &F) { bool HasFinalSuspend = false; + bool HasUnwindCoroEnd = false; size_t FinalSuspendIndex = 0; clear(*this); SmallVector<CoroFrameInst *, 8> CoroFrames; @@ -242,6 +243,10 @@ void coro::Shape::buildFrom(Function &F) { if (auto *AsyncEnd = dyn_cast<CoroAsyncEndInst>(II)) { AsyncEnd->checkWellFormed(); } + + if (CoroEnds.back()->isUnwind()) + HasUnwindCoroEnd = true; + if (CoroEnds.back()->isFallthrough() && isa<CoroEndInst>(II)) { // Make sure that the fallthrough coro.end is the first element in the // CoroEnds vector. @@ -290,11 +295,12 @@ void coro::Shape::buildFrom(Function &F) { auto SwitchId = cast<CoroIdInst>(Id); this->ABI = coro::ABI::Switch; this->SwitchLowering.HasFinalSuspend = HasFinalSuspend; + this->SwitchLowering.HasUnwindCoroEnd = HasUnwindCoroEnd; this->SwitchLowering.ResumeSwitch = nullptr; this->SwitchLowering.PromiseAlloca = SwitchId->getPromise(); this->SwitchLowering.ResumeEntryBlock = nullptr; - for (auto AnySuspend : CoroSuspends) { + for (auto *AnySuspend : CoroSuspends) { auto Suspend = dyn_cast<CoroSuspendInst>(AnySuspend); if (!Suspend) { #ifndef NDEBUG @@ -340,7 +346,7 @@ void coro::Shape::buildFrom(Function &F) { auto ResultTys = getRetconResultTypes(); auto ResumeTys = getRetconResumeTypes(); - for (auto AnySuspend : CoroSuspends) { + for (auto *AnySuspend : CoroSuspends) { auto Suspend = dyn_cast<CoroSuspendRetconInst>(AnySuspend); if (!Suspend) { #ifndef NDEBUG |