[llvm] [CGP] Consider arguments and ret values in `dupRetToEnableTailCallOpts` (PR #76613)
David Li via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 15 10:22:52 PST 2024
================
@@ -2621,8 +2622,36 @@ bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB,
// Make sure the phi value is indeed produced by the tail call.
if (CI && CI->hasOneUse() && CI->getParent() == PredBB &&
TLI->mayBeEmittedAsTailCall(CI) &&
- attributesPermitTailCall(F, CI, RetI, *TLI))
+ attributesPermitTailCall(F, CI, RetI, *TLI)) {
TailCallBBs.push_back(PredBB);
+ } else {
+ /// Consider the cases in which the phi value is indirectly produced by
+ /// the tail call, for example when encountering memset(), memmove(),
+ /// whose return value may have been optimized out.
+ /// @code
+ /// bb0:
+ /// tail call void @llvm.memset.p0.i64()
+ /// br label %return
+ /// @endcode
+ if (PredBB && PredBB->getSingleSuccessor() == BB)
+ CI = dyn_cast_or_null<CallInst>(
+ PredBB->getTerminator()->getPrevNonDebugInstruction(true));
+
+ // If we return void from the call site, it must be an intrinsic.
+ if (CI && CI->getType()->isVoidTy() && !isa<IntrinsicInst>(CI))
----------------
david-xl wrote:
Is there a need to check which arg is fed to the phi and returned? The arg needs to be the real return value of the lowered function call?
https://github.com/llvm/llvm-project/pull/76613
More information about the llvm-commits
mailing list