1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00
llvm-mirror/test/Transforms/DeadArgElim/variadic_safety.ll
Tim Northover 19b3dd0c42 Make DeadArgumentElimination more conservative on variadic functions
Variadic functions are particularly fragile in the face of ABI changes, so this
limits how much the pass changes them

llvm-svn: 183625
2013-06-09 02:17:27 +00:00

39 lines
1.2 KiB
LLVM

; RUN: opt < %s -deadargelim -S | FileCheck %s
declare void @llvm.va_start(i8*)
define internal i32 @va_func(i32 %a, i32 %b, ...) {
%valist = alloca i8
call void @llvm.va_start(i8* %valist)
ret i32 %b
}
; Function derived from AArch64 ABI, where 8 integer arguments go in
; registers but the 9th goes on the stack. We really don't want to put
; just 7 args in registers and then start on the stack since any
; va_arg implementation already present in va_func won't be expecting
; it.
define i32 @call_va(i32 %in) {
%stacked = alloca i32
store i32 42, i32* %stacked
%res = call i32(i32, i32, ...)* @va_func(i32 %in, i32 %in, [6 x i32] undef, i32* byval %stacked)
ret i32 %res
; CHECK: call i32 (i32, i32, ...)* @va_func(i32 undef, i32 %in, [6 x i32] undef, i32* byval %stacked)
}
define internal i32 @va_deadret_func(i32 %a, i32 %b, ...) {
%valist = alloca i8
call void @llvm.va_start(i8* %valist)
ret i32 %a
}
define void @call_deadret(i32 %in) {
%stacked = alloca i32
store i32 42, i32* %stacked
call i32 (i32, i32, ...)* @va_deadret_func(i32 undef, i32 %in, [6 x i32] undef, i32* byval %stacked)
ret void
; CHECK: call void (i32, i32, ...)* @va_deadret_func(i32 undef, i32 undef, [6 x i32] undef, i32* byval %stacked)
}