mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
6e852d9c3d
Summary: Calls marked 'tail' cannot read or write allocas from the current frame because the current frame might be destroyed by the time they run. However, a tail call may use an alloca with byval. Calling with byval copies the contents of the alloca into argument registers or stack slots, so there is no lifetime issue. Tail calls never modify allocas, so we can return just ModRefInfo::Ref. Fixes PR38466, a longstanding bug. Reviewers: hfinkel, nlewycky, gbiv, george.burgess.iv Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D50679 llvm-svn: 339636
24 lines
725 B
LLVM
24 lines
725 B
LLVM
; RUN: opt -dse -S < %s | FileCheck %s
|
|
|
|
; Don't eliminate stores to allocas before tail calls to functions that use
|
|
; byval. It's correct to mark calls like these as 'tail'. To implement this tail
|
|
; call, the backend should copy the bytes from the alloca into the argument area
|
|
; before clearing the stack.
|
|
|
|
target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
|
|
target triple = "i386-unknown-linux-gnu"
|
|
|
|
declare void @g(i32* byval %p)
|
|
|
|
define void @f(i32* byval %x) {
|
|
entry:
|
|
%p = alloca i32
|
|
%v = load i32, i32* %x
|
|
store i32 %v, i32* %p
|
|
tail call void @g(i32* byval %p)
|
|
ret void
|
|
}
|
|
; CHECK-LABEL: define void @f(i32* byval %x)
|
|
; CHECK: store i32 %v, i32* %p
|
|
; CHECK: tail call void @g(i32* byval %p)
|