Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CodeGen] skip lifetime end marker in isInTailCallPosition
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
Showing
2 changed files
with
31 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |