OLD | NEW |
1 ; RUN: opt < %s -expand-varargs -S | FileCheck %s | 1 ; RUN: opt < %s -expand-varargs -S | FileCheck %s |
2 | 2 |
3 declare i32 @varargs_func(i32 %arg, ...) | 3 declare i32 @varargs_func(i32 %arg, ...) |
4 | 4 |
5 | 5 |
6 %MyStruct = type { i64, i64 } | 6 %MyStruct = type { i64, i64 } |
7 | 7 |
8 ; Test passing a struct by value. | 8 ; Test passing a struct by value. |
9 define i32 @varargs_call_struct(%MyStruct* %ptr) { | 9 define i32 @varargs_call_struct(%MyStruct* %ptr) { |
10 %result = call i32 (i32, ...)* @varargs_func(i32 111, i64 222, %MyStruct* byva
l %ptr) | 10 %result = call i32 (i32, ...) @varargs_func(i32 111, i64 222, %MyStruct* byval
%ptr) |
11 ret i32 %result | 11 ret i32 %result |
12 } | 12 } |
13 ; CHECK-LABEL: @varargs_call_struct( | 13 ; CHECK-LABEL: @varargs_call_struct( |
14 ; CHECK: %vararg_ptr1 = getelementptr inbounds { i64, %MyStruct }* %vararg_buffe
r, i32 0, i32 1 | 14 ; CHECK: %vararg_ptr1 = getelementptr inbounds { i64, %MyStruct }, { i64, %MyStr
uct }* %vararg_buffer, i32 0, i32 1 |
15 ; CHECK: %1 = bitcast %MyStruct* %vararg_ptr1 to i8* | 15 ; CHECK: %1 = bitcast %MyStruct* %vararg_ptr1 to i8* |
16 ; CHECK: %2 = bitcast %MyStruct* %ptr to i8* | 16 ; CHECK: %2 = bitcast %MyStruct* %ptr to i8* |
17 ; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 16, i32 1, i1
false) | 17 ; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %2, i64 16, i32 1, i1
false) |
OLD | NEW |