Skip to content

Commit dc0bd0a

Browse files
committed
Make use of uniqueness of coro.promise
1 parent cb7bb71 commit dc0bd0a

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

llvm/include/llvm/Transforms/Coroutines/CoroShape.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ struct Shape {
8080
// Scan the function and collect the above intrinsics for later processing
8181
void analyze(Function &F, SmallVectorImpl<CoroFrameInst *> &CoroFrames,
8282
SmallVectorImpl<CoroSaveInst *> &UnusedCoroSaves,
83-
SmallVectorImpl<CoroPromiseInst *> &CoroPromises);
83+
CoroPromiseInst *&CoroPromise);
8484
// If for some reason, we were not able to find coro.begin, bailout.
8585
void invalidateCoroutine(Function &F,
8686
SmallVectorImpl<CoroFrameInst *> &CoroFrames);
@@ -89,7 +89,7 @@ struct Shape {
8989
// Remove orphaned and unnecessary intrinsics
9090
void cleanCoroutine(SmallVectorImpl<CoroFrameInst *> &CoroFrames,
9191
SmallVectorImpl<CoroSaveInst *> &UnusedCoroSaves,
92-
SmallVectorImpl<CoroPromiseInst *> &CoroPromises);
92+
CoroPromiseInst *CoroPromise);
9393

9494
// Field indexes for special fields in the switch lowering.
9595
struct SwitchFieldIndex {
@@ -267,14 +267,14 @@ struct Shape {
267267
explicit Shape(Function &F) {
268268
SmallVector<CoroFrameInst *, 8> CoroFrames;
269269
SmallVector<CoroSaveInst *, 2> UnusedCoroSaves;
270-
SmallVector<CoroPromiseInst *, 2> CoroPromises;
270+
CoroPromiseInst * CoroPromise = nullptr;
271271

272-
analyze(F, CoroFrames, UnusedCoroSaves, CoroPromises);
272+
analyze(F, CoroFrames, UnusedCoroSaves, CoroPromise);
273273
if (!CoroBegin) {
274274
invalidateCoroutine(F, CoroFrames);
275275
return;
276276
}
277-
cleanCoroutine(CoroFrames, UnusedCoroSaves, CoroPromises);
277+
cleanCoroutine(CoroFrames, UnusedCoroSaves, CoroPromise);
278278
}
279279
};
280280

llvm/lib/Transforms/Coroutines/Coroutines.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ static CoroSaveInst *createCoroSave(CoroBeginInst *CoroBegin,
193193
void coro::Shape::analyze(Function &F,
194194
SmallVectorImpl<CoroFrameInst *> &CoroFrames,
195195
SmallVectorImpl<CoroSaveInst *> &UnusedCoroSaves,
196-
SmallVectorImpl<CoroPromiseInst *> &CoroPromises) {
196+
CoroPromiseInst *&CoroPromise) {
197197
clear();
198198

199199
bool HasFinalSuspend = false;
@@ -288,7 +288,7 @@ void coro::Shape::analyze(Function &F,
288288
}
289289
break;
290290
case Intrinsic::coro_promise:
291-
CoroPromises.push_back(cast<CoroPromiseInst>(II));
291+
CoroPromise = cast<CoroPromiseInst>(II);
292292
break;
293293
}
294294
}
@@ -481,8 +481,7 @@ void coro::AnyRetconABI::init() {
481481

482482
void coro::Shape::cleanCoroutine(
483483
SmallVectorImpl<CoroFrameInst *> &CoroFrames,
484-
SmallVectorImpl<CoroSaveInst *> &UnusedCoroSaves,
485-
SmallVectorImpl<CoroPromiseInst *> &CoroPromises) {
484+
SmallVectorImpl<CoroSaveInst *> &UnusedCoroSaves, CoroPromiseInst *PI) {
486485
// The coro.frame intrinsic is always lowered to the result of coro.begin.
487486
for (CoroFrameInst *CF : CoroFrames) {
488487
CF->replaceAllUsesWith(CoroBegin);
@@ -495,10 +494,10 @@ void coro::Shape::cleanCoroutine(
495494
CoroSave->eraseFromParent();
496495
UnusedCoroSaves.clear();
497496

498-
auto *AI = getPromiseAlloca();
499-
for (auto *PI : CoroPromises) {
500-
PI->replaceAllUsesWith(PI->isFromPromise() ? cast<Value>(CoroBegin)
501-
: cast<Value>(AI));
497+
if (PI) {
498+
PI->replaceAllUsesWith(PI->isFromPromise()
499+
? cast<Value>(CoroBegin)
500+
: cast<Value>(getPromiseAlloca()));
502501
PI->eraseFromParent();
503502
}
504503
}

llvm/test/Transforms/Coroutines/gh105595.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ resume:
1818
br label %suspend
1919

2020
suspend:
21-
call i1 @llvm.coro.end(ptr null, i1 false, token none)
2221
; load value when resume
2322
; CHECK: %null = load ptr, ptr %promise.addr, align 8
2423
%null = load ptr, ptr %__promise, align 8

0 commit comments

Comments
 (0)