1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-24 05:23:45 +02:00
llvm-mirror/test/Transforms/InstCombine/vararg.ll
Arnaud A. de Grandmaison 6c99fa9cb1 [InstCombine] Remove trivially empty va_start/va_end and va_copy/va_end ranges.
When a va_start or va_copy is immediately followed by a va_end (ignoring
debug information or other start/end in between), then it is safe to
remove the pair. As this code shares some commonalities with the lifetime
markers, this has been factored to helper functions.

This InstCombine pattern kicks-in 3 times when running the LLVM test
suite.

llvm-svn: 269033
2016-05-10 09:24:49 +00:00

31 lines
960 B
LLVM

; RUN: opt < %s -instcombine -S | FileCheck %s
%struct.__va_list = type { i8*, i8*, i8*, i32, i32 }
declare void @llvm.lifetime.start(i64, i8* nocapture)
declare void @llvm.lifetime.end(i64, i8* nocapture)
declare void @llvm.va_start(i8*)
declare void @llvm.va_end(i8*)
declare void @llvm.va_copy(i8*, i8*)
define i32 @func(i8* nocapture readnone %fmt, ...) {
; CHECK-LABEL: @func(
; CHECK: entry:
; CHECK-NEXT: ret i32 0
entry:
%va0 = alloca %struct.__va_list, align 8
%va1 = alloca %struct.__va_list, align 8
%0 = bitcast %struct.__va_list* %va0 to i8*
%1 = bitcast %struct.__va_list* %va1 to i8*
call void @llvm.lifetime.start(i64 32, i8* %0)
call void @llvm.va_start(i8* %0)
call void @llvm.lifetime.start(i64 32, i8* %1)
call void @llvm.va_copy(i8* %1, i8* %0)
call void @llvm.va_end(i8* %1)
call void @llvm.lifetime.end(i64 32, i8* %1)
call void @llvm.va_end(i8* %0)
call void @llvm.lifetime.end(i64 32, i8* %0)
ret i32 0
}