[llvm] r246304 - [CodeGen] isInTailCallPosition didn't consider readnone tailcalls
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 28 10:16:50 PDT 2015
Test case? Also, I think you can do a more precise analysis here. We should
be able to tail call in this example:
i32* @f() {
%a = tail call i32* @foo_readnone()
store i32 0, i32* %b
ret i32* %a
}
I think in the readnone case you just need to check that the return value
is used by nothing more than the ReturnInst.
On Fri, Aug 28, 2015 at 9:44 AM, David Majnemer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: majnemer
> Date: Fri Aug 28 11:44:09 2015
> New Revision: 246304
>
> URL: http://llvm.org/viewvc/llvm-project?rev=246304&view=rev
> Log:
> [CodeGen] isInTailCallPosition didn't consider readnone tailcalls
>
> A readnone tailcall may still have a chain of computation which follows
> it that would invalidate a tailcall lowering. Don't skip the analysis
> in such cases.
>
> This fixes PR24613.
>
> Modified:
> llvm/trunk/lib/Analysis/ValueTracking.cpp
> llvm/trunk/lib/CodeGen/Analysis.cpp
>
> Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=246304&r1=246303&r2=246304&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
> +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Fri Aug 28 11:44:09 2015
> @@ -3147,7 +3147,8 @@ bool llvm::isSafeToSpeculativelyExecute(
> LI->getPointerOperand(), LI->getAlignment(), DL, CtxI, DT, TLI);
> }
> case Instruction::Call: {
> - if (cast<CallInst>(Inst)->doesNotAccessMemory())
> + auto *CI = cast<CallInst>(Inst);
> + if (CI->doesNotAccessMemory() && !CI->isMustTailCall())
> return true;
> return false; // The called function could have undefined behavior or
> // side-effects.
>
> Modified: llvm/trunk/lib/CodeGen/Analysis.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Analysis.cpp?rev=246304&r1=246303&r2=246304&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/Analysis.cpp (original)
> +++ llvm/trunk/lib/CodeGen/Analysis.cpp Fri Aug 28 11:44:09 2015
> @@ -506,18 +506,16 @@ bool llvm::isInTailCallPosition(Immutabl
>
> // If I will have a chain, make sure no other instruction that will
> have a
> // chain interposes between I and the return.
> - if (I->mayHaveSideEffects() || I->mayReadFromMemory() ||
> - !isSafeToSpeculativelyExecute(I))
> - for (BasicBlock::const_iterator BBI = std::prev(ExitBB->end(), 2);;
> --BBI) {
> - if (&*BBI == I)
> - break;
> - // Debug info intrinsics do not get in the way of tail call
> optimization.
> - if (isa<DbgInfoIntrinsic>(BBI))
> - continue;
> - if (BBI->mayHaveSideEffects() || BBI->mayReadFromMemory() ||
> - !isSafeToSpeculativelyExecute(BBI))
> - return false;
> - }
> + for (BasicBlock::const_iterator BBI = std::prev(ExitBB->end(), 2);;
> --BBI) {
> + if (&*BBI == I)
> + break;
> + // Debug info intrinsics do not get in the way of tail call
> optimization.
> + if (isa<DbgInfoIntrinsic>(BBI))
> + continue;
> + if (BBI->mayHaveSideEffects() || BBI->mayReadFromMemory() ||
> + !isSafeToSpeculativelyExecute(BBI))
> + return false;
> + }
>
> const Function *F = ExitBB->getParent();
> return returnTypeIsEligibleForTailCall(
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150828/93f93ffe/attachment.html>
More information about the llvm-commits
mailing list