================
@@ -768,6 +779,41 @@ struct GetReturnObjectManager {
CGF.EmitAutoVarInit(GroEmission);
Builder.CreateStore(Builder.getTrue(), GroActiveFlag);
}
+
+ void EmitGroConv() {
+ // GRO conversion is unnecessary when get_return_object's type matches the
+ // coroutine return type.
+ if (DirectEmit)
+ return;
+
+ auto *InsertPt = Builder.GetInsertBlock();
+ auto *PreConvBB = CGF.CurCoro.Data->SuspendBB;
+ auto *AfterConvBB =
+ CGF.createBasicBlock("after.gro.conv", CGF.CurFn, InsertPt);
+ Builder.SetInsertPoint(AfterConvBB);
+ BasicBlock *AfterFinalBB = InsertPt->getSinglePredecessor();
+ InsertPt->replaceAllUsesWith(PreConvBB);
+ Builder.CreateBr(InsertPt);
+
+ auto *ConvBB = CGF.createBasicBlock("gro.conv", CGF.CurFn, AfterConvBB);
+ Builder.SetInsertPoint(ConvBB);
+ Builder.CreateBr(AfterConvBB);
+
+ CGF.EmitBlock(PreConvBB);
+ PreConvBB->moveBefore(ConvBB);
+ auto *BodyDone =
+ Builder.CreatePHI(Builder.getInt1Ty(), llvm::pred_size(PreConvBB));
+ for (auto *Pred : llvm::predecessors(PreConvBB)) {
+ auto *V = (Pred == AfterFinalBB) ? Builder.getTrue() :
Builder.getFalse();
+ BodyDone->addIncoming(V, Pred);
+ }
----------------
ChuanqiXu9 wrote:
Add a comment to explain the intention of BodyDone. And similarly add it to
CurCoroData.
https://github.com/llvm/llvm-project/pull/151067
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits