Skip to content

Commit

Permalink
[CodeGen] skip lifetime end marker in isInTailCallPosition
Browse files Browse the repository at this point in the history
A lifetime end intrinsic between a tail call and the return should not
prevent the call from being tail call optimized.

Differential Revision: https://reviews.llvm.org/D53519

llvm-svn: 345163
  • Loading branch information
Robert Lougher committed Oct 24, 2018
1 parent d1fe437 commit 18bfb3a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/lib/CodeGen/Analysis.cpp
Expand Up @@ -496,6 +496,10 @@ bool llvm::isInTailCallPosition(ImmutableCallSite CS, const TargetMachine &TM) {
// Debug info intrinsics do not get in the way of tail call optimization.
if (isa<DbgInfoIntrinsic>(BBI))
continue;
// A lifetime end intrinsic should not stop tail call optimization.
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(BBI))
if (II->getIntrinsicID() == Intrinsic::lifetime_end)
continue;
if (BBI->mayHaveSideEffects() || BBI->mayReadFromMemory() ||
!isSafeToSpeculativelyExecute(&*BBI))
return false;
Expand Down
27 changes: 27 additions & 0 deletions llvm/test/CodeGen/X86/tailcall-lifetime-end.ll
@@ -0,0 +1,27 @@
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -o - %s | FileCheck %s

; A lifetime end intrinsic should not prevent a call from being tail call
; optimized.

define void @foobar() {
; CHECK-LABEL: foobar
; CHECK: pushq %rax
; CHECK: leaq 4(%rsp), %rdi
; CHECK: callq foo
; CHECK: popq %rax
; CHECK: jmp bar
entry:
%i = alloca i32
%0 = bitcast i32* %i to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0)
call void @foo(i32* nonnull %i)
tail call void @bar()
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0)
ret void
}

declare void @foo(i32* nocapture %p)
declare void @bar()

declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)

0 comments on commit 18bfb3a

Please sign in to comment.