mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-26 14:33:02 +02:00
6c99fa9cb1
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
31 lines
960 B
LLVM
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
|
|
}
|
|
|