[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