llvm/test/Transforms/DeadArgElim/variadic_safety.ll
Tim Northover d84b17e157 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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183625 91177308-0d34-0410-b5e6-96231b3b80d8
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)
}