mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
03bc2a070d
Summary: If the only use of a value is a start or end lifetime intrinsic then mark the intrinsic as trivially dead. This should allow for that value to then be removed as well. Currently, this only works for allocas, globals, and arguments. Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D79355
31 lines
1.0 KiB
LLVM
31 lines
1.0 KiB
LLVM
; RUN: opt < %s -instcombine -instcombine-infinite-loop-threshold=3 -S | FileCheck %s
|
|
|
|
%struct.__va_list = type { i8*, i8*, i8*, i32, i32 }
|
|
|
|
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
|
|
declare void @llvm.lifetime.end.p0i8(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.p0i8(i64 32, i8* %0)
|
|
call void @llvm.va_start(i8* %0)
|
|
call void @llvm.lifetime.start.p0i8(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.p0i8(i64 32, i8* %1)
|
|
call void @llvm.va_end(i8* %0)
|
|
call void @llvm.lifetime.end.p0i8(i64 32, i8* %0)
|
|
ret i32 0
|
|
}
|
|
|