================
@@ -1056,6 +1083,25 @@ void CoroCloner::create() {
   // Set up the new entry block.
   replaceEntryBlock();
 
+  // Turn symmetric transfers into musttail calls.
+  for (CallInst *ResumeCall : Shape.SymmetricTransfers) {
+    ResumeCall = cast<CallInst>(VMap[ResumeCall]);
+    ResumeCall->setCallingConv(NewF->getCallingConv());
+    if (TTI.supportsTailCallFor(ResumeCall)) {
+      // FIXME: Could we support symmetric transfer effectively without
+      // musttail?
+      ResumeCall->setTailCallKind(CallInst::TCK_MustTail);
+    }
+
+    // Put a 'ret void' after the call, and split any remaining instructions to
----------------
zmodem wrote:

I want the semantics to be well specified. Either the doc for this intrinsic 
should say that instructions between it and `llvm.coro.suspend` are not allowed 
(possibly with a list of exceptions) and we enforce it with an assert or the 
verifier; or it allows such instructions but says that they become unreachable 
as in the current version.

I'm in favor of the latter because it makes the IR more regular. We generally 
don't impose restrictions about what instructions are allowed between intrinsic 
calls. Instructions after a call not getting executed is not new, so I think 
what the current version of the patch does fits in well with the IR.

https://github.com/llvm/llvm-project/pull/89751
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to