1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
2
3
3
4
%struct.__va_list = type { ptr , ptr , ptr , i32 , i32 }
4
5
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
+ ;
15
12
entry:
16
13
%va0 = alloca %struct.__va_list , align 8
17
14
%va1 = alloca %struct.__va_list , align 8
@@ -23,6 +20,39 @@ entry:
23
20
call void @llvm.lifetime.end.p0 (i64 32 , ptr %va1 )
24
21
call void @llvm.va_end (ptr %va0 )
25
22
call void @llvm.lifetime.end.p0 (i64 32 , ptr %va0 )
26
- ret i32 0
23
+ ret void
27
24
}
28
25
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