================
@@ -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

Reply via email to