1+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 
12; RUN: opt < %s -passes=instcombine -S | FileCheck %s 
23
34%struct.__va_list  = type  { ptr , ptr , ptr , i32 , i32  }
45
5- declare  void  @llvm.lifetime.start.p0 (i64 , ptr  nocapture )
6- declare  void  @llvm.lifetime.end.p0 (i64 , ptr  nocapture )
7- declare  void  @llvm.va_start (ptr )
8- declare  void  @llvm.va_end (ptr )
9- declare  void  @llvm.va_copy (ptr , ptr )
10- 
11- define  i32  @func (ptr  nocapture  readnone  %fmt , ...) {
12- ; CHECK-LABEL: @func( 
13- ; CHECK: entry: 
14- ; CHECK-NEXT: ret i32 0 
6+ define  void  @func (ptr  nocapture  readnone  %fmt , ...) {
7+ ; CHECK-LABEL: define void @func( 
8+ ; CHECK-SAME: ptr readnone captures(none) [[FMT:%.*]], ...) { 
9+ ; CHECK-NEXT:  [[ENTRY:.*:]] 
10+ ; CHECK-NEXT:    ret void 
11+ ; 
1512entry:
1613  %va0  = alloca  %struct.__va_list , align  8 
1714  %va1  = alloca  %struct.__va_list , align  8 
@@ -23,6 +20,39 @@ entry:
2320  call  void  @llvm.lifetime.end.p0 (i64  32 , ptr  %va1 )
2421  call  void  @llvm.va_end (ptr  %va0 )
2522  call  void  @llvm.lifetime.end.p0 (i64  32 , ptr  %va0 )
26-   ret  i32   0 
23+   ret  void 
2724}
2825
26+ declare  void  @callee (ptr )
27+ 
28+ define  void  @func_destroy_copy_src (ptr  nocapture  readnone  %fmt , ...) {
29+ ; CHECK-LABEL: define void @func_destroy_copy_src( 
30+ ; CHECK-SAME: ptr readnone captures(none) [[FMT:%.*]], ...) { 
31+ ; CHECK-NEXT:  [[ENTRY:.*:]] 
32+ ; CHECK-NEXT:    [[VA0:%.*]] = alloca [[STRUCT___VA_LIST:%.*]], align 8 
33+ ; CHECK-NEXT:    [[VA1:%.*]] = alloca [[STRUCT___VA_LIST]], align 8 
34+ ; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 32, ptr nonnull [[VA0]]) 
35+ ; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 32, ptr nonnull [[VA1]]) 
36+ ; CHECK-NEXT:    call void @llvm.va_start.p0(ptr nonnull [[VA0]]) 
37+ ; CHECK-NEXT:    call void @llvm.va_copy.p0(ptr nonnull [[VA1]], ptr nonnull [[VA0]]) 
38+ ; CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VA0]]) 
39+ ; CHECK-NEXT:    call void @callee(ptr nonnull [[VA1]]) 
40+ ; CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VA1]]) 
41+ ; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 32, ptr nonnull [[VA1]]) 
42+ ; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 32, ptr nonnull [[VA0]]) 
43+ ; CHECK-NEXT:    ret void 
44+ ; 
45+ entry:
46+   %va0  = alloca  %struct.__va_list , align  8 
47+   %va1  = alloca  %struct.__va_list , align  8 
48+   call  void  @llvm.lifetime.start.p0 (i64  32 , ptr  %va0 )
49+   call  void  @llvm.lifetime.start.p0 (i64  32 , ptr  %va1 )
50+   call  void  @llvm.va_start (ptr  %va0 )
51+   call  void  @llvm.va_copy (ptr  %va1 , ptr  %va0 )
52+   call  void  @llvm.va_end (ptr  %va0 )
53+   call  void  @callee (ptr  %va1 )
54+   call  void  @llvm.va_end (ptr  %va1 )
55+   call  void  @llvm.lifetime.end.p0 (i64  32 , ptr  %va1 )
56+   call  void  @llvm.lifetime.end.p0 (i64  32 , ptr  %va0 )
57+   ret  void 
58+ }
0 commit comments