Skip to content

Commit d2e1a8d

Browse files
committed
Do not emit lifetime intrinsics for coro promise alloca
1 parent 9f77c26 commit d2e1a8d

File tree

3 files changed

+6
-4
lines changed

3 files changed

+6
-4
lines changed

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,11 @@ llvm::Value *CodeGenFunction::EmitLifetimeStart(llvm::TypeSize Size,
13431343
if (!ShouldEmitLifetimeMarkers)
13441344
return nullptr;
13451345

1346+
// No lifetimes on promise alloca, or middle end passes will assume promise
1347+
// dead after lifetime.end, leading to mis-optimization
1348+
if (Addr->getName() == "__promise")
1349+
return nullptr;
1350+
13461351
assert(Addr->getType()->getPointerAddressSpace() ==
13471352
CGM.getDataLayout().getAllocaAddrSpace() &&
13481353
"Pointer should be in alloca address space");

clang/test/CodeGenCoroutines/coro-params.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ void f(int val, MoveOnly moParam, MoveAndCopy mcParam, TrivialABI trivialParam)
8484
// CHECK-NEXT: call void @_ZN11MoveAndCopyC1EOS_(ptr {{[^,]*}} %[[McCopy]], ptr noundef nonnull align 4 dereferenceable(4) %[[McParam]]) #
8585
// CHECK-NEXT: call void @llvm.lifetime.start.p0(
8686
// CHECK-NEXT: call void @_ZN10TrivialABIC1EOS_(ptr {{[^,]*}} %[[TrivialCopy]], ptr {{[^,]*}} %[[TrivialAlloca]])
87-
// CHECK-NEXT: call void @llvm.lifetime.start.p0(
8887
// CHECK-NEXT: invoke void @_ZNSt16coroutine_traitsIJvi8MoveOnly11MoveAndCopy10TrivialABIEE12promise_typeC1Ev(
8988

9089
// CHECK: call void @_ZN14suspend_always12await_resumeEv(
@@ -106,7 +105,6 @@ void f(int val, MoveOnly moParam, MoveAndCopy mcParam, TrivialABI trivialParam)
106105

107106
// Destroy promise, then parameter copies:
108107
// CHECK: call void @_ZNSt16coroutine_traitsIJvi8MoveOnly11MoveAndCopy10TrivialABIEE12promise_typeD1Ev(ptr {{[^,]*}} %__promise)
109-
// CHECK-NEXT: call void @llvm.lifetime.end.p0(
110108
// CHECK-NEXT: call void @_ZN10TrivialABID1Ev(ptr {{[^,]*}} %[[TrivialCopy]])
111109
// CHECK-NEXT: call void @llvm.lifetime.end.p0(
112110
// CHECK-NEXT: call void @_ZN11MoveAndCopyD1Ev(ptr {{[^,]*}} %[[McCopy]])
@@ -135,7 +133,6 @@ void dependent_params(T x, U, U y) {
135133
// CHECK-NEXT: call void @_ZN1BC1EOS_(ptr {{[^,]*}} %[[unnamed_copy]], ptr noundef nonnull align 4 dereferenceable(512) %0)
136134
// CHECK-NEXT: call void @llvm.lifetime.start.p0(
137135
// CHECK-NEXT: call void @_ZN1BC1EOS_(ptr {{[^,]*}} %[[y_copy]], ptr noundef nonnull align 4 dereferenceable(512) %y)
138-
// CHECK-NEXT: call void @llvm.lifetime.start.p0(
139136
// CHECK-NEXT: invoke void @_ZNSt16coroutine_traitsIJv1A1BS1_EE12promise_typeC1Ev(
140137

141138
co_return;

clang/test/CodeGenCoroutines/coro-suspend-cleanups.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ coroutine ArrayInitCoro() {
5252
// CHECK-NEXT: store ptr %arrayinit.element, ptr %arrayinit.endOfInit.reload.addr, align 8
5353
co_await Awaiter{}
5454
// CHECK-NEXT: @_ZNSt14suspend_always11await_readyEv
55-
// CHECK-NEXT: br i1 %{{.+}}, label %await.ready, label %CoroSave30
55+
// CHECK-NEXT: br i1 %{{.+}}, label %await.ready, label %CoroSave29
5656
};
5757
// CHECK: await.cleanup: ; preds = %AfterCoroSuspend{{.*}}
5858
// CHECK-NEXT: br label %cleanup{{.*}}.from.await.cleanup

0 commit comments

Comments
 (0)