OLD | NEW |
1 ; RUN: opt < %s -expand-varargs -S | FileCheck %s | 1 ; RUN: opt < %s -expand-varargs -S | FileCheck %s |
2 | 2 |
3 %va_list = type i8* | 3 %va_list = type i8* |
4 | 4 |
5 declare void @llvm.va_start(i8*) | 5 declare void @llvm.va_start(i8*) |
6 declare void @llvm.va_end(i8*) | 6 declare void @llvm.va_end(i8*) |
7 declare void @llvm.va_copy(i8*, i8*) | 7 declare void @llvm.va_copy(i8*, i8*) |
8 | 8 |
9 declare i32 @outside_func(i32 %arg, %va_list* %args) | 9 declare i32 @outside_func(i32 %arg, %va_list* %args) |
10 | 10 |
11 | 11 |
12 ; Produced by the expansion of @varargs_call1(): | 12 ; Produced by the expansion of @varargs_call1(): |
13 ; CHECK: %vararg_call = type <{ i64, i32 }> | 13 ; CHECK: %vararg_call = type <{ i64, i32 }> |
14 | 14 |
15 ; Produced by the expansion of @call_with_zero_varargs(). | 15 ; Produced by the expansion of @call_with_zero_varargs(). |
16 ; We have a dummy field to deal with buggy programs: | 16 ; We have a dummy field to deal with buggy programs: |
17 ; CHECK: %vararg_call.0 = type <{ i32 }> | 17 ; CHECK: %vararg_call.0 = type <{ i32 }> |
18 | 18 |
19 | 19 |
20 define i32 @varargs_func(i32 %arg, ...) { | 20 define i32 @varargs_func(i32 %arg, ...) { |
21 %arglist_alloc = alloca %va_list | 21 %arglist_alloc = alloca %va_list |
22 %arglist = bitcast %va_list* %arglist_alloc to i8* | 22 %arglist = bitcast %va_list* %arglist_alloc to i8* |
23 | 23 |
24 call void @llvm.va_start(i8* %arglist) | 24 call void @llvm.va_start(i8* %arglist) |
25 %result = call i32 @outside_func(i32 %arg, %va_list* %arglist_alloc) | 25 %result = call i32 @outside_func(i32 %arg, %va_list* %arglist_alloc) |
26 call void @llvm.va_end(i8* %arglist) | 26 call void @llvm.va_end(i8* %arglist) |
27 ret i32 %result | 27 ret i32 %result |
28 } | 28 } |
29 ; CHECK: define i32 @varargs_func(i32 %arg, i8* %varargs) { | 29 ; CHECK: define i32 @varargs_func(i32 %arg, i8* noalias %varargs) { |
30 ; CHECK-NEXT: %arglist_alloc = alloca i8* | 30 ; CHECK-NEXT: %arglist_alloc = alloca i8* |
31 ; CHECK-NEXT: %arglist = bitcast i8** %arglist_alloc to i8* | 31 ; CHECK-NEXT: %arglist = bitcast i8** %arglist_alloc to i8* |
32 ; CHECK-NEXT: %arglist1 = bitcast i8* %arglist to i8** | 32 ; CHECK-NEXT: %arglist1 = bitcast i8* %arglist to i8** |
33 ; CHECK-NEXT: store i8* %varargs, i8** %arglist1 | 33 ; CHECK-NEXT: store i8* %varargs, i8** %arglist1 |
34 ; CHECK-NEXT: %result = call i32 @outside_func(i32 %arg, i8** %arglist_alloc) | 34 ; CHECK-NEXT: %result = call i32 @outside_func(i32 %arg, i8** %arglist_alloc) |
35 ; CHECK-NEXT: ret i32 %result | 35 ; CHECK-NEXT: ret i32 %result |
36 | 36 |
37 | 37 |
38 define i32 @varargs_call1() { | 38 define i32 @varargs_call1() { |
39 %result = call i32 (i32, ...)* @varargs_func(i32 111, i64 222, i32 333) | 39 %result = call i32 (i32, ...)* @varargs_func(i32 111, i64 222, i32 333) |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 define void @do_va_copy(i8* %dest, i8* %src) { | 125 define void @do_va_copy(i8* %dest, i8* %src) { |
126 call void @llvm.va_copy(i8* %dest, i8* %src) | 126 call void @llvm.va_copy(i8* %dest, i8* %src) |
127 ret void | 127 ret void |
128 } | 128 } |
129 ; CHECK: define void @do_va_copy(i8* %dest, i8* %src) { | 129 ; CHECK: define void @do_va_copy(i8* %dest, i8* %src) { |
130 ; CHECK-NEXT: %vacopy_src = bitcast i8* %src to i8** | 130 ; CHECK-NEXT: %vacopy_src = bitcast i8* %src to i8** |
131 ; CHECK-NEXT: %vacopy_dest = bitcast i8* %dest to i8** | 131 ; CHECK-NEXT: %vacopy_dest = bitcast i8* %dest to i8** |
132 ; CHECK-NEXT: %vacopy_currentptr = load i8** %vacopy_src | 132 ; CHECK-NEXT: %vacopy_currentptr = load i8** %vacopy_src |
133 ; CHECK-NEXT: store i8* %vacopy_currentptr, i8** %vacopy_dest | 133 ; CHECK-NEXT: store i8* %vacopy_currentptr, i8** %vacopy_dest |
134 ; CHECK-NEXT: ret void | 134 ; CHECK-NEXT: ret void |
OLD | NEW |