================
@@ -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
----------------
mtrofin wrote:

> But in that case the problem was kind of the opposite, right? Instructions 
> between the resume and suspend blocked the musttail optimization. The problem 
> was not whether those instructions would have been executed or not, but that 
> they were inserted in a place where it wasn't allowed due to special 
> constraints on this intrinsic.
> The idea with my patch is to eliminate that problem by not having special 
> restrictions about instructions after the intrinsic, they just won't be 
> executed because control continues in the resumed function and doesn't come 
> back.

I think I see where the disconnect comes from. You're referring to the desired 
outcome for coro: tailcalls being ensured. I agree with that, but I'm concerned 
with maintenance: suppose some other pass does what PGOInstrument did, in the 
future. Just like with coro, the potential for a undesired interaction between 
coro and their pass isn't known to them. How easy would it be to discover they 
made incorrect assumptions in their pass, diagnose and fix?

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