forked from OSchip/llvm-project
Update Clang tests to handle explicitly typed gep changes in LLVM.
llvm-svn: 230783
This commit is contained in:
parent
d99b8f3ba8
commit
218b783192
|
@ -1,6 +1,6 @@
|
|||
// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
|
||||
|
||||
// CHECK: getelementptr inbounds i32* %{{vla|[0-9]}}
|
||||
// CHECK: getelementptr inbounds i32, i32* %{{vla|[0-9]}}
|
||||
extern void f(int *);
|
||||
int e(int m, int n) {
|
||||
int x[n];
|
||||
|
|
|
@ -14,8 +14,8 @@ return(char)s->c;
|
|||
}
|
||||
main()
|
||||
{
|
||||
// CHECK: getelementptr inbounds [1 x %struct.T]* %s, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds [1 x %struct.T]* %s, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds [1 x %struct.T], [1 x %struct.T]* %s, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds [1 x %struct.T], [1 x %struct.T]* %s, i32 0, i32 0
|
||||
struct T t;
|
||||
t.i=0xff;
|
||||
t.c=0xffff11;
|
||||
|
|
|
@ -23,7 +23,7 @@ int simple_int(void) {
|
|||
|
||||
// CHECK: [[VAARG_IN_REG]]
|
||||
// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 1)
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[REG_TOP]], i32 [[GR_OFFS]]
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[REG_TOP]], i32 [[GR_OFFS]]
|
||||
// CHECK-BE: [[REG_ADDR_VAL:%[0-9]+]] = ptrtoint i8* [[REG_ADDR]] to i64
|
||||
// CHECK-BE: [[REG_ADDR_VAL_ALIGNED:%[a-z_0-9]*]] = add i64 [[REG_ADDR_VAL]], 4
|
||||
// CHECK-BE: [[REG_ADDR:%[0-9]+]] = inttoptr i64 [[REG_ADDR_VAL_ALIGNED]] to i8*
|
||||
|
@ -32,7 +32,7 @@ int simple_int(void) {
|
|||
|
||||
// CHECK: [[VAARG_ON_STACK]]
|
||||
// CHECK: [[STACK:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8* [[STACK]], i32 8
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8, i8* [[STACK]], i32 8
|
||||
// CHECK: store i8* [[NEW_STACK]], i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK-BE: [[STACK_VAL:%[0-9]+]] = ptrtoint i8* [[STACK]] to i64
|
||||
// CHECK-BE: [[STACK_VAL_ALIGNED:%[a-z_0-9]*]] = add i64 [[STACK_VAL]], 4
|
||||
|
@ -63,7 +63,7 @@ __int128 aligned_int(void) {
|
|||
|
||||
// CHECK: [[VAARG_IN_REG]]
|
||||
// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 1)
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[REG_TOP]], i32 [[ALIGNED_REGOFFS]]
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[REG_TOP]], i32 [[ALIGNED_REGOFFS]]
|
||||
// CHECK: [[FROMREG_ADDR:%[a-z_0-9]+]] = bitcast i8* [[REG_ADDR]] to i128*
|
||||
// CHECK: br label %[[VAARG_END:[a-z._0-9]+]]
|
||||
|
||||
|
@ -73,7 +73,7 @@ __int128 aligned_int(void) {
|
|||
// CHECK: [[ALIGN_STACK:%[a-z_0-9]+]] = add i64 [[STACKINT]], 15
|
||||
// CHECK: [[ALIGNED_STACK_INT:%[a-z_0-9]+]] = and i64 [[ALIGN_STACK]], -16
|
||||
// CHECK: [[ALIGNED_STACK_PTR:%[a-z_0-9]+]] = inttoptr i64 [[ALIGNED_STACK_INT]] to i8*
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8* [[ALIGNED_STACK_PTR]], i32 16
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8, i8* [[ALIGNED_STACK_PTR]], i32 16
|
||||
// CHECK: store i8* [[NEW_STACK]], i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[FROMSTACK_ADDR:%[a-z_0-9]+]] = bitcast i8* [[ALIGNED_STACK_PTR]] to i128*
|
||||
// CHECK: br label %[[VAARG_END]]
|
||||
|
@ -104,14 +104,14 @@ struct bigstruct simple_indirect(void) {
|
|||
|
||||
// CHECK: [[VAARG_IN_REG]]
|
||||
// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 1)
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[REG_TOP]], i32 [[GR_OFFS]]
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[REG_TOP]], i32 [[GR_OFFS]]
|
||||
// CHECK: [[FROMREG_ADDR:%[a-z_0-9]+]] = bitcast i8* [[REG_ADDR]] to %struct.bigstruct**
|
||||
// CHECK: br label %[[VAARG_END:[a-z._0-9]+]]
|
||||
|
||||
// CHECK: [[VAARG_ON_STACK]]
|
||||
// CHECK: [[STACK:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK-NOT: and i64
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8* [[STACK]], i32 8
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8, i8* [[STACK]], i32 8
|
||||
// CHECK: store i8* [[NEW_STACK]], i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[FROMSTACK_ADDR:%[a-z_0-9]+]] = bitcast i8* [[STACK]] to %struct.bigstruct**
|
||||
// CHECK: br label %[[VAARG_END]]
|
||||
|
@ -141,13 +141,13 @@ struct aligned_bigstruct simple_aligned_indirect(void) {
|
|||
|
||||
// CHECK: [[VAARG_IN_REG]]
|
||||
// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 1)
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[REG_TOP]], i32 [[GR_OFFS]]
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[REG_TOP]], i32 [[GR_OFFS]]
|
||||
// CHECK: [[FROMREG_ADDR:%[a-z_0-9]+]] = bitcast i8* [[REG_ADDR]] to %struct.aligned_bigstruct**
|
||||
// CHECK: br label %[[VAARG_END:[a-z._0-9]+]]
|
||||
|
||||
// CHECK: [[VAARG_ON_STACK]]
|
||||
// CHECK: [[STACK:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8* [[STACK]], i32 8
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8, i8* [[STACK]], i32 8
|
||||
// CHECK: store i8* [[NEW_STACK]], i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[FROMSTACK_ADDR:%[a-z_0-9]+]] = bitcast i8* [[STACK]] to %struct.aligned_bigstruct**
|
||||
// CHECK: br label %[[VAARG_END]]
|
||||
|
@ -172,7 +172,7 @@ double simple_double(void) {
|
|||
|
||||
// CHECK: [[VAARG_IN_REG]]
|
||||
// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 2)
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[REG_TOP]], i32 [[VR_OFFS]]
|
||||
// CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[REG_TOP]], i32 [[VR_OFFS]]
|
||||
// CHECK-BE: [[REG_ADDR_VAL:%[0-9]+]] = ptrtoint i8* [[REG_ADDR]] to i64
|
||||
// CHECK-BE: [[REG_ADDR_VAL_ALIGNED:%[a-z_0-9]*]] = add i64 [[REG_ADDR_VAL]], 8
|
||||
// CHECK-BE: [[REG_ADDR:%[0-9]+]] = inttoptr i64 [[REG_ADDR_VAL_ALIGNED]] to i8*
|
||||
|
@ -181,7 +181,7 @@ double simple_double(void) {
|
|||
|
||||
// CHECK: [[VAARG_ON_STACK]]
|
||||
// CHECK: [[STACK:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8* [[STACK]], i32 8
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8, i8* [[STACK]], i32 8
|
||||
// CHECK: store i8* [[NEW_STACK]], i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[FROMSTACK_ADDR:%[a-z_0-9]+]] = bitcast i8* [[STACK]] to double*
|
||||
// CHECK: br label %[[VAARG_END]]
|
||||
|
@ -211,17 +211,17 @@ struct hfa simple_hfa(void) {
|
|||
|
||||
// CHECK: [[VAARG_IN_REG]]
|
||||
// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 2)
|
||||
// CHECK: [[FIRST_REG:%[a-z_0-9]+]] = getelementptr i8* [[REG_TOP]], i32 [[VR_OFFS]]
|
||||
// CHECK-LE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[FIRST_REG]], i32 0
|
||||
// CHECK-BE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[FIRST_REG]], i32 12
|
||||
// CHECK: [[FIRST_REG:%[a-z_0-9]+]] = getelementptr i8, i8* [[REG_TOP]], i32 [[VR_OFFS]]
|
||||
// CHECK-LE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[FIRST_REG]], i32 0
|
||||
// CHECK-BE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[FIRST_REG]], i32 12
|
||||
// CHECK: [[EL_TYPED:%[a-z_0-9]+]] = bitcast i8* [[EL_ADDR]] to float*
|
||||
// CHECK: [[EL_TMPADDR:%[a-z_0-9]+]] = getelementptr inbounds [2 x float]* %[[TMP_HFA:[a-z_.0-9]+]], i32 0, i32 0
|
||||
// CHECK: [[EL_TMPADDR:%[a-z_0-9]+]] = getelementptr inbounds [2 x float], [2 x float]* %[[TMP_HFA:[a-z_.0-9]+]], i32 0, i32 0
|
||||
// CHECK: [[EL:%[a-z_0-9]+]] = load float* [[EL_TYPED]]
|
||||
// CHECK: store float [[EL]], float* [[EL_TMPADDR]]
|
||||
// CHECK-LE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[FIRST_REG]], i32 16
|
||||
// CHECK-BE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8* [[FIRST_REG]], i32 28
|
||||
// CHECK-LE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[FIRST_REG]], i32 16
|
||||
// CHECK-BE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr i8, i8* [[FIRST_REG]], i32 28
|
||||
// CHECK: [[EL_TYPED:%[a-z_0-9]+]] = bitcast i8* [[EL_ADDR]] to float*
|
||||
// CHECK: [[EL_TMPADDR:%[a-z_0-9]+]] = getelementptr inbounds [2 x float]* %[[TMP_HFA]], i32 0, i32 1
|
||||
// CHECK: [[EL_TMPADDR:%[a-z_0-9]+]] = getelementptr inbounds [2 x float], [2 x float]* %[[TMP_HFA]], i32 0, i32 1
|
||||
// CHECK: [[EL:%[a-z_0-9]+]] = load float* [[EL_TYPED]]
|
||||
// CHECK: store float [[EL]], float* [[EL_TMPADDR]]
|
||||
// CHECK: [[FROMREG_ADDR:%[a-z_0-9]+]] = bitcast [2 x float]* %[[TMP_HFA]] to %struct.hfa*
|
||||
|
@ -229,7 +229,7 @@ struct hfa simple_hfa(void) {
|
|||
|
||||
// CHECK: [[VAARG_ON_STACK]]
|
||||
// CHECK: [[STACK:%[a-z_0-9]+]] = load i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8* [[STACK]], i32 8
|
||||
// CHECK: [[NEW_STACK:%[a-z_0-9]+]] = getelementptr i8, i8* [[STACK]], i32 8
|
||||
// CHECK: store i8* [[NEW_STACK]], i8** getelementptr inbounds (%struct.__va_list* @the_list, i32 0, i32 0)
|
||||
// CHECK: [[FROMSTACK_ADDR:%[a-z_0-9]+]] = bitcast i8* [[STACK]] to %struct.hfa*
|
||||
// CHECK: br label %[[VAARG_END]]
|
||||
|
|
|
@ -6,16 +6,16 @@
|
|||
// CHECK: store %struct.S addrspace(1)* %p1, %struct.S addrspace(1)** [[p1addr]]
|
||||
// CHECK: store %struct.S addrspace(2)* %p2, %struct.S addrspace(2)** [[p2addr]]
|
||||
// CHECK: [[t0:%.*]] = load %struct.S addrspace(2)** [[p2addr]], align 8
|
||||
// CHECK: [[t1:%.*]] = getelementptr inbounds %struct.S addrspace(2)* [[t0]], i32 0, i32 1
|
||||
// CHECK: [[t1:%.*]] = getelementptr inbounds %struct.S, %struct.S addrspace(2)* [[t0]], i32 0, i32 1
|
||||
// CHECK: [[t2:%.*]] = load i32 addrspace(2)* [[t1]], align 4
|
||||
// CHECK: [[t3:%.*]] = load %struct.S addrspace(1)** [[p1addr]], align 8
|
||||
// CHECK: [[t4:%.*]] = getelementptr inbounds %struct.S addrspace(1)* [[t3]], i32 0, i32 0
|
||||
// CHECK: [[t4:%.*]] = getelementptr inbounds %struct.S, %struct.S addrspace(1)* [[t3]], i32 0, i32 0
|
||||
// CHECK: store i32 [[t2]], i32 addrspace(1)* [[t4]], align 4
|
||||
// CHECK: [[t5:%.*]] = load %struct.S addrspace(2)** [[p2addr]], align 8
|
||||
// CHECK: [[t6:%.*]] = getelementptr inbounds %struct.S addrspace(2)* [[t5]], i32 0, i32 0
|
||||
// CHECK: [[t6:%.*]] = getelementptr inbounds %struct.S, %struct.S addrspace(2)* [[t5]], i32 0, i32 0
|
||||
// CHECK: [[t7:%.*]] = load i32 addrspace(2)* [[t6]], align 4
|
||||
// CHECK: [[t8:%.*]] = load %struct.S addrspace(1)** [[p1addr]], align 8
|
||||
// CHECK: [[t9:%.*]] = getelementptr inbounds %struct.S addrspace(1)* [[t8]], i32 0, i32 1
|
||||
// CHECK: [[t9:%.*]] = getelementptr inbounds %struct.S, %struct.S addrspace(1)* [[t8]], i32 0, i32 1
|
||||
// CHECK: store i32 [[t7]], i32 addrspace(1)* [[t9]], align 4
|
||||
// CHECK: ret void
|
||||
// CHECK:}
|
||||
|
|
|
@ -13,7 +13,7 @@ static struct foo gf;
|
|||
int main(int argc, char **argv) {
|
||||
struct foo f;
|
||||
f.v = argc;
|
||||
// CHECK: getelementptr inbounds %struct.foo* %f, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.foo, %struct.foo* %f, i32 0, i32 0
|
||||
// CHECK-NEXT: bitcast i32* {{.*}} to i8*
|
||||
// CHECK-NEXT: call i8* @llvm.ptr.annotation.p0i8({{.*}}str{{.*}}str{{.*}}i32 8)
|
||||
// CHECK-NEXT: bitcast i8* {{.*}} to i32*
|
||||
|
|
|
@ -17,12 +17,12 @@ double varargs_vec_2i(int fixed, ...) {
|
|||
// CHECK: alloca <2 x i32>, align 8
|
||||
// CHECK: [[ALIGN:%.*]] = and i32 [[VAR:%.*]], -8
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <2 x i32>*
|
||||
// APCS-GNU: varargs_vec_2i
|
||||
// APCS-GNU: alloca <2 x i32>, align 8
|
||||
// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <2 x i32>
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 8
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* {{%.*}}, i32 8
|
||||
// APCS-GNU: bitcast <2 x i32>* [[VAR_ALIGN]] to i8*
|
||||
// APCS-GNU: call void @llvm.memcpy
|
||||
// APCS-GNU: load <2 x i32>* [[VAR_ALIGN]]
|
||||
|
@ -46,11 +46,11 @@ double test_2i(__int2 *in) {
|
|||
double varargs_vec_3c(int fixed, ...) {
|
||||
// CHECK: varargs_vec_3c
|
||||
// CHECK: alloca <3 x i8>, align 4
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP:%.*]], i32 4
|
||||
// CHECK: bitcast i8* [[AP]] to <3 x i8>*
|
||||
// APCS-GNU: varargs_vec_3c
|
||||
// APCS-GNU: alloca <3 x i8>, align 4
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP:%.*]], i32 4
|
||||
// APCS-GNU: bitcast i8* [[AP]] to <3 x i8>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -74,12 +74,12 @@ double varargs_vec_5c(int fixed, ...) {
|
|||
// CHECK: alloca <5 x i8>, align 8
|
||||
// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <5 x i8>*
|
||||
// APCS-GNU: varargs_vec_5c
|
||||
// APCS-GNU: alloca <5 x i8>, align 8
|
||||
// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <5 x i8>
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 8
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* {{%.*}}, i32 8
|
||||
// APCS-GNU: bitcast <5 x i8>* [[VAR_ALIGN]] to i8*
|
||||
// APCS-GNU: call void @llvm.memcpy
|
||||
// APCS-GNU: load <5 x i8>* [[VAR_ALIGN]]
|
||||
|
@ -106,14 +106,14 @@ double varargs_vec_9c(int fixed, ...) {
|
|||
// CHECK: [[VAR_ALIGN:%.*]] = alloca <9 x i8>
|
||||
// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast <9 x i8>* [[VAR_ALIGN]] to i8*
|
||||
// CHECK: call void @llvm.memcpy
|
||||
// CHECK: load <9 x i8>* [[VAR_ALIGN]]
|
||||
// APCS-GNU: varargs_vec_9c
|
||||
// APCS-GNU: alloca <9 x i8>, align 16
|
||||
// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <9 x i8>
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 16
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* {{%.*}}, i32 16
|
||||
// APCS-GNU: bitcast <9 x i8>* [[VAR_ALIGN]] to i8*
|
||||
// APCS-GNU: call void @llvm.memcpy
|
||||
// APCS-GNU: load <9 x i8>* [[VAR_ALIGN]]
|
||||
|
@ -136,12 +136,12 @@ double test_9c(__char9 *in) {
|
|||
|
||||
double varargs_vec_19c(int fixed, ...) {
|
||||
// CHECK: varargs_vec_19c
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP:%.*]], i32 4
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <19 x i8>*
|
||||
// APCS-GNU: varargs_vec_19c
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP:%.*]], i32 4
|
||||
// APCS-GNU: [[VAR:%.*]] = bitcast i8* [[AP]] to i8**
|
||||
// APCS-GNU: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// APCS-GNU: bitcast i8* [[VAR2]] to <19 x i8>*
|
||||
|
@ -167,12 +167,12 @@ double varargs_vec_3s(int fixed, ...) {
|
|||
// CHECK: alloca <3 x i16>, align 8
|
||||
// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i16>*
|
||||
// APCS-GNU: varargs_vec_3s
|
||||
// APCS-GNU: alloca <3 x i16>, align 8
|
||||
// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <3 x i16>
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 8
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* {{%.*}}, i32 8
|
||||
// APCS-GNU: bitcast <3 x i16>* [[VAR_ALIGN]] to i8*
|
||||
// APCS-GNU: call void @llvm.memcpy
|
||||
// APCS-GNU: load <3 x i16>* [[VAR_ALIGN]]
|
||||
|
@ -199,14 +199,14 @@ double varargs_vec_5s(int fixed, ...) {
|
|||
// CHECK: [[VAR_ALIGN:%.*]] = alloca <5 x i16>
|
||||
// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast <5 x i16>* [[VAR_ALIGN]] to i8*
|
||||
// CHECK: call void @llvm.memcpy
|
||||
// CHECK: load <5 x i16>* [[VAR_ALIGN]]
|
||||
// APCS-GNU: varargs_vec_5s
|
||||
// APCS-GNU: alloca <5 x i16>, align 16
|
||||
// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <5 x i16>
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 16
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* {{%.*}}, i32 16
|
||||
// APCS-GNU: bitcast <5 x i16>* [[VAR_ALIGN]] to i8*
|
||||
// APCS-GNU: call void @llvm.memcpy
|
||||
// APCS-GNU: load <5 x i16>* [[VAR_ALIGN]]
|
||||
|
@ -238,11 +238,11 @@ double varargs_struct(int fixed, ...) {
|
|||
// CHECK: varargs_struct
|
||||
// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to %struct.StructWithVec*
|
||||
// APCS-GNU: varargs_struct
|
||||
// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca %struct.StructWithVec
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 16
|
||||
// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8, i8* {{%.*}}, i32 16
|
||||
// APCS-GNU: bitcast %struct.StructWithVec* [[VAR_ALIGN]] to i8*
|
||||
// APCS-GNU: call void @llvm.memcpy
|
||||
va_list ap;
|
||||
|
|
|
@ -16,7 +16,7 @@ typedef __attribute__(( ext_vector_type(3) )) double __double3;
|
|||
double varargs_vec_3c(int fixed, ...) {
|
||||
// CHECK: varargs_vec_3c
|
||||
// CHECK: alloca <3 x i8>, align 4
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <3 x i8>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -36,7 +36,7 @@ double test_3c(__char3 *in) {
|
|||
double varargs_vec_4c(int fixed, ...) {
|
||||
// CHECK: varargs_vec_4c
|
||||
// CHECK: alloca <4 x i8>, align 4
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <4 x i8>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -56,7 +56,7 @@ double test_4c(__char4 *in) {
|
|||
double varargs_vec_5c(int fixed, ...) {
|
||||
// CHECK: varargs_vec_5c
|
||||
// CHECK: alloca <5 x i8>, align 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <5 x i8>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -78,7 +78,7 @@ double varargs_vec_9c(int fixed, ...) {
|
|||
// CHECK: alloca <9 x i8>, align 16
|
||||
// CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <9 x i8>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -97,7 +97,7 @@ double test_9c(__char9 *in) {
|
|||
|
||||
double varargs_vec_19c(int fixed, ...) {
|
||||
// CHECK: varargs_vec_19c
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <19 x i8>*
|
||||
|
@ -119,7 +119,7 @@ double test_19c(__char19 *in) {
|
|||
double varargs_vec_3s(int fixed, ...) {
|
||||
// CHECK: varargs_vec_3s
|
||||
// CHECK: alloca <3 x i16>, align 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <3 x i16>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -141,7 +141,7 @@ double varargs_vec_5s(int fixed, ...) {
|
|||
// CHECK: alloca <5 x i16>, align 16
|
||||
// CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <5 x i16>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -163,7 +163,7 @@ double varargs_vec_3i(int fixed, ...) {
|
|||
// CHECK: alloca <3 x i32>, align 16
|
||||
// CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i32>*
|
||||
va_list ap;
|
||||
double sum = fixed;
|
||||
|
@ -183,7 +183,7 @@ double test_3i(__int3 *in) {
|
|||
double varargs_vec_5i(int fixed, ...) {
|
||||
// CHECK: varargs_vec_5i
|
||||
// CHECK: alloca <5 x i32>, align 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <5 x i32>*
|
||||
|
@ -205,7 +205,7 @@ double test_5i(__int5 *in) {
|
|||
double varargs_vec_3d(int fixed, ...) {
|
||||
// CHECK: varargs_vec_3d
|
||||
// CHECK: alloca <3 x double>, align 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <3 x double>*
|
||||
|
@ -230,49 +230,49 @@ double varargs_vec(int fixed, ...) {
|
|||
double sum = fixed;
|
||||
va_start(ap, fixed);
|
||||
__char3 c3 = va_arg(ap, __char3);
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <3 x i8>*
|
||||
sum = sum + c3.x + c3.y;
|
||||
__char5 c5 = va_arg(ap, __char5);
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <5 x i8>*
|
||||
sum = sum + c5.x + c5.y;
|
||||
__char9 c9 = va_arg(ap, __char9);
|
||||
// CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <9 x i8>*
|
||||
sum = sum + c9.x + c9.y;
|
||||
__char19 c19 = va_arg(ap, __char19);
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <19 x i8>*
|
||||
sum = sum + c19.x + c19.y;
|
||||
__short3 s3 = va_arg(ap, __short3);
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: bitcast i8* [[AP_CUR]] to <3 x i16>*
|
||||
sum = sum + s3.x + s3.y;
|
||||
__short5 s5 = va_arg(ap, __short5);
|
||||
// CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <5 x i16>*
|
||||
sum = sum + s5.x + s5.y;
|
||||
__int3 i3 = va_arg(ap, __int3);
|
||||
// CHECK: [[ALIGN:%.*]] = and i64 {{%.*}}, -16
|
||||
// CHECK: [[AP_ALIGN:%.*]] = inttoptr i64 [[ALIGN]] to i8*
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_ALIGN]], i32 16
|
||||
// CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i32>*
|
||||
sum = sum + i3.x + i3.y;
|
||||
__int5 i5 = va_arg(ap, __int5);
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <5 x i32>*
|
||||
sum = sum + i5.x + i5.y;
|
||||
__double3 d3 = va_arg(ap, __double3);
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[AP_NEXT:%.*]] = getelementptr i8, i8* [[AP_CUR:%.*]], i32 8
|
||||
// CHECK: [[VAR:%.*]] = bitcast i8* [[AP_CUR]] to i8**
|
||||
// CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
|
||||
// CHECK: bitcast i8* [[VAR2]] to <3 x double>*
|
||||
|
|
|
@ -277,10 +277,10 @@ int f38(int i, s38_no_align s1, s38_no_align s2) {
|
|||
// CHECK: %s2 = alloca %struct.s38, align 8
|
||||
// CHECK: store i64 %s1.coerce, i64* %{{.*}}, align 1
|
||||
// CHECK: store i64 %s2.coerce, i64* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + s1.s + s2.s;
|
||||
}
|
||||
s38_no_align g38;
|
||||
|
@ -301,10 +301,10 @@ int f38_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
|
|||
// CHECK: %s2 = alloca %struct.s38, align 8
|
||||
// CHECK: store i64 %s1.coerce, i64* %{{.*}}, align 1
|
||||
// CHECK: store i64 %s2.coerce, i64* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s38* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s38, %struct.s38* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
|
||||
}
|
||||
int caller38_stack() {
|
||||
|
@ -330,10 +330,10 @@ int f39(int i, s39_with_align s1, s39_with_align s2) {
|
|||
// CHECK: %s2 = alloca %struct.s39, align 16
|
||||
// CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + s1.s + s2.s;
|
||||
}
|
||||
s39_with_align g39;
|
||||
|
@ -354,10 +354,10 @@ int f39_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
|
|||
// CHECK: %s2 = alloca %struct.s39, align 16
|
||||
// CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s39* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s39, %struct.s39* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
|
||||
}
|
||||
int caller39_stack() {
|
||||
|
@ -385,10 +385,10 @@ int f40(int i, s40_no_align s1, s40_no_align s2) {
|
|||
// CHECK: %s2 = alloca %struct.s40, align 8
|
||||
// CHECK: store [2 x i64] %s1.coerce, [2 x i64]* %{{.*}}, align 1
|
||||
// CHECK: store [2 x i64] %s2.coerce, [2 x i64]* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + s1.s + s2.s;
|
||||
}
|
||||
s40_no_align g40;
|
||||
|
@ -409,10 +409,10 @@ int f40_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
|
|||
// CHECK: %s2 = alloca %struct.s40, align 8
|
||||
// CHECK: store [2 x i64] %s1.coerce, [2 x i64]* %{{.*}}, align 1
|
||||
// CHECK: store [2 x i64] %s2.coerce, [2 x i64]* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s40* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s40, %struct.s40* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
|
||||
}
|
||||
int caller40_stack() {
|
||||
|
@ -440,10 +440,10 @@ int f41(int i, s41_with_align s1, s41_with_align s2) {
|
|||
// CHECK: %s2 = alloca %struct.s41, align 16
|
||||
// CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + s1.s + s2.s;
|
||||
}
|
||||
s41_with_align g41;
|
||||
|
@ -464,10 +464,10 @@ int f41_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
|
|||
// CHECK: %s2 = alloca %struct.s41, align 16
|
||||
// CHECK: store i128 %s1.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: store i128 %s2.coerce, i128* %{{.*}}, align 1
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s41* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s41, %struct.s41* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
|
||||
}
|
||||
int caller41_stack() {
|
||||
|
@ -493,10 +493,10 @@ typedef struct s42 s42_no_align;
|
|||
__attribute__ ((noinline))
|
||||
int f42(int i, s42_no_align s1, s42_no_align s2) {
|
||||
// CHECK: define i32 @f42(i32 %i, %struct.s42* %s1, %struct.s42* %s2)
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + s1.s + s2.s;
|
||||
}
|
||||
s42_no_align g42;
|
||||
|
@ -517,10 +517,10 @@ __attribute__ ((noinline))
|
|||
int f42_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
|
||||
int i9, s42_no_align s1, s42_no_align s2) {
|
||||
// CHECK: define i32 @f42_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, %struct.s42* %s1, %struct.s42* %s2)
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s42* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s42, %struct.s42* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
|
||||
}
|
||||
int caller42_stack() {
|
||||
|
@ -550,10 +550,10 @@ typedef struct s43 s43_with_align;
|
|||
__attribute__ ((noinline))
|
||||
int f43(int i, s43_with_align s1, s43_with_align s2) {
|
||||
// CHECK: define i32 @f43(i32 %i, %struct.s43* %s1, %struct.s43* %s2)
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + s1.s + s2.s;
|
||||
}
|
||||
s43_with_align g43;
|
||||
|
@ -574,10 +574,10 @@ __attribute__ ((noinline))
|
|||
int f43_stack(int i, int i2, int i3, int i4, int i5, int i6, int i7, int i8,
|
||||
int i9, s43_with_align s1, s43_with_align s2) {
|
||||
// CHECK: define i32 @f43_stack(i32 %i, i32 %i2, i32 %i3, i32 %i4, i32 %i5, i32 %i6, i32 %i7, i32 %i8, i32 %i9, %struct.s43* %s1, %struct.s43* %s2)
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s43* %s2, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s1, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds %struct.s43, %struct.s43* %s2, i32 0, i32 1
|
||||
return s1.i + s2.i + i + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + s1.s + s2.s;
|
||||
}
|
||||
int caller43_stack() {
|
||||
|
@ -629,7 +629,7 @@ float test_hfa(int n, ...) {
|
|||
// CHECK: [[CURLIST:%.*]] = load i8** [[THELIST]]
|
||||
|
||||
// HFA is not indirect, so occupies its full 16 bytes on the stack.
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8* [[CURLIST]], i32 16
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8, i8* [[CURLIST]], i32 16
|
||||
// CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
|
||||
|
||||
// CHECK: bitcast i8* [[CURLIST]] to %struct.HFA*
|
||||
|
@ -656,7 +656,7 @@ float test_toobig_hfa(int n, ...) {
|
|||
|
||||
// TooBigHFA is not actually an HFA, so gets passed indirectly. Only 8 bytes
|
||||
// of stack consumed.
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8* [[CURLIST]], i32 8
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8, i8* [[CURLIST]], i32 8
|
||||
// CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
|
||||
|
||||
// CHECK: [[HFAPTRPTR:%.*]] = bitcast i8* [[CURLIST]] to i8**
|
||||
|
@ -679,12 +679,12 @@ int32x4_t test_hva(int n, ...) {
|
|||
|
||||
// HVA is not indirect, so occupies its full 16 bytes on the stack. but it
|
||||
// must be properly aligned.
|
||||
// CHECK: [[ALIGN0:%.*]] = getelementptr i8* [[CURLIST]], i32 15
|
||||
// CHECK: [[ALIGN0:%.*]] = getelementptr i8, i8* [[CURLIST]], i32 15
|
||||
// CHECK: [[ALIGN1:%.*]] = ptrtoint i8* [[ALIGN0]] to i64
|
||||
// CHECK: [[ALIGN2:%.*]] = and i64 [[ALIGN1]], -16
|
||||
// CHECK: [[ALIGNED_LIST:%.*]] = inttoptr i64 [[ALIGN2]] to i8*
|
||||
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8* [[ALIGNED_LIST]], i32 32
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8, i8* [[ALIGNED_LIST]], i32 32
|
||||
// CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
|
||||
|
||||
// CHECK: bitcast i8* [[ALIGNED_LIST]] to %struct.HVA*
|
||||
|
@ -705,7 +705,7 @@ int32x4_t test_toobig_hva(int n, ...) {
|
|||
|
||||
// TooBigHVA is not actually an HVA, so gets passed indirectly. Only 8 bytes
|
||||
// of stack consumed.
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8* [[CURLIST]], i32 8
|
||||
// CHECK: [[NEXTLIST:%.*]] = getelementptr i8, i8* [[CURLIST]], i32 8
|
||||
// CHECK: store i8* [[NEXTLIST]], i8** [[THELIST]]
|
||||
|
||||
// CHECK: [[HVAPTRPTR:%.*]] = bitcast i8* [[CURLIST]] to i8**
|
||||
|
|
|
@ -16,12 +16,12 @@ void test0() {
|
|||
// CHECK: [[A:%.*]] = alloca [[BYREF:%.*]], align 8
|
||||
// CHECK-NEXT: [[TEMP:%.*]] = alloca [[AGG]], align 4
|
||||
// CHECK: [[RESULT:%.*]] = call i32 @makeAgg()
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr [[AGG]]* [[TEMP]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr [[AGG]], [[AGG]]* [[TEMP]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i32 [[RESULT]], i32* [[T0]]
|
||||
// Check that we properly assign into the forwarding pointer.
|
||||
// CHECK-NEXT: [[A_FORWARDING:%.*]] = getelementptr inbounds [[BYREF]]* [[A]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[A_FORWARDING:%.*]] = getelementptr inbounds [[BYREF]], [[BYREF]]* [[A]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[BYREF]]** [[A_FORWARDING]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF]]* [[T0]], i32 0, i32 4
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF]], [[BYREF]]* [[T0]], i32 0, i32 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[AGG]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[AGG]]* [[TEMP]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T2]], i8* [[T3]], i64 4, i32 4, i1 false)
|
||||
|
@ -42,19 +42,19 @@ void test1() {
|
|||
// CHECK-NEXT: [[B:%.*]] = alloca [[B_BYREF:%.*]], align 8
|
||||
// CHECK-NEXT: [[TEMP:%.*]] = alloca [[AGG]], align 4
|
||||
// CHECK: [[RESULT:%.*]] = call i32 @makeAgg()
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr [[AGG]]* [[TEMP]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr [[AGG]], [[AGG]]* [[TEMP]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i32 [[RESULT]], i32* [[T0]]
|
||||
// Check that we properly assign into the forwarding pointer, first for b:
|
||||
// CHECK-NEXT: [[B_FORWARDING:%.*]] = getelementptr inbounds [[B_BYREF]]* [[B]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[B_FORWARDING:%.*]] = getelementptr inbounds [[B_BYREF]], [[B_BYREF]]* [[B]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[B_BYREF]]** [[B_FORWARDING]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[B_BYREF]]* [[T0]], i32 0, i32 4
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[B_BYREF]], [[B_BYREF]]* [[T0]], i32 0, i32 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[AGG]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[AGG]]* [[TEMP]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T2]], i8* [[T3]], i64 4, i32 4, i1 false)
|
||||
// Then for 'a':
|
||||
// CHECK-NEXT: [[A_FORWARDING:%.*]] = getelementptr inbounds [[A_BYREF]]* [[A]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[A_FORWARDING:%.*]] = getelementptr inbounds [[A_BYREF]], [[A_BYREF]]* [[A]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[A_BYREF]]** [[A_FORWARDING]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A_BYREF]]* [[T0]], i32 0, i32 4
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[A_BYREF]], [[A_BYREF]]* [[T0]], i32 0, i32 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[AGG]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[AGG]]* [[TEMP]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T2]], i8* [[T3]], i64 4, i32 4, i1 false)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
|
||||
// CHECK: [[Vi:%.+]] = alloca %struct.__block_byref_i, align 8
|
||||
// CHECK: call i32 (...)* @rhs()
|
||||
// CHECK: [[V7:%.+]] = getelementptr inbounds %struct.__block_byref_i* [[Vi]], i32 0, i32 1
|
||||
// CHECK: [[V7:%.+]] = getelementptr inbounds %struct.__block_byref_i, %struct.__block_byref_i* [[Vi]], i32 0, i32 1
|
||||
// CHECK: load %struct.__block_byref_i** [[V7]]
|
||||
// CHECK: call i32 (...)* @rhs()
|
||||
// CHECK: [[V11:%.+]] = getelementptr inbounds %struct.__block_byref_i* [[Vi]], i32 0, i32 1
|
||||
// CHECK: [[V11:%.+]] = getelementptr inbounds %struct.__block_byref_i, %struct.__block_byref_i* [[Vi]], i32 0, i32 1
|
||||
// CHECK: load %struct.__block_byref_i** [[V11]]
|
||||
|
||||
int rhs();
|
||||
|
|
|
@ -47,14 +47,14 @@ void testComplexFloat(_Atomic(_Complex float) *fp) {
|
|||
// CHECK-NEXT: store [[CF]]*
|
||||
|
||||
// CHECK-NEXT: [[P:%.*]] = load [[CF]]** [[FP]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float 1.000000e+00, float* [[T0]]
|
||||
// CHECK-NEXT: store float 0.000000e+00, float* [[T1]]
|
||||
__c11_atomic_init(fp, 1.0f);
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float 2.000000e+00, float* [[T0]]
|
||||
// CHECK-NEXT: store float 0.000000e+00, float* [[T1]]
|
||||
_Atomic(_Complex float) x = 2.0f;
|
||||
|
@ -64,23 +64,23 @@ void testComplexFloat(_Atomic(_Complex float) *fp) {
|
|||
// CHECK-NEXT: [[T2:%.*]] = load atomic i64* [[T1]] seq_cst, align 8
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[CF]]* [[TMP0]] to i64*
|
||||
// CHECK-NEXT: store i64 [[T2]], i64* [[T3]], align 8
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[R:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[TMP0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[I:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float [[R]], float* [[T0]]
|
||||
// CHECK-NEXT: store float [[I]], float* [[T1]]
|
||||
_Complex float f = *fp;
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[R:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[I:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[DEST:%.*]] = load [[CF]]** [[FP]], align 4
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[TMP1]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP1]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float [[R]], float* [[T0]]
|
||||
// CHECK-NEXT: store float [[I]], float* [[T1]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[CF]]* [[TMP1]] to i64*
|
||||
|
@ -102,23 +102,23 @@ void testStruct(_Atomic(S) *fp) {
|
|||
// CHECK-NEXT: store [[S]]*
|
||||
|
||||
// CHECK-NEXT: [[P:%.*]] = load [[S]]** [[FP]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 3
|
||||
// CHECK-NEXT: store i16 4, i16* [[T0]], align 2
|
||||
__c11_atomic_init(fp, (S){1,2,3,4});
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 3
|
||||
// CHECK-NEXT: store i16 4, i16* [[T0]], align 2
|
||||
_Atomic(S) x = (S){1,2,3,4};
|
||||
|
||||
|
@ -155,23 +155,23 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[P:%.*]] = load [[APS]]** [[FP]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[APS]]* [[P]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[T0]], i8 0, i64 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T1]], align 2
|
||||
__c11_atomic_init(fp, (PS){1,2,3});
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[APS]]* [[X]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* [[T0]], i8 0, i32 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T1]], align 2
|
||||
_Atomic(PS) x = (PS){1,2,3};
|
||||
|
||||
|
@ -180,7 +180,7 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[T2:%.*]] = load atomic i64* [[T1]] seq_cst, align 8
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[APS]]* [[TMP0]] to i64*
|
||||
// CHECK-NEXT: store i64 [[T2]], i64* [[T3]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[PS]]* [[F]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[PS]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[T1]], i8* [[T2]], i32 6, i32 2, i1 false)
|
||||
|
@ -189,7 +189,7 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[T0:%.*]] = load [[APS]]** [[FP]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast { %struct.PS, [2 x i8] }* [[TMP1]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* [[T1]], i8 0, i32 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[APS]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[PS]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[PS]]* [[F]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[T2]], i8* [[T3]], i32 6, i32 2, i1 false)
|
||||
|
|
|
@ -183,14 +183,14 @@ void testComplexFloat(_Atomic(_Complex float) *fp) {
|
|||
// CHECK-NEXT: store [[CF]]*
|
||||
|
||||
// CHECK-NEXT: [[P:%.*]] = load [[CF]]** [[FP]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float 1.000000e+00, float* [[T0]]
|
||||
// CHECK-NEXT: store float 0.000000e+00, float* [[T1]]
|
||||
__c11_atomic_init(fp, 1.0f);
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float 2.000000e+00, float* [[T0]]
|
||||
// CHECK-NEXT: store float 0.000000e+00, float* [[T1]]
|
||||
_Atomic(_Complex float) x = 2.0f;
|
||||
|
@ -199,23 +199,23 @@ void testComplexFloat(_Atomic(_Complex float) *fp) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[CF]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[CF]]* [[TMP0]] to i8*
|
||||
// CHECK-NEXT: call arm_aapcscc void @__atomic_load(i32 8, i8* [[T1]], i8* [[T2]], i32 5)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[R:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[TMP0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[I:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float [[R]], float* [[T0]]
|
||||
// CHECK-NEXT: store float [[I]], float* [[T1]]
|
||||
_Complex float f = *fp;
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[R:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[F]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[I:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: [[DEST:%.*]] = load [[CF]]** [[FP]], align 4
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]]* [[TMP1]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[CF]], [[CF]]* [[TMP1]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float [[R]], float* [[T0]]
|
||||
// CHECK-NEXT: store float [[I]], float* [[T1]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[CF]]* [[DEST]] to i8*
|
||||
|
@ -237,23 +237,23 @@ void testStruct(_Atomic(S) *fp) {
|
|||
// CHECK-NEXT: store [[S]]*
|
||||
|
||||
// CHECK-NEXT: [[P:%.*]] = load [[S]]** [[FP]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[P]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[P]], i32 0, i32 3
|
||||
// CHECK-NEXT: store i16 4, i16* [[T0]], align 2
|
||||
__c11_atomic_init(fp, (S){1,2,3,4});
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]]* [[X]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[S]], [[S]]* [[X]], i32 0, i32 3
|
||||
// CHECK-NEXT: store i16 4, i16* [[T0]], align 2
|
||||
_Atomic(S) x = (S){1,2,3,4};
|
||||
|
||||
|
@ -292,23 +292,23 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[P:%.*]] = load [[APS]]** [[FP]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[APS]]* [[P]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[T0]], i8 0, i64 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[P]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T1]], align 2
|
||||
__c11_atomic_init(fp, (PS){1,2,3});
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[APS]]* [[X]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* [[T0]], i8 0, i32 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i16 1, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 2, i16* [[T1]], align 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[PS]], [[PS]]* [[T0]], i32 0, i32 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T1]], align 2
|
||||
_Atomic(PS) x = (PS){1,2,3};
|
||||
|
||||
|
@ -316,7 +316,7 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[APS]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[APS]]* [[TMP0]] to i8*
|
||||
// CHECK-NEXT: call arm_aapcscc void @__atomic_load(i32 8, i8* [[T1]], i8* [[T2]], i32 5)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[TMP0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[PS]]* [[F]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[PS]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[T1]], i8* [[T2]], i32 6, i32 2, i1 false)
|
||||
|
@ -325,7 +325,7 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[T0:%.*]] = load [[APS]]** [[FP]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast { %struct.PS, [2 x i8] }* [[TMP1]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* [[T1]], i8 0, i32 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[APS]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[TMP1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[PS]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[PS]]* [[F]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[T2]], i8* [[T3]], i32 6, i32 2, i1 false)
|
||||
|
@ -338,11 +338,11 @@ void testPromotedStruct(_Atomic(PS) *fp) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[APS]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[APS]]* [[TMP3]] to i8*
|
||||
// CHECK-NEXT: call arm_aapcscc void @__atomic_load(i32 8, i8* [[T1]], i8* [[T2]], i32 5)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]]* [[TMP3]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[APS]], [[APS]]* [[TMP3]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast %struct.PS* [[TMP2]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast %struct.PS* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[T1]], i8* [[T2]], i32 6, i32 2, i1 false)
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %struct.PS* [[TMP2]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %struct.PS, %struct.PS* [[TMP2]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T2:%.*]] = sext i16 [[T1]] to i32
|
||||
// CHECK-NEXT: store i32 [[T2]], i32* [[A]], align 4
|
||||
|
|
|
@ -14,7 +14,7 @@ int main ()
|
|||
|
||||
// CHECK-LABEL: define internal void @__main_block_invoke
|
||||
// CHECK: [[C1:%.*]] = alloca { double, double }, align 8
|
||||
// CHECK: [[RP:%.*]] = getelementptr inbounds { double, double }* [[C1]], i32 0, i32 0
|
||||
// CHECK: [[RP:%.*]] = getelementptr inbounds { double, double }, { double, double }* [[C1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[R:%.*]] = load double* [[RP]]
|
||||
// CHECK-NEXT: [[IP:%.*]] = getelementptr inbounds { double, double }* [[C1]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[IP:%.*]] = getelementptr inbounds { double, double }, { double, double }* [[C1]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[I:%.*]] = load double* [[IP]]
|
||||
|
|
|
@ -31,63 +31,63 @@ void test_nest_captured_stmt(int param, int size, int param_arr[size]) {
|
|||
arr[10][z.a] = 12;
|
||||
|
||||
// CHECK1: define internal void @__captured_stmt{{.*}}([[T]]
|
||||
// CHECK1: [[PARAM_ARR_SIZE_REF:%.+]] = getelementptr inbounds [[T]]* {{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 5
|
||||
// CHECK1: [[PARAM_ARR_SIZE_REF:%.+]] = getelementptr inbounds [[T]], [[T]]* {{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 5
|
||||
// CHECK1: [[PARAM_ARR_SIZE:%.+]] = load [[SIZE_TYPE]]* [[PARAM_ARR_SIZE_REF]]
|
||||
// CHECK1: [[ARR_SIZE1_REF:%.+]] = getelementptr inbounds [[T]]* {{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 8
|
||||
// CHECK1: [[ARR_SIZE1_REF:%.+]] = getelementptr inbounds [[T]], [[T]]* {{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 8
|
||||
// CHECK1: [[ARR_SIZE1:%.+]] = load [[SIZE_TYPE]]* [[ARR_SIZE1_REF]]
|
||||
// CHECK1: [[ARR_SIZE2_REF:%.+]] = getelementptr inbounds [[T]]* {{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 9
|
||||
// CHECK1: [[ARR_SIZE2_REF:%.+]] = getelementptr inbounds [[T]], [[T]]* {{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 9
|
||||
// CHECK1: [[ARR_SIZE2:%.+]] = load [[SIZE_TYPE]]* [[ARR_SIZE2_REF]]
|
||||
//
|
||||
// CHECK1: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK1: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK1-NEXT: load %struct.A**
|
||||
// CHECK1-NEXT: getelementptr inbounds %struct.A*
|
||||
// CHECK1-NEXT: getelementptr inbounds %struct.A, %struct.A*
|
||||
// CHECK1-NEXT: store i{{.+}} 1
|
||||
//
|
||||
// CHECK1: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK1: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK1-NEXT: load i{{[0-9]+}}**
|
||||
// CHECK1-NEXT: store i{{[0-9]+}} 1
|
||||
//
|
||||
// CHECK1: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK1: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK1-NEXT: load i{{[0-9]+}}**
|
||||
// CHECK1-NEXT: store i{{[0-9]+}} 1
|
||||
//
|
||||
// CHECK1: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK1: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK1-NEXT: load i{{[0-9]+}}**
|
||||
// CHECK1-NEXT: load i{{[0-9]+}}*
|
||||
// CHECK1-NEXT: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK1-NEXT: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK1-NEXT: load i{{[0-9]+}}***
|
||||
// CHECK1-NEXT: load i{{[0-9]+}}**
|
||||
// CHECK1-NEXT: store i{{[0-9]+}}
|
||||
//
|
||||
// CHECK1: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK1: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK1-NEXT: load %struct.A**
|
||||
// CHECK1-NEXT: getelementptr inbounds %struct.A*
|
||||
// CHECK1-NEXT: getelementptr inbounds %struct.A, %struct.A*
|
||||
// CHECK1-NEXT: store float
|
||||
//
|
||||
// CHECK1: getelementptr inbounds [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK1: getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK1-NEXT: load %struct.A**
|
||||
// CHECK1-NEXT: getelementptr inbounds %struct.A*
|
||||
// CHECK1-NEXT: getelementptr inbounds %struct.A, %struct.A*
|
||||
// CHECK1-NEXT: store i8 99
|
||||
//
|
||||
// CHECK1: [[SIZE_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 7
|
||||
// CHECK1: [[SIZE_ADDR_REF:%.*]] = getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 7
|
||||
// CHECK1-DAG: [[SIZE_ADDR:%.*]] = load i{{.+}}** [[SIZE_ADDR_REF]]
|
||||
// CHECK1-DAG: [[SIZE:%.*]] = load i{{.+}}* [[SIZE_ADDR]]
|
||||
// CHECK1-DAG: [[PARAM_ARR_IDX:%.*]] = sub nsw i{{.+}} [[SIZE]], 1
|
||||
// CHECK1-DAG: [[PARAM_ARR_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 6
|
||||
// CHECK1-DAG: [[PARAM_ARR_ADDR_REF:%.*]] = getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 6
|
||||
// CHECK1-DAG: [[PARAM_ARR_ADDR:%.*]] = load i{{.+}}*** [[PARAM_ARR_ADDR_REF]]
|
||||
// CHECK1-DAG: [[PARAM_ARR:%.*]] = load i{{.+}}** [[PARAM_ARR_ADDR]]
|
||||
// CHECK1-DAG: [[PARAM_ARR_SIZE_MINUS_1_ADDR:%.*]] = getelementptr inbounds i{{.+}}* [[PARAM_ARR]], i{{.*}}
|
||||
// CHECK1-DAG: [[PARAM_ARR_SIZE_MINUS_1_ADDR:%.*]] = getelementptr inbounds i{{.+}}, i{{.+}}* [[PARAM_ARR]], i{{.*}}
|
||||
// CHECK1: store i{{.+}} 2, i{{.+}}* [[PARAM_ARR_SIZE_MINUS_1_ADDR]]
|
||||
//
|
||||
// CHECK1: [[Z_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK1: [[Z_ADDR_REF:%.*]] = getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK1-DAG: [[Z_ADDR:%.*]] = load %struct.A** [[Z_ADDR_REF]]
|
||||
// CHECK1-DAG: [[Z_A_ADDR:%.*]] = getelementptr inbounds %struct.A* [[Z_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK1-DAG: [[Z_A_ADDR:%.*]] = getelementptr inbounds %struct.A, %struct.A* [[Z_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK1-DAG: [[ARR_IDX_2:%.*]] = load i{{.+}}* [[Z_A_ADDR]]
|
||||
// CHECK1-DAG: [[ARR_ADDR_REF:%.*]] = getelementptr inbounds [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 10
|
||||
// CHECK1-DAG: [[ARR_ADDR_REF:%.*]] = getelementptr inbounds [[T]], [[T]]* {{.*}}, i{{.+}} 0, i{{.+}} 10
|
||||
// CHECK1-DAG: [[ARR_ADDR:%.*]] = load i{{.+}}** [[ARR_ADDR_REF]]
|
||||
// CHECK1-DAG: [[ARR_IDX_1:%.*]] = mul {{.*}} 10
|
||||
// CHECK1-DAG: [[ARR_10_ADDR:%.*]] = getelementptr inbounds i{{.+}}* [[ARR_ADDR]], i{{.*}} [[ARR_IDX_1]]
|
||||
// CHECK1-DAG: [[ARR_10_Z_A_ADDR:%.*]] = getelementptr inbounds i{{.+}}* [[ARR_10_ADDR]], i{{.*}}
|
||||
// CHECK1-DAG: [[ARR_10_ADDR:%.*]] = getelementptr inbounds i{{.+}}, i{{.+}}* [[ARR_ADDR]], i{{.*}} [[ARR_IDX_1]]
|
||||
// CHECK1-DAG: [[ARR_10_Z_A_ADDR:%.*]] = getelementptr inbounds i{{.+}}, i{{.+}}* [[ARR_10_ADDR]], i{{.*}}
|
||||
// CHECK1: store i{{.+}} 12, i{{.+}}* [[ARR_10_Z_A_ADDR]]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ void test1() {
|
|||
//
|
||||
// CHECK-1: test1
|
||||
// CHECK-1: alloca %struct.anon
|
||||
// CHECK-1: getelementptr inbounds %struct.anon*
|
||||
// CHECK-1: getelementptr inbounds %struct.anon, %struct.anon*
|
||||
// CHECK-1: store i32* %i
|
||||
// CHECK-1: call void @[[HelperName:__captured_stmt[0-9]+]]
|
||||
}
|
||||
|
|
|
@ -32,219 +32,219 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK: alloca i[[LLSIZE]], align [[LLALIGN:[0-9]+]]
|
||||
|
||||
sc1 = csc;
|
||||
// CHECK: %[[VAR1:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: %[[VAR1:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR2:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR1]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR2]], i[[CHSIZE]]* %[[SC1:[A-Za-z0-9.]+]], align [[CHALIGN]]
|
||||
|
||||
sc1 = cuc;
|
||||
// CHECK-NEXT: %[[VAR3:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR3:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR4:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR3]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR4]], i[[CHSIZE]]* %[[SC1]], align [[CHALIGN]]
|
||||
|
||||
sc1 = csll;
|
||||
// CHECK-NEXT: %[[VAR5:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR5:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR6:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR5]]
|
||||
// CHECK-NEXT: %[[VAR7:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR6]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR7]], i[[CHSIZE]]* %[[SC1]], align [[CHALIGN]]
|
||||
|
||||
sc1 = cull;
|
||||
// CHECK-NEXT: %[[VAR8:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR8:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR9:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR8]]
|
||||
// CHECK-NEXT: %[[VAR10:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR9]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR10]], i[[CHSIZE]]* %[[SC1]], align [[CHALIGN]]
|
||||
|
||||
uc1 = csc;
|
||||
// CHECK-NEXT: %[[VAR11:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR11:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR12:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR11]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR12]], i[[CHSIZE]]* %[[UC1:[A-Za-z0-9.]+]], align [[CHALIGN]]
|
||||
|
||||
uc1 = cuc;
|
||||
// CHECK-NEXT: %[[VAR13:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR13:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR14:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR13]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR14]], i[[CHSIZE]]* %[[UC1]], align [[CHALIGN]]
|
||||
|
||||
uc1 = csll;
|
||||
// CHECK-NEXT: %[[VAR15:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR15:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR16:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR15]]
|
||||
// CHECK-NEXT: %[[VAR17:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR16]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR17]], i[[CHSIZE]]* %[[UC1]], align [[CHALIGN]]
|
||||
|
||||
uc1 = cull;
|
||||
// CHECK-NEXT: %[[VAR18:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR18:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR19:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR18]]
|
||||
// CHECK-NEXT: %[[VAR20:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR19]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR20]], i[[CHSIZE]]* %[[UC1]], align [[CHALIGN]]
|
||||
|
||||
sll1 = csc;
|
||||
// CHECK-NEXT: %[[VAR21:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR21:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR22:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR21]]
|
||||
// CHECK-NEXT: %[[VAR23:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR22]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR23]], i[[LLSIZE]]* %[[SLL1:[A-Za-z0-9]+]], align [[LLALIGN]]
|
||||
|
||||
sll1 = cuc;
|
||||
// CHECK-NEXT: %[[VAR24:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR24:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR25:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR24]]
|
||||
// CHECK-NEXT: %[[VAR26:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR25]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR26]], i[[LLSIZE]]* %[[SLL1]], align [[LLALIGN]]
|
||||
|
||||
sll1 = csll;
|
||||
// CHECK-NEXT: %[[VAR27:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR27:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR28:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR27]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR28]], i[[LLSIZE]]* %[[SLL1]], align [[LLALIGN]]
|
||||
|
||||
sll1 = cull;
|
||||
// CHECK-NEXT: %[[VAR29:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR29:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR30:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR29]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR30]], i[[LLSIZE]]* %[[SLL1]], align [[LLALIGN]]
|
||||
|
||||
ull1 = csc;
|
||||
// CHECK-NEXT: %[[VAR31:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR31:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR32:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR31]]
|
||||
// CHECK-NEXT: %[[VAR33:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR32]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR33]], i[[LLSIZE]]* %[[ULL1:[A-Za-z0-9]+]], align [[LLALIGN]]
|
||||
|
||||
ull1 = cuc;
|
||||
// CHECK-NEXT: %[[VAR34:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR34:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR35:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR34]]
|
||||
// CHECK-NEXT: %[[VAR36:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR35]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR36]], i[[LLSIZE]]* %[[ULL1]], align [[LLALIGN]]
|
||||
|
||||
ull1 = csll;
|
||||
// CHECK-NEXT: %[[VAR37:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR37:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR38:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR37]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR38]], i[[LLSIZE]]* %[[ULL1]], align [[LLALIGN]]
|
||||
|
||||
ull1 = cull;
|
||||
// CHECK-NEXT: %[[VAR39:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR39:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR40:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR39]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR40]], i[[LLSIZE]]* %[[ULL1]], align [[LLALIGN]]
|
||||
|
||||
csc1 = sc;
|
||||
// CHECK-NEXT: %[[VAR41:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR:[A-Za-z0-9.]+]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR42:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR43:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR42:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR43:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR41]], i[[CHSIZE]]* %[[VAR42]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR43]]
|
||||
|
||||
csc1 = uc;
|
||||
// CHECK-NEXT: %[[VAR44:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR:[A-Za-z0-9.]+]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR45:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR46:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR45:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR46:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR44]], i[[CHSIZE]]* %[[VAR45]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR46]]
|
||||
|
||||
csc1 = sll;
|
||||
// CHECK-NEXT: %[[VAR47:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR:[A-Za-z0-9.]+]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR48:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR47]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR49:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR50:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR49:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR50:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR48]], i[[CHSIZE]]* %[[VAR49]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR50]]
|
||||
|
||||
csc1 = ull;
|
||||
// CHECK-NEXT: %[[VAR51:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR:[A-Za-z0-9.]+]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR52:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR51]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR53:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR54:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR53:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR54:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR52]], i[[CHSIZE]]* %[[VAR53]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR54]]
|
||||
|
||||
cuc1 = sc;
|
||||
// CHECK-NEXT: %[[VAR55:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR56:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR57:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR56:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR57:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR55]], i[[CHSIZE]]* %[[VAR56]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR57]]
|
||||
|
||||
cuc1 = uc;
|
||||
// CHECK-NEXT: %[[VAR58:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR59:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR60:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR59:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR60:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR58]], i[[CHSIZE]]* %[[VAR59]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR60]]
|
||||
|
||||
cuc1 = sll;
|
||||
// CHECK-NEXT: %[[VAR61:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR62:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR61]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR63:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR64:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR63:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR64:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR62]], i[[CHSIZE]]* %[[VAR63]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR64]]
|
||||
|
||||
cuc1 = ull;
|
||||
// CHECK-NEXT: %[[VAR65:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR66:[A-Za-z0-9.]+]] = trunc i[[LLSIZE]] %[[VAR65]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR67:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR68:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR67:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR68:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR66]], i[[CHSIZE]]* %[[VAR67]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] 0, i[[CHSIZE]]* %[[VAR68]]
|
||||
|
||||
csll1 = sc;
|
||||
// CHECK-NEXT: %[[VAR69:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR70:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR69]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR71:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR72:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR71:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR72:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR70]], i[[LLSIZE]]* %[[VAR71]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR72]]
|
||||
|
||||
csll1 = uc;
|
||||
// CHECK-NEXT: %[[VAR73:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR74:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR73]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR75:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR76:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR75:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR76:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR74]], i[[LLSIZE]]* %[[VAR75]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR76]]
|
||||
|
||||
csll1 = sll;
|
||||
// CHECK-NEXT: %[[VAR77:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR78:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR79:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR78:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR79:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR77]], i[[LLSIZE]]* %[[VAR78]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR79]]
|
||||
|
||||
csll1 = ull;
|
||||
// CHECK-NEXT: %[[VAR77:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR78:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR79:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR78:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR79:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR77]], i[[LLSIZE]]* %[[VAR78]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR79]]
|
||||
|
||||
cull1 = sc;
|
||||
// CHECK-NEXT: %[[VAR80:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR81:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR80]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR82:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR83:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR82:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1:[A-Za-z0-9.]+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR83:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR81]], i[[LLSIZE]]* %[[VAR82]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR83]]
|
||||
|
||||
cull1 = uc;
|
||||
// CHECK-NEXT: %[[VAR84:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR85:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR84]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR86:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR87:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR86:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR87:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR85]], i[[LLSIZE]]* %[[VAR86]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR87]]
|
||||
|
||||
cull1 = sll;
|
||||
// CHECK-NEXT: %[[VAR88:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR89:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR90:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR89:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR90:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR88]], i[[LLSIZE]]* %[[VAR89]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR90]]
|
||||
|
||||
cull1 = ull;
|
||||
// CHECK-NEXT: %[[VAR91:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR92:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR93:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR92:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR93:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR91]], i[[LLSIZE]]* %[[VAR92]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] 0, i[[LLSIZE]]* %[[VAR93]]
|
||||
|
||||
csc1 = sc + csc;
|
||||
// CHECK-NEXT: %[[VAR94:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR95:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR94]] to i[[ARSIZE:[0-9]+]]
|
||||
// CHECK-NEXT: %[[VAR96:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR96:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR97:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR96]]
|
||||
// CHECK-NEXT: %[[VAR98:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR98:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR99:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR98]]
|
||||
// CHECK-NEXT: %[[VAR100:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR97]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR101:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR99]] to i[[ARSIZE]]
|
||||
|
@ -252,17 +252,17 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR103:[A-Za-z0-9.]+]] = add i[[ARSIZE]] 0, %[[VAR101]]
|
||||
// CHECK-NEXT: %[[VAR104:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR102]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR105:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR103]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR106:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR107:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR106:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR107:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR104]], i[[CHSIZE]]* %[[VAR106]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR105]], i[[CHSIZE]]* %[[VAR107]]
|
||||
|
||||
cuc1 = sc + cuc;
|
||||
// CHECK-NEXT: %[[VAR108:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR109:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR108]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR110:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR110:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR111:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR110]]
|
||||
// CHECK-NEXT: %[[VAR112:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR112:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR113:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR112]]
|
||||
// CHECK-NEXT: %[[VAR114:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR111]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR115:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR113]] to i[[ARSIZE]]
|
||||
|
@ -270,45 +270,45 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR117:[A-Za-z0-9.]+]] = add i[[ARSIZE]] 0, %[[VAR115]]
|
||||
// CHECK-NEXT: %[[VAR118:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR116]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR119:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR117]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR120:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR121:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR120:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR121:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR118]], i[[CHSIZE]]* %[[VAR120]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR119]], i[[CHSIZE]]* %[[VAR121]]
|
||||
|
||||
csll1 = sc + csll;
|
||||
// CHECK-NEXT: %[[VAR122:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR123:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR122]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR124:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR124:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR125:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR124]]
|
||||
// CHECK-NEXT: %[[VAR126:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR126:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR127:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR126]]
|
||||
// CHECK-NEXT: %[[VAR128:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR123]], %[[VAR125]]
|
||||
// CHECK-NEXT: %[[VAR129:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR127]]
|
||||
// CHECK-NEXT: %[[VAR130:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR131:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR130:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR131:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR128]], i[[LLSIZE]]* %[[VAR130]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR129]], i[[LLSIZE]]* %[[VAR131]]
|
||||
|
||||
cull1 = sc + cull;
|
||||
// CHECK-NEXT: %[[VAR132:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR133:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR132]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR134:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR134:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR135:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR134]]
|
||||
// CHECK-NEXT: %[[VAR136:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR136:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR137:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR136]]
|
||||
// CHECK-NEXT: %[[VAR138:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR133]], %[[VAR135]]
|
||||
// CHECK-NEXT: %[[VAR139:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR137]]
|
||||
// CHECK-NEXT: %[[VAR140:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR141:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR140:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR141:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR138]], i[[LLSIZE]]* %[[VAR140]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR139]], i[[LLSIZE]]* %[[VAR141]]
|
||||
|
||||
csc1 = uc + csc;
|
||||
// CHECK-NEXT: %[[VAR142:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR143:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR142]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR144:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR144:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR145:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR144]]
|
||||
// CHECK-NEXT: %[[VAR146:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR146:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR147:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR146]]
|
||||
// CHECK-NEXT: %[[VAR148:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR145]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR149:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR147]] to i[[ARSIZE]]
|
||||
|
@ -316,17 +316,17 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR151:[A-Za-z0-9.]+]] = add i[[ARSIZE]] 0, %[[VAR149]]
|
||||
// CHECK-NEXT: %[[VAR152:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR150]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR153:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR151]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR154:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR155:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR154:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR155:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR152]], i[[CHSIZE]]* %[[VAR154]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR153]], i[[CHSIZE]]* %[[VAR155]]
|
||||
|
||||
cuc1 = uc + cuc;
|
||||
// CHECK-NEXT: %[[VAR156:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR157:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR156]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR158:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR158:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR159:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR158]]
|
||||
// CHECK-NEXT: %[[VAR160:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR160:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR161:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR160]]
|
||||
// CHECK-NEXT: %[[VAR162:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR159]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR163:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR161]] to i[[ARSIZE]]
|
||||
|
@ -334,155 +334,155 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR165:[A-Za-z0-9.]+]] = add i[[ARSIZE]] 0, %[[VAR163]]
|
||||
// CHECK-NEXT: %[[VAR166:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR164]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR167:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR165]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR168:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR169:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR168:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR169:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR166]], i[[CHSIZE]]* %[[VAR168]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR167]], i[[CHSIZE]]* %[[VAR169]]
|
||||
|
||||
csll1 = uc + csll;
|
||||
// CHECK-NEXT: %[[VAR170:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR171:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR170]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR172:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR172:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR173:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR172]]
|
||||
// CHECK-NEXT: %[[VAR174:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR174:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR175:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR174]]
|
||||
// CHECK-NEXT: %[[VAR176:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR171]], %[[VAR173]]
|
||||
// CHECK-NEXT: %[[VAR177:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR175]]
|
||||
// CHECK-NEXT: %[[VAR178:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR179:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR178:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR179:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR176]], i[[LLSIZE]]* %[[VAR178]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR177]], i[[LLSIZE]]* %[[VAR179]]
|
||||
|
||||
cull1 = uc + cull;
|
||||
// CHECK-NEXT: %[[VAR180:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR181:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR180]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR182:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR182:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR183:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR182]]
|
||||
// CHECK-NEXT: %[[VAR184:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR184:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR185:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR184]]
|
||||
// CHECK-NEXT: %[[VAR186:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR181]], %[[VAR183]]
|
||||
// CHECK-NEXT: %[[VAR187:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR185]]
|
||||
// CHECK-NEXT: %[[VAR188:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR189:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR188:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR189:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR186]], i[[LLSIZE]]* %[[VAR188]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR187]], i[[LLSIZE]]* %[[VAR189]]
|
||||
|
||||
csll1 = sll + csc;
|
||||
// CHECK-NEXT: %[[VAR190:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR191:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR191:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR192:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR191]]
|
||||
// CHECK-NEXT: %[[VAR193:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR193:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR194:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR193]]
|
||||
// CHECK-NEXT: %[[VAR195:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR192]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR196:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR194]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR197:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR190]], %[[VAR195]]
|
||||
// CHECK-NEXT: %[[VAR198:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR196]]
|
||||
// CHECK-NEXT: %[[VAR199:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR200:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR199:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR200:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR197]], i[[LLSIZE]]* %[[VAR199]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR198]], i[[LLSIZE]]* %[[VAR200]]
|
||||
|
||||
csll1 = sll + cuc;
|
||||
// CHECK-NEXT: %[[VAR201:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR202:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR202:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR203:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR202]]
|
||||
// CHECK-NEXT: %[[VAR204:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR204:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR205:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR204]]
|
||||
// CHECK-NEXT: %[[VAR206:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR203]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR207:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR205]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR208:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR201]], %[[VAR206]]
|
||||
// CHECK-NEXT: %[[VAR209:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR207]]
|
||||
// CHECK-NEXT: %[[VAR210:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR211:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR210:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR211:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR208]], i[[LLSIZE]]* %[[VAR210]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR209]], i[[LLSIZE]]* %[[VAR211]]
|
||||
|
||||
csll1 = sll + csll;
|
||||
// CHECK-NEXT: %[[VAR212:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR213:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR213:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR214:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR213]]
|
||||
// CHECK-NEXT: %[[VAR215:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR215:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR216:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR215]]
|
||||
// CHECK-NEXT: %[[VAR217:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR212]], %[[VAR214]]
|
||||
// CHECK-NEXT: %[[VAR218:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR216]]
|
||||
// CHECK-NEXT: %[[VAR219:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR220:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR219:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR220:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR217]], i[[LLSIZE]]* %[[VAR219]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR218]], i[[LLSIZE]]* %[[VAR220]]
|
||||
|
||||
csll1 = sll + cull;
|
||||
// CHECK-NEXT: %[[VAR221:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR222:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR222:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR223:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR222]]
|
||||
// CHECK-NEXT: %[[VAR224:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR224:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR225:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR224]]
|
||||
// CHECK-NEXT: %[[VAR226:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR221]], %[[VAR223]]
|
||||
// CHECK-NEXT: %[[VAR227:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR225]]
|
||||
// CHECK-NEXT: %[[VAR228:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR229:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR228:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR229:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR226]], i[[LLSIZE]]* %[[VAR228]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR227]], i[[LLSIZE]]* %[[VAR229]]
|
||||
|
||||
csll1 = ull + csc;
|
||||
// CHECK-NEXT: %[[VAR230:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR231:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR231:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR232:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR231]]
|
||||
// CHECK-NEXT: %[[VAR233:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR233:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR234:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR233]]
|
||||
// CHECK-NEXT: %[[VAR235:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR232]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR236:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR234]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR237:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR230]], %[[VAR235]]
|
||||
// CHECK-NEXT: %[[VAR238:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR236]]
|
||||
// CHECK-NEXT: %[[VAR239:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR240:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR239:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR240:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR237]], i[[LLSIZE]]* %[[VAR239]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR238]], i[[LLSIZE]]* %[[VAR240]]
|
||||
|
||||
cull1 = ull + cuc;
|
||||
// CHECK-NEXT: %[[VAR241:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR242:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR242:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR243:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR242]]
|
||||
// CHECK-NEXT: %[[VAR244:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR244:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR245:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR244]]
|
||||
// CHECK-NEXT: %[[VAR246:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR243]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR247:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR245]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR248:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR241]], %[[VAR246]]
|
||||
// CHECK-NEXT: %[[VAR249:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR247]]
|
||||
// CHECK-NEXT: %[[VAR250:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR251:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR250:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR251:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR248]], i[[LLSIZE]]* %[[VAR250]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR249]], i[[LLSIZE]]* %[[VAR251]]
|
||||
|
||||
csll1 = ull + csll;
|
||||
// CHECK-NEXT: %[[VAR252:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR253:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR253:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR254:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR253]]
|
||||
// CHECK-NEXT: %[[VAR255:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR255:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR256:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR255]]
|
||||
// CHECK-NEXT: %[[VAR257:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR252]], %[[VAR254]]
|
||||
// CHECK-NEXT: %[[VAR258:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR256]]
|
||||
// CHECK-NEXT: %[[VAR259:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR260:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR259:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR260:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR257]], i[[LLSIZE]]* %[[VAR259]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR258]], i[[LLSIZE]]* %[[VAR260]]
|
||||
|
||||
cull1 = ull + cull;
|
||||
// CHECK-NEXT: %[[VAR261:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR262:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR262:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR263:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR262]]
|
||||
// CHECK-NEXT: %[[VAR264:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR264:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR265:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR264]]
|
||||
// CHECK-NEXT: %[[VAR266:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR261]], %[[VAR263]]
|
||||
// CHECK-NEXT: %[[VAR267:[A-Za-z0-9.]+]] = add i[[LLSIZE]] 0, %[[VAR265]]
|
||||
// CHECK-NEXT: %[[VAR268:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR269:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR268:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR269:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR266]], i[[LLSIZE]]* %[[VAR268]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR267]], i[[LLSIZE]]* %[[VAR269]]
|
||||
|
||||
csc1 = csc + sc;
|
||||
// CHECK-NEXT: %[[VAR270:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR270:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR271:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR270]]
|
||||
// CHECK-NEXT: %[[VAR272:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR272:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR273:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR272]]
|
||||
// CHECK-NEXT: %[[VAR274:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR271]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR275:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR273]] to i[[ARSIZE]]
|
||||
|
@ -492,15 +492,15 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR279:[A-Za-z0-9.]+]] = add i[[ARSIZE]] %[[VAR275]], 0
|
||||
// CHECK-NEXT: %[[VAR280:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR278]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR281:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR279]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR282:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR283:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR282:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR283:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR280]], i[[CHSIZE]]* %[[VAR282]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR281]], i[[CHSIZE]]* %[[VAR283]]
|
||||
|
||||
csc1 = csc + uc;
|
||||
// CHECK-NEXT: %[[VAR284:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR284:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR285:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR284]]
|
||||
// CHECK-NEXT: %[[VAR286:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR286:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR287:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR286]]
|
||||
// CHECK-NEXT: %[[VAR288:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR285]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR289:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR287]] to i[[ARSIZE]]
|
||||
|
@ -510,45 +510,45 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR293:[A-Za-z0-9.]+]] = add i[[ARSIZE]] %[[VAR289]], 0
|
||||
// CHECK-NEXT: %[[VAR294:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR292]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR295:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR293]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR296:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR297:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR296:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR297:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR294]], i[[CHSIZE]]* %[[VAR296]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR295]], i[[CHSIZE]]* %[[VAR297]]
|
||||
|
||||
csll1 = csc + sll;
|
||||
// CHECK-NEXT: %[[VAR298:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR298:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR299:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR298]]
|
||||
// CHECK-NEXT: %[[VAR300:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR300:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR301:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR300]]
|
||||
// CHECK-NEXT: %[[VAR302:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR299]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR303:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR301]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR304:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR305:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR302]], %[[VAR304]]
|
||||
// CHECK-NEXT: %[[VAR306:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR303]], 0
|
||||
// CHECK-NEXT: %[[VAR307:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR308:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR307:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR308:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR305]], i[[LLSIZE]]* %[[VAR307]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR306]], i[[LLSIZE]]* %[[VAR308]]
|
||||
|
||||
csll1 = csc + ull;
|
||||
// CHECK-NEXT: %[[VAR309:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR309:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR310:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR309]]
|
||||
// CHECK-NEXT: %[[VAR311:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR311:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR312:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR311]]
|
||||
// CHECK-NEXT: %[[VAR313:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR310]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR314:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR312]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR315:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR316:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR313]], %[[VAR315]]
|
||||
// CHECK-NEXT: %[[VAR317:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR314]], 0
|
||||
// CHECK-NEXT: %[[VAR318:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR319:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR318:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR319:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR316]], i[[LLSIZE]]* %[[VAR318]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR317]], i[[LLSIZE]]* %[[VAR319]]
|
||||
|
||||
csc1 = cuc + sc;
|
||||
// CHECK-NEXT: %[[VAR320:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR320:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR321:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR320]]
|
||||
// CHECK-NEXT: %[[VAR322:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR322:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR323:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR322]]
|
||||
// CHECK-NEXT: %[[VAR324:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR321]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR325:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR323]] to i[[ARSIZE]]
|
||||
|
@ -558,15 +558,15 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR329:[A-Za-z0-9.]+]] = add i[[ARSIZE]] %[[VAR325]], 0
|
||||
// CHECK-NEXT: %[[VAR330:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR328]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR331:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR329]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR332:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR333:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR332:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR333:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CSC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR330]], i[[CHSIZE]]* %[[VAR332]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR331]], i[[CHSIZE]]* %[[VAR333]]
|
||||
|
||||
cuc1 = cuc + uc;
|
||||
// CHECK-NEXT: %[[VAR334:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR334:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR335:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR334]]
|
||||
// CHECK-NEXT: %[[VAR336:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR336:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR337:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR336]]
|
||||
// CHECK-NEXT: %[[VAR338:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR335]] to i[[ARSIZE]]
|
||||
// CHECK-NEXT: %[[VAR339:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR337]] to i[[ARSIZE]]
|
||||
|
@ -576,146 +576,146 @@ void foo(signed char sc, unsigned char uc, signed long long sll,
|
|||
// CHECK-NEXT: %[[VAR343:[A-Za-z0-9.]+]] = add i[[ARSIZE]] %[[VAR339]], 0
|
||||
// CHECK-NEXT: %[[VAR344:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR342]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR345:[A-Za-z0-9.]+]] = trunc i[[ARSIZE]] %[[VAR343]] to i[[CHSIZE]]
|
||||
// CHECK-NEXT: %[[VAR346:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR347:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR346:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR347:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR344]], i[[CHSIZE]]* %[[VAR346]]
|
||||
// CHECK-NEXT: store i[[CHSIZE]] %[[VAR345]], i[[CHSIZE]]* %[[VAR347]]
|
||||
|
||||
csll1 = cuc + sll;
|
||||
// CHECK-NEXT: %[[VAR348:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR348:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR349:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR348]]
|
||||
// CHECK-NEXT: %[[VAR350:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR350:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR351:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR350]]
|
||||
// CHECK-NEXT: %[[VAR352:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR349]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR353:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR351]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR354:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR355:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR352]], %[[VAR354]]
|
||||
// CHECK-NEXT: %[[VAR356:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR353]], 0
|
||||
// CHECK-NEXT: %[[VAR357:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR358:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR357:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR358:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR355]], i[[LLSIZE]]* %[[VAR357]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR356]], i[[LLSIZE]]* %[[VAR358]]
|
||||
|
||||
cull1 = cuc + ull;
|
||||
// CHECK-NEXT: %[[VAR357:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR357:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR358:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR357]]
|
||||
// CHECK-NEXT: %[[VAR359:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR359:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[CHSIZE]], i[[CHSIZE]] }, { i[[CHSIZE]], i[[CHSIZE]] }* %[[CUC]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR360:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[VAR359]]
|
||||
// CHECK-NEXT: %[[VAR361:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR358]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR362:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR360]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR363:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR364:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR361]], %[[VAR363]]
|
||||
// CHECK-NEXT: %[[VAR365:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR362]], 0
|
||||
// CHECK-NEXT: %[[VAR366:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR367:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR366:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR367:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR364]], i[[LLSIZE]]* %[[VAR366]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR365]], i[[LLSIZE]]* %[[VAR367]]
|
||||
|
||||
csll1 = csll + sc;
|
||||
// CHECK-NEXT: %[[VAR368:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR368:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR369:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR368]]
|
||||
// CHECK-NEXT: %[[VAR370:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR370:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR371:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR370]]
|
||||
// CHECK-NEXT: %[[VAR372:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR373:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR372]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR374:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR369]], %[[VAR373]]
|
||||
// CHECK-NEXT: %[[VAR375:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR371]], 0
|
||||
// CHECK-NEXT: %[[VAR376:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR377:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR376:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR377:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR374]], i[[LLSIZE]]* %[[VAR376]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR375]], i[[LLSIZE]]* %[[VAR377]]
|
||||
|
||||
csll1 = csll + uc;
|
||||
// CHECK-NEXT: %[[VAR378:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR378:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR379:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR378]]
|
||||
// CHECK-NEXT: %[[VAR380:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR380:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR381:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR380]]
|
||||
// CHECK-NEXT: %[[VAR382:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR383:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR382]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR384:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR379]], %[[VAR383]]
|
||||
// CHECK-NEXT: %[[VAR385:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR381]], 0
|
||||
// CHECK-NEXT: %[[VAR386:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR387:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR386:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR387:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR384]], i[[LLSIZE]]* %[[VAR386]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR385]], i[[LLSIZE]]* %[[VAR387]]
|
||||
|
||||
csll1 = csll + sll;
|
||||
// CHECK-NEXT: %[[VAR388:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR388:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR389:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR388]]
|
||||
// CHECK-NEXT: %[[VAR390:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR390:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR391:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR390]]
|
||||
// CHECK-NEXT: %[[VAR392:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR393:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR389]], %[[VAR392]]
|
||||
// CHECK-NEXT: %[[VAR394:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR391]], 0
|
||||
// CHECK-NEXT: %[[VAR395:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR396:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR395:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR396:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR393]], i[[LLSIZE]]* %[[VAR395]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR394]], i[[LLSIZE]]* %[[VAR396]]
|
||||
|
||||
csll1 = csll + ull;
|
||||
// CHECK-NEXT: %[[VAR397:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR397:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR398:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR397]]
|
||||
// CHECK-NEXT: %[[VAR399:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR399:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR400:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR399]]
|
||||
// CHECK-NEXT: %[[VAR401:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR402:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR398]], %[[VAR401]]
|
||||
// CHECK-NEXT: %[[VAR403:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR400]], 0
|
||||
// CHECK-NEXT: %[[VAR404:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR405:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR404:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR405:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR402]], i[[LLSIZE]]* %[[VAR404]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR403]], i[[LLSIZE]]* %[[VAR405]]
|
||||
|
||||
csll1 = cull + sc;
|
||||
// CHECK-NEXT: %[[VAR406:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR406:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR407:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR406]]
|
||||
// CHECK-NEXT: %[[VAR408:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR408:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR409:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR408]]
|
||||
// CHECK-NEXT: %[[VAR410:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[SCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR411:[A-Za-z0-9.]+]] = sext i[[CHSIZE]] %[[VAR410]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR412:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR407]], %[[VAR411]]
|
||||
// CHECK-NEXT: %[[VAR413:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR409]], 0
|
||||
// CHECK-NEXT: %[[VAR414:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR415:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR414:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR415:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR412]], i[[LLSIZE]]* %[[VAR414]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR413]], i[[LLSIZE]]* %[[VAR415]]
|
||||
|
||||
cull1 = cull + uc;
|
||||
// CHECK-NEXT: %[[VAR416:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR416:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR417:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR416]]
|
||||
// CHECK-NEXT: %[[VAR418:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR418:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR419:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR418]]
|
||||
// CHECK-NEXT: %[[VAR420:[A-Za-z0-9.]+]] = load i[[CHSIZE]]* %[[UCADDR]], align [[CHALIGN]]
|
||||
// CHECK-NEXT: %[[VAR421:[A-Za-z0-9.]+]] = zext i[[CHSIZE]] %[[VAR420]] to i[[LLSIZE]]
|
||||
// CHECK-NEXT: %[[VAR422:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR417]], %[[VAR421]]
|
||||
// CHECK-NEXT: %[[VAR423:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR419]], 0
|
||||
// CHECK-NEXT: %[[VAR424:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR425:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR424:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR425:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR422]], i[[LLSIZE]]* %[[VAR424]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR423]], i[[LLSIZE]]* %[[VAR425]]
|
||||
|
||||
csll1 = cull + sll;
|
||||
// CHECK-NEXT: %[[VAR426:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR426:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR427:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR426]]
|
||||
// CHECK-NEXT: %[[VAR428:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR428:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR429:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR428]]
|
||||
// CHECK-NEXT: %[[VAR430:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[SLLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR431:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR427]], %[[VAR430]]
|
||||
// CHECK-NEXT: %[[VAR432:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR429]], 0
|
||||
// CHECK-NEXT: %[[VAR433:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR434:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR433:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR434:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CSLL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR431]], i[[LLSIZE]]* %[[VAR433]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR432]], i[[LLSIZE]]* %[[VAR434]]
|
||||
|
||||
cull1 = cull + ull;
|
||||
// CHECK-NEXT: %[[VAR435:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR435:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR436:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR435]]
|
||||
// CHECK-NEXT: %[[VAR437:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR437:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR438:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[VAR437]]
|
||||
// CHECK-NEXT: %[[VAR439:[A-Za-z0-9.]+]] = load i[[LLSIZE]]* %[[ULLADDR]], align [[LLALIGN]]
|
||||
// CHECK-NEXT: %[[VAR440:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR436]], %[[VAR439]]
|
||||
// CHECK-NEXT: %[[VAR441:[A-Za-z0-9.]+]] = add i[[LLSIZE]] %[[VAR438]], 0
|
||||
// CHECK-NEXT: %[[VAR442:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR443:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: %[[VAR442:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-NEXT: %[[VAR443:[A-Za-z0-9.]+]] = getelementptr inbounds { i[[LLSIZE]], i[[LLSIZE]] }, { i[[LLSIZE]], i[[LLSIZE]] }* %[[CULL1]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR440]], i[[LLSIZE]]* %[[VAR442]]
|
||||
// CHECK-NEXT: store i[[LLSIZE]] %[[VAR441]], i[[LLSIZE]]* %[[VAR443]]
|
||||
}
|
||||
|
|
|
@ -18,12 +18,12 @@ void f() {
|
|||
// CHECK: [[S:%[a-zA-Z0-9.]+]] = alloca [[STRUCT:%[a-zA-Z0-9.]+]],
|
||||
struct S s;
|
||||
// CHECK-NEXT: [[COMPOUNDLIT:%[a-zA-Z0-9.]+]] = alloca [[STRUCT]]
|
||||
// CHECK-NEXT: [[CX:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]]* [[COMPOUNDLIT]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[SY:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]]* [[S]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[CX:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]], [[STRUCT]]* [[COMPOUNDLIT]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[SY:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]], [[STRUCT]]* [[S]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[TMP:%[a-zA-Z0-9.]+]] = load i32* [[SY]]
|
||||
// CHECK-NEXT: store i32 [[TMP]], i32* [[CX]]
|
||||
// CHECK-NEXT: [[CY:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]]* [[COMPOUNDLIT]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[SX:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]]* [[S]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[CY:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]], [[STRUCT]]* [[COMPOUNDLIT]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[SX:%[a-zA-Z0-9.]+]] = getelementptr inbounds [[STRUCT]], [[STRUCT]]* [[S]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[TMP:%[a-zA-Z0-9.]+]] = load i32* [[SX]]
|
||||
// CHECK-NEXT: store i32 [[TMP]], i32* [[CY]]
|
||||
// CHECK-NEXT: [[SI8:%[a-zA-Z0-9.]+]] = bitcast [[STRUCT]]* [[S]] to i8*
|
||||
|
@ -46,15 +46,15 @@ struct G g(int x, int y, int z) {
|
|||
// CHECK-NEXT: store i32
|
||||
|
||||
// Evaluate the compound literal directly in the result value slot.
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[G]]* [[RESULT]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[G]], [[G]]* [[RESULT]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i32* [[X]], align 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = trunc i32 [[T1]] to i16
|
||||
// CHECK-NEXT: store i16 [[T2]], i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[G]]* [[RESULT]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[G]], [[G]]* [[RESULT]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i32* [[Y]], align 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = trunc i32 [[T1]] to i16
|
||||
// CHECK-NEXT: store i16 [[T2]], i16* [[T0]], align 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[G]]* [[RESULT]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[G]], [[G]]* [[RESULT]], i32 0, i32 2
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i32* [[Z]], align 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = trunc i32 [[T1]] to i16
|
||||
// CHECK-NEXT: store i16 [[T2]], i16* [[T0]], align 2
|
||||
|
|
|
@ -128,7 +128,7 @@ int f11(long X) {
|
|||
|
||||
// CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8
|
||||
// CHECK: load {{.*}}* [[Xaddr]]
|
||||
// CHECK-NEXT: getelementptr inbounds [100 x i32]* %A, i32 0,
|
||||
// CHECK-NEXT: getelementptr inbounds [100 x i32], [100 x i32]* %A, i32 0,
|
||||
// CHECK-NEXT: load i32*
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ void test()
|
|||
va.hi[0] = 3.0;
|
||||
// CHECK: [[VA:%.*]] = alloca <4 x float>
|
||||
// CHECK: [[CONV:%.*]] = bitcast <4 x float>* [[VA]] to float*
|
||||
// CHECK: [[ADD:%.*]] = getelementptr inbounds float* [[CONV]], i64 2
|
||||
// CHECK: [[ARRIDX:%.*]] = getelementptr inbounds float* [[ADD]], i64 0
|
||||
// CHECK: [[ADD:%.*]] = getelementptr inbounds float, float* [[CONV]], i64 2
|
||||
// CHECK: [[ARRIDX:%.*]] = getelementptr inbounds float, float* [[ADD]], i64 0
|
||||
// CHECK: store float 3.000000e+00, float* [[ARRIDX]]
|
||||
}
|
||||
|
|
|
@ -60,10 +60,10 @@ void test1() {
|
|||
// -fwrapv should turn off inbounds for GEP's, PR9256
|
||||
extern int* P;
|
||||
++P;
|
||||
// DEFAULT: getelementptr inbounds i32*
|
||||
// WRAPV: getelementptr i32*
|
||||
// TRAPV: getelementptr inbounds i32*
|
||||
// CATCH_UB: getelementptr inbounds i32*
|
||||
// DEFAULT: getelementptr inbounds i32, i32*
|
||||
// WRAPV: getelementptr i32, i32*
|
||||
// TRAPV: getelementptr inbounds i32, i32*
|
||||
// CATCH_UB: getelementptr inbounds i32, i32*
|
||||
|
||||
// PR9350: char increment never overflows.
|
||||
extern volatile signed char PR9350;
|
||||
|
|
|
@ -33,8 +33,8 @@ int test_i32(char *fmt, ...) {
|
|||
// NEW: [[TMP0:%.+]] = bitcast i8** %va to i64**
|
||||
// NEW: [[AP_CUR:%.+]] = load i64** [[TMP0]], align [[PTRALIGN]]
|
||||
//
|
||||
// O32: [[AP_NEXT:%.+]] = getelementptr i32* [[AP_CUR]], i32 1
|
||||
// NEW: [[AP_NEXT:%.+]] = getelementptr i64* [[AP_CUR]], {{i32|i64}} 1
|
||||
// O32: [[AP_NEXT:%.+]] = getelementptr i32, i32* [[AP_CUR]], i32 1
|
||||
// NEW: [[AP_NEXT:%.+]] = getelementptr i64, i64* [[AP_CUR]], {{i32|i64}} 1
|
||||
//
|
||||
// O32: store i32* [[AP_NEXT]], i32** [[TMP0]], align [[PTRALIGN]]
|
||||
// NEW: store i64* [[AP_NEXT]], i64** [[TMP0]], align [[PTRALIGN]]
|
||||
|
@ -69,8 +69,8 @@ int test_i32_2args(char *fmt, ...) {
|
|||
// NEW: [[TMP0:%.+]] = bitcast i8** %va to i64**
|
||||
// NEW: [[AP_CUR:%.+]] = load i64** [[TMP0]], align [[PTRALIGN]]
|
||||
//
|
||||
// O32: [[AP_NEXT1:%.+]] = getelementptr i32* [[AP_CUR]], i32 1
|
||||
// NEW: [[AP_NEXT1:%.+]] = getelementptr i64* [[AP_CUR]], [[INTPTR_T:i32|i64]] 1
|
||||
// O32: [[AP_NEXT1:%.+]] = getelementptr i32, i32* [[AP_CUR]], i32 1
|
||||
// NEW: [[AP_NEXT1:%.+]] = getelementptr i64, i64* [[AP_CUR]], [[INTPTR_T:i32|i64]] 1
|
||||
//
|
||||
// O32: store i32* [[AP_NEXT1]], i32** [[TMP0]], align [[PTRALIGN]]
|
||||
// FIXME: N32 optimised this store out. Why only for this ABI?
|
||||
|
@ -80,8 +80,8 @@ int test_i32_2args(char *fmt, ...) {
|
|||
// NEW: [[TMP3:%.+]] = load i64* [[AP_CUR]], align 8
|
||||
// NEW: [[ARG1:%.+]] = trunc i64 [[TMP3]] to i32
|
||||
//
|
||||
// O32: [[AP_NEXT2:%.+]] = getelementptr i32* [[AP_CUR]], i32 2
|
||||
// NEW: [[AP_NEXT2:%.+]] = getelementptr i64* [[AP_CUR]], [[INTPTR_T]] 2
|
||||
// O32: [[AP_NEXT2:%.+]] = getelementptr i32, i32* [[AP_CUR]], i32 2
|
||||
// NEW: [[AP_NEXT2:%.+]] = getelementptr i64, i64* [[AP_CUR]], [[INTPTR_T]] 2
|
||||
//
|
||||
// O32: store i32* [[AP_NEXT2]], i32** [[TMP0]], align [[PTRALIGN]]
|
||||
// NEW: store i64* [[AP_NEXT2]], i64** [[TMP0]], align [[PTRALIGN]]
|
||||
|
@ -123,8 +123,8 @@ long long test_i64(char *fmt, ...) {
|
|||
// O32: [[PTR3:%.+]] = inttoptr [[INTPTR_T]] [[PTR2]] to i64*
|
||||
// O32: [[PTR4:%.+]] = inttoptr [[INTPTR_T]] [[PTR2]] to i8*
|
||||
//
|
||||
// O32: [[AP_NEXT:%.+]] = getelementptr i8* [[PTR4]], [[INTPTR_T]] 8
|
||||
// NEW: [[AP_NEXT:%.+]] = getelementptr i64* [[AP_CUR]], [[INTPTR_T:i32|i64]] 1
|
||||
// O32: [[AP_NEXT:%.+]] = getelementptr i8, i8* [[PTR4]], [[INTPTR_T]] 8
|
||||
// NEW: [[AP_NEXT:%.+]] = getelementptr i64, i64* [[AP_CUR]], [[INTPTR_T:i32|i64]] 1
|
||||
//
|
||||
// O32: store i8* [[AP_NEXT]], i8** %va, align [[PTRALIGN]]
|
||||
// NEW: store i64* [[AP_NEXT]], i64** [[TMP0]], align [[PTRALIGN]]
|
||||
|
@ -163,10 +163,10 @@ char *test_ptr(char *fmt, ...) {
|
|||
// N64: [[TMP0:%.+]] = bitcast i8** %va to i8***
|
||||
// N64: [[AP_CUR:%.+]] = load i8*** [[TMP0]], align [[PTRALIGN]]
|
||||
//
|
||||
// O32: [[AP_NEXT:%.+]] = getelementptr i8** [[AP_CUR]], i32 1
|
||||
// O32: [[AP_NEXT:%.+]] = getelementptr i8*, i8** [[AP_CUR]], i32 1
|
||||
// N32 differs because the vararg is not a N32 pointer. It's been promoted to 64-bit.
|
||||
// N32: [[AP_NEXT:%.+]] = getelementptr i64* [[AP_CUR]], {{i32|i64}} 1
|
||||
// N64: [[AP_NEXT:%.+]] = getelementptr i8** [[AP_CUR]], {{i32|i64}} 1
|
||||
// N32: [[AP_NEXT:%.+]] = getelementptr i64, i64* [[AP_CUR]], {{i32|i64}} 1
|
||||
// N64: [[AP_NEXT:%.+]] = getelementptr i8*, i8** [[AP_CUR]], {{i32|i64}} 1
|
||||
//
|
||||
// O32: store i8** [[AP_NEXT]], i8*** [[TMP0]], align [[PTRALIGN]]
|
||||
// N32 differs because the vararg is not a N32 pointer. It's been promoted to 64-bit.
|
||||
|
@ -216,7 +216,7 @@ int test_v4i32(char *fmt, ...) {
|
|||
//
|
||||
// ALL: [[PTR3:%.+]] = inttoptr [[INTPTR_T]] [[PTR2]] to <4 x i32>*
|
||||
// ALL: [[PTR4:%.+]] = inttoptr [[INTPTR_T]] [[PTR2]] to i8*
|
||||
// ALL: [[AP_NEXT:%.+]] = getelementptr i8* [[PTR4]], [[INTPTR_T]] 16
|
||||
// ALL: [[AP_NEXT:%.+]] = getelementptr i8, i8* [[PTR4]], [[INTPTR_T]] 16
|
||||
// ALL: store i8* [[AP_NEXT]], i8** %va, align [[PTRALIGN]]
|
||||
// ALL: [[PTR5:%.+]] = load <4 x i32>* [[PTR3]], align 16
|
||||
// ALL: call void @llvm.va_end(i8* [[VA1]])
|
||||
|
|
|
@ -26,33 +26,33 @@ void foo()
|
|||
// CHECK: %var = alloca %struct.test, align 4
|
||||
struct test var;
|
||||
|
||||
// CHECK: getelementptr inbounds %struct.test* %var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var.a;
|
||||
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 2
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var.b;
|
||||
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var.a1;
|
||||
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}var, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var.b1;
|
||||
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 0
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var.x;
|
||||
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 2
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %var, i32 0, i32 2
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var.y;
|
||||
}
|
||||
|
@ -62,38 +62,38 @@ void foo2(struct test* var)
|
|||
// CHECK: alloca %struct.test*, align
|
||||
// CHECK-NEXT: store %struct.test* %var, %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: load %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var->a;
|
||||
|
||||
// CHECK-NEXT: load %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 2
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var->b;
|
||||
|
||||
// CHECK-NEXT: load %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var->a1;
|
||||
|
||||
// CHECK-NEXT: load %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested2, %struct.nested2* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.nested1, %struct.nested1* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var->b1;
|
||||
|
||||
// CHECK-NEXT: load %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var->x;
|
||||
|
||||
// CHECK-NEXT: load %struct.test** %{{.*}}, align
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 2
|
||||
// CHECK-NEXT: getelementptr inbounds %struct.test, %struct.test* %{{.*}}, i32 0, i32 2
|
||||
// CHECK-NEXT: load i32* %{{.*}}, align 4
|
||||
var->y;
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ struct T4 {
|
|||
void T4::test() {
|
||||
// CHECK: [[T0:%.*]] = alloca [[T4:%.*]]*,
|
||||
// CHECK: [[THIS:%.*]] = load [[T4]]** [[T0]]
|
||||
// CHECK: [[X:%.*]] = getelementptr inbounds [[T4]]* [[THIS]], i32 0, i32 0
|
||||
// CHECK: [[X:%.*]] = getelementptr inbounds [[T4]], [[T4]]* [[THIS]], i32 0, i32 0
|
||||
__asm mov eax, x;
|
||||
__asm mov y, eax;
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @_ZN2T41yE, i32* {{.*}})
|
||||
|
|
|
@ -94,7 +94,7 @@ struct __attribute__((packed, aligned)) s3 {
|
|||
int s3_1 = __alignof(((struct s3*) 0)->anInt);
|
||||
// CHECK-FUNCTIONS-LABEL: define i32 @test3(
|
||||
int test3(struct s3 *ptr) {
|
||||
// CHECK-FUNCTIONS: [[PTR:%.*]] = getelementptr inbounds {{%.*}}* {{%.*}}, i32 0, i32 1
|
||||
// CHECK-FUNCTIONS: [[PTR:%.*]] = getelementptr inbounds {{%.*}}, {{%.*}}* {{%.*}}, i32 0, i32 1
|
||||
// CHECK-FUNCTIONS-NEXT: load i32* [[PTR]], align 1
|
||||
return ptr->anInt;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
// CHECK: [[P:%.*]] = add i64 %param, -8
|
||||
// CHECK-NEXT: [[Q:%.*]] = inttoptr i64 [[P]] to [[R:%.*]]*
|
||||
// CHECK-NEXT: {{%.*}} = getelementptr inbounds [[R]]* [[Q]], i64 0, i32 0
|
||||
// CHECK-NEXT: {{%.*}} = getelementptr inbounds [[R]], [[R]]* [[Q]], i64 0, i32 0
|
||||
|
||||
#define CR(Record, TYPE, Field) \
|
||||
((TYPE *) ((unsigned char *) (Record) - (unsigned char *) &(((TYPE *) 0)->Field)))
|
||||
|
|
|
@ -19,7 +19,7 @@ void testva (int n, ...)
|
|||
// CHECK: bitcast %struct.x* %t to i8*
|
||||
// CHECK: bitcast %struct.x* %{{[0-9]+}} to i8*
|
||||
// CHECK: call void @llvm.memcpy
|
||||
// CHECK-PPC: [[ARRAYDECAY:%[a-z0-9]+]] = getelementptr inbounds [1 x %struct.__va_list_tag]* %ap, i32 0, i32 0
|
||||
// CHECK-PPC: [[ARRAYDECAY:%[a-z0-9]+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %ap, i32 0, i32 0
|
||||
// CHECK-PPC-NEXT: [[GPRPTR:%[a-z0-9]+]] = bitcast %struct.__va_list_tag* [[ARRAYDECAY]] to i8*
|
||||
// CHECK-PPC-NEXT: [[ZERO:%[0-9]+]] = ptrtoint i8* [[GPRPTR]] to i32
|
||||
// CHECK-PPC-NEXT: [[ONE:%[0-9]+]] = add i32 [[ZERO]], 1
|
||||
|
@ -65,7 +65,7 @@ void testva (int n, ...)
|
|||
// CHECK: add i64 %{{[0-9]+}}, 4
|
||||
// CHECK: inttoptr i64 %{{[0-9]+}} to i8*
|
||||
// CHECK: bitcast i8* %{{[0-9]+}} to i32*
|
||||
// CHECK-PPC: [[ARRAYDECAY1:%[a-z0-9]+]] = getelementptr inbounds [1 x %struct.__va_list_tag]* %ap, i32 0, i32 0
|
||||
// CHECK-PPC: [[ARRAYDECAY1:%[a-z0-9]+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %ap, i32 0, i32 0
|
||||
// CHECK-PPC-NEXT: [[GPRPTR1:%[a-z0-9]+]] = bitcast %struct.__va_list_tag* [[ARRAYDECAY1]] to i8*
|
||||
// CHECK-PPC-NEXT: [[EIGHTEEN:%[0-9]+]] = ptrtoint i8* [[GPRPTR1]] to i32
|
||||
// CHECK-PPC-NEXT: [[NINETEEN:%[0-9]+]] = add i32 [[EIGHTEEN]], 1
|
||||
|
|
|
@ -50,7 +50,7 @@ void test7 (int x, struct test7 y)
|
|||
|
||||
// CHECK: define void @test1va(%struct.test1* noalias sret %agg.result, i32 signext %x, ...)
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8* %[[CUR]], i64 8
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i64 8
|
||||
// CHECK: store i8* %[[NEXT]], i8** %ap
|
||||
// CHECK: bitcast i8* %[[CUR]] to %struct.test1*
|
||||
struct test1 test1va (int x, ...)
|
||||
|
@ -69,7 +69,7 @@ struct test1 test1va (int x, ...)
|
|||
// CHECK: %[[TMP1:[^ ]+]] = add i64 %[[TMP0]], 15
|
||||
// CHECK: %[[TMP2:[^ ]+]] = and i64 %[[TMP1]], -16
|
||||
// CHECK: %[[ALIGN:[^ ]+]] = inttoptr i64 %[[TMP2]] to i8*
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8* %[[ALIGN]], i64 16
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8, i8* %[[ALIGN]], i64 16
|
||||
// CHECK: store i8* %[[NEXT]], i8** %ap
|
||||
// CHECK: bitcast i8* %[[ALIGN]] to %struct.test2*
|
||||
struct test2 test2va (int x, ...)
|
||||
|
@ -88,7 +88,7 @@ struct test2 test2va (int x, ...)
|
|||
// CHECK: %[[TMP1:[^ ]+]] = add i64 %[[TMP0]], 15
|
||||
// CHECK: %[[TMP2:[^ ]+]] = and i64 %[[TMP1]], -16
|
||||
// CHECK: %[[ALIGN:[^ ]+]] = inttoptr i64 %[[TMP2]] to i8*
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8* %[[ALIGN]], i64 32
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8, i8* %[[ALIGN]], i64 32
|
||||
// CHECK: store i8* %[[NEXT]], i8** %ap
|
||||
// CHECK: bitcast i8* %[[ALIGN]] to %struct.test3*
|
||||
struct test3 test3va (int x, ...)
|
||||
|
@ -103,7 +103,7 @@ struct test3 test3va (int x, ...)
|
|||
|
||||
// CHECK: define void @test4va(%struct.test4* noalias sret %agg.result, i32 signext %x, ...)
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8* %[[CUR]], i64 16
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i64 16
|
||||
// CHECK: store i8* %[[NEXT]], i8** %ap
|
||||
// CHECK: bitcast i8* %[[CUR]] to %struct.test4*
|
||||
struct test4 test4va (int x, ...)
|
||||
|
@ -118,7 +118,7 @@ struct test4 test4va (int x, ...)
|
|||
|
||||
// CHECK: define void @testva_longdouble(%struct.test_longdouble* noalias sret %agg.result, i32 signext %x, ...)
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8* %[[CUR]], i64 16
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i64 16
|
||||
// CHECK: store i8* %[[NEXT]], i8** %ap
|
||||
// CHECK: bitcast i8* %[[CUR]] to %struct.test_longdouble*
|
||||
struct test_longdouble { long double x; };
|
||||
|
@ -138,7 +138,7 @@ struct test_longdouble testva_longdouble (int x, ...)
|
|||
// CHECK: %[[TMP1:[^ ]+]] = add i64 %[[TMP0]], 15
|
||||
// CHECK: %[[TMP2:[^ ]+]] = and i64 %[[TMP1]], -16
|
||||
// CHECK: %[[ALIGN:[^ ]+]] = inttoptr i64 %[[TMP2]] to i8*
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8* %[[ALIGN]], i64 16
|
||||
// CHECK: %[[NEXT:[^ ]+]] = getelementptr i8, i8* %[[ALIGN]], i64 16
|
||||
// CHECK: store i8* %[[NEXT]], i8** %ap
|
||||
// CHECK: bitcast i8* %[[ALIGN]] to %struct.test_vector*
|
||||
struct test_vector { vector int x; };
|
||||
|
|
|
@ -58,13 +58,13 @@ void bar_float(void) {
|
|||
|
||||
// CHECK: define void @bar_float() [[NUW]] {
|
||||
// CHECK: %[[VAR1:[A-Za-z0-9.]+]] = alloca { float, float }, align 4
|
||||
// CHECK: %[[VAR2:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }* %[[VAR1]], i32 0, i32 0
|
||||
// CHECK: %[[VAR3:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }* %[[VAR1]], i32 0, i32 1
|
||||
// CHECK: %[[VAR2:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }, { float, float }* %[[VAR1]], i32 0, i32 0
|
||||
// CHECK: %[[VAR3:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }, { float, float }* %[[VAR1]], i32 0, i32 1
|
||||
// CHECK: store float 2.000000e+00, float* %[[VAR2]]
|
||||
// CHECK: store float -2.500000e+00, float* %[[VAR3]]
|
||||
// CHECK: %[[VAR4:[A-Za-z0-9.]+]] = getelementptr { float, float }* %[[VAR1]], i32 0, i32 0
|
||||
// CHECK: %[[VAR4:[A-Za-z0-9.]+]] = getelementptr { float, float }, { float, float }* %[[VAR1]], i32 0, i32 0
|
||||
// CHECK: %[[VAR5:[A-Za-z0-9.]+]] = load float* %[[VAR4]], align 1
|
||||
// CHECK: %[[VAR6:[A-Za-z0-9.]+]] = getelementptr { float, float }* %[[VAR1]], i32 0, i32 1
|
||||
// CHECK: %[[VAR6:[A-Za-z0-9.]+]] = getelementptr { float, float }, { float, float }* %[[VAR1]], i32 0, i32 1
|
||||
// CHECK: %[[VAR7:[A-Za-z0-9.]+]] = load float* %[[VAR6]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call float @foo_float(float %[[VAR5]], float %[[VAR7]])
|
||||
|
||||
|
@ -74,13 +74,13 @@ void bar_double(void) {
|
|||
|
||||
// CHECK: define void @bar_double() [[NUW]] {
|
||||
// CHECK: %[[VAR11:[A-Za-z0-9.]+]] = alloca { double, double }, align 8
|
||||
// CHECK: %[[VAR12:[A-Za-z0-9.]+]] = getelementptr inbounds { double, double }* %[[VAR11]], i32 0, i32 0
|
||||
// CHECK: %[[VAR13:[A-Za-z0-9.]+]] = getelementptr inbounds { double, double }* %[[VAR11]], i32 0, i32 1
|
||||
// CHECK: %[[VAR12:[A-Za-z0-9.]+]] = getelementptr inbounds { double, double }, { double, double }* %[[VAR11]], i32 0, i32 0
|
||||
// CHECK: %[[VAR13:[A-Za-z0-9.]+]] = getelementptr inbounds { double, double }, { double, double }* %[[VAR11]], i32 0, i32 1
|
||||
// CHECK: store double 2.000000e+00, double* %[[VAR12]]
|
||||
// CHECK: store double -2.500000e+00, double* %[[VAR13]]
|
||||
// CHECK: %[[VAR14:[A-Za-z0-9.]+]] = getelementptr { double, double }* %[[VAR11]], i32 0, i32 0
|
||||
// CHECK: %[[VAR14:[A-Za-z0-9.]+]] = getelementptr { double, double }, { double, double }* %[[VAR11]], i32 0, i32 0
|
||||
// CHECK: %[[VAR15:[A-Za-z0-9.]+]] = load double* %[[VAR14]], align 1
|
||||
// CHECK: %[[VAR16:[A-Za-z0-9.]+]] = getelementptr { double, double }* %[[VAR11]], i32 0, i32 1
|
||||
// CHECK: %[[VAR16:[A-Za-z0-9.]+]] = getelementptr { double, double }, { double, double }* %[[VAR11]], i32 0, i32 1
|
||||
// CHECK: %[[VAR17:[A-Za-z0-9.]+]] = load double* %[[VAR16]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call double @foo_double(double %[[VAR15]], double %[[VAR17]])
|
||||
|
||||
|
@ -90,13 +90,13 @@ void bar_long_double(void) {
|
|||
|
||||
// CHECK: define void @bar_long_double() [[NUW]] {
|
||||
// CHECK: %[[VAR21:[A-Za-z0-9.]+]] = alloca { ppc_fp128, ppc_fp128 }, align 16
|
||||
// CHECK: %[[VAR22:[A-Za-z0-9.]+]] = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 0
|
||||
// CHECK: %[[VAR23:[A-Za-z0-9.]+]] = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 1
|
||||
// CHECK: %[[VAR22:[A-Za-z0-9.]+]] = getelementptr inbounds { ppc_fp128, ppc_fp128 }, { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 0
|
||||
// CHECK: %[[VAR23:[A-Za-z0-9.]+]] = getelementptr inbounds { ppc_fp128, ppc_fp128 }, { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 1
|
||||
// CHECK: store ppc_fp128 0xM40000000000000000000000000000000, ppc_fp128* %[[VAR22]]
|
||||
// CHECK: store ppc_fp128 0xMC0040000000000000000000000000000, ppc_fp128* %[[VAR23]]
|
||||
// CHECK: %[[VAR24:[A-Za-z0-9.]+]] = getelementptr { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 0
|
||||
// CHECK: %[[VAR24:[A-Za-z0-9.]+]] = getelementptr { ppc_fp128, ppc_fp128 }, { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 0
|
||||
// CHECK: %[[VAR25:[A-Za-z0-9.]+]] = load ppc_fp128* %[[VAR24]], align 1
|
||||
// CHECK: %[[VAR26:[A-Za-z0-9.]+]] = getelementptr { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 1
|
||||
// CHECK: %[[VAR26:[A-Za-z0-9.]+]] = getelementptr { ppc_fp128, ppc_fp128 }, { ppc_fp128, ppc_fp128 }* %[[VAR21]], i32 0, i32 1
|
||||
// CHECK: %[[VAR27:[A-Za-z0-9.]+]] = load ppc_fp128* %[[VAR26]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call ppc_fp128 @foo_long_double(ppc_fp128 %[[VAR25]], ppc_fp128 %[[VAR27]])
|
||||
|
||||
|
@ -106,13 +106,13 @@ void bar_int(void) {
|
|||
|
||||
// CHECK: define void @bar_int() [[NUW]] {
|
||||
// CHECK: %[[VAR31:[A-Za-z0-9.]+]] = alloca { i32, i32 }, align 4
|
||||
// CHECK: %[[VAR32:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }* %[[VAR31]], i32 0, i32 0
|
||||
// CHECK: %[[VAR33:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }* %[[VAR31]], i32 0, i32 1
|
||||
// CHECK: %[[VAR32:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* %[[VAR31]], i32 0, i32 0
|
||||
// CHECK: %[[VAR33:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* %[[VAR31]], i32 0, i32 1
|
||||
// CHECK: store i32 2, i32* %[[VAR32]]
|
||||
// CHECK: store i32 -3, i32* %[[VAR33]]
|
||||
// CHECK: %[[VAR34:[A-Za-z0-9.]+]] = getelementptr { i32, i32 }* %[[VAR31]], i32 0, i32 0
|
||||
// CHECK: %[[VAR34:[A-Za-z0-9.]+]] = getelementptr { i32, i32 }, { i32, i32 }* %[[VAR31]], i32 0, i32 0
|
||||
// CHECK: %[[VAR35:[A-Za-z0-9.]+]] = load i32* %[[VAR34]], align 1
|
||||
// CHECK: %[[VAR36:[A-Za-z0-9.]+]] = getelementptr { i32, i32 }* %[[VAR31]], i32 0, i32 1
|
||||
// CHECK: %[[VAR36:[A-Za-z0-9.]+]] = getelementptr { i32, i32 }, { i32, i32 }* %[[VAR31]], i32 0, i32 1
|
||||
// CHECK: %[[VAR37:[A-Za-z0-9.]+]] = load i32* %[[VAR36]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call signext i32 @foo_int(i32 %[[VAR35]], i32 %[[VAR37]])
|
||||
|
||||
|
@ -122,13 +122,13 @@ void bar_short(void) {
|
|||
|
||||
// CHECK: define void @bar_short() [[NUW]] {
|
||||
// CHECK: %[[VAR41:[A-Za-z0-9.]+]] = alloca { i16, i16 }, align 2
|
||||
// CHECK: %[[VAR42:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }* %[[VAR41]], i32 0, i32 0
|
||||
// CHECK: %[[VAR43:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }* %[[VAR41]], i32 0, i32 1
|
||||
// CHECK: %[[VAR42:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* %[[VAR41]], i32 0, i32 0
|
||||
// CHECK: %[[VAR43:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* %[[VAR41]], i32 0, i32 1
|
||||
// CHECK: store i16 2, i16* %[[VAR42]]
|
||||
// CHECK: store i16 -3, i16* %[[VAR43]]
|
||||
// CHECK: %[[VAR44:[A-Za-z0-9.]+]] = getelementptr { i16, i16 }* %[[VAR41]], i32 0, i32 0
|
||||
// CHECK: %[[VAR44:[A-Za-z0-9.]+]] = getelementptr { i16, i16 }, { i16, i16 }* %[[VAR41]], i32 0, i32 0
|
||||
// CHECK: %[[VAR45:[A-Za-z0-9.]+]] = load i16* %[[VAR44]], align 1
|
||||
// CHECK: %[[VAR46:[A-Za-z0-9.]+]] = getelementptr { i16, i16 }* %[[VAR41]], i32 0, i32 1
|
||||
// CHECK: %[[VAR46:[A-Za-z0-9.]+]] = getelementptr { i16, i16 }, { i16, i16 }* %[[VAR41]], i32 0, i32 1
|
||||
// CHECK: %[[VAR47:[A-Za-z0-9.]+]] = load i16* %[[VAR46]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call signext i16 @foo_short(i16 %[[VAR45]], i16 %[[VAR47]])
|
||||
|
||||
|
@ -138,13 +138,13 @@ void bar_char(void) {
|
|||
|
||||
// CHECK: define void @bar_char() [[NUW]] {
|
||||
// CHECK: %[[VAR51:[A-Za-z0-9.]+]] = alloca { i8, i8 }, align 1
|
||||
// CHECK: %[[VAR52:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }* %[[VAR51]], i32 0, i32 0
|
||||
// CHECK: %[[VAR53:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }* %[[VAR51]], i32 0, i32 1
|
||||
// CHECK: %[[VAR52:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }, { i8, i8 }* %[[VAR51]], i32 0, i32 0
|
||||
// CHECK: %[[VAR53:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }, { i8, i8 }* %[[VAR51]], i32 0, i32 1
|
||||
// CHECK: store i8 2, i8* %[[VAR52]]
|
||||
// CHECK: store i8 -3, i8* %[[VAR53]]
|
||||
// CHECK: %[[VAR54:[A-Za-z0-9.]+]] = getelementptr { i8, i8 }* %[[VAR51]], i32 0, i32 0
|
||||
// CHECK: %[[VAR54:[A-Za-z0-9.]+]] = getelementptr { i8, i8 }, { i8, i8 }* %[[VAR51]], i32 0, i32 0
|
||||
// CHECK: %[[VAR55:[A-Za-z0-9.]+]] = load i8* %[[VAR54]], align 1
|
||||
// CHECK: %[[VAR56:[A-Za-z0-9.]+]] = getelementptr { i8, i8 }* %[[VAR51]], i32 0, i32 1
|
||||
// CHECK: %[[VAR56:[A-Za-z0-9.]+]] = getelementptr { i8, i8 }, { i8, i8 }* %[[VAR51]], i32 0, i32 1
|
||||
// CHECK: %[[VAR57:[A-Za-z0-9.]+]] = load i8* %[[VAR56]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call signext i8 @foo_char(i8 %[[VAR55]], i8 %[[VAR57]])
|
||||
|
||||
|
@ -154,13 +154,13 @@ void bar_long(void) {
|
|||
|
||||
// CHECK: define void @bar_long() [[NUW]] {
|
||||
// CHECK: %[[VAR61:[A-Za-z0-9.]+]] = alloca { i64, i64 }, align 8
|
||||
// CHECK: %[[VAR62:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }* %[[VAR61]], i32 0, i32 0
|
||||
// CHECK: %[[VAR63:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }* %[[VAR61]], i32 0, i32 1
|
||||
// CHECK: %[[VAR62:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* %[[VAR61]], i32 0, i32 0
|
||||
// CHECK: %[[VAR63:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* %[[VAR61]], i32 0, i32 1
|
||||
// CHECK: store i64 2, i64* %[[VAR62]]
|
||||
// CHECK: store i64 -3, i64* %[[VAR63]]
|
||||
// CHECK: %[[VAR64:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }* %[[VAR61]], i32 0, i32 0
|
||||
// CHECK: %[[VAR64:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAR61]], i32 0, i32 0
|
||||
// CHECK: %[[VAR65:[A-Za-z0-9.]+]] = load i64* %[[VAR64]], align 1
|
||||
// CHECK: %[[VAR66:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }* %[[VAR61]], i32 0, i32 1
|
||||
// CHECK: %[[VAR66:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAR61]], i32 0, i32 1
|
||||
// CHECK: %[[VAR67:[A-Za-z0-9.]+]] = load i64* %[[VAR66]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call i64 @foo_long(i64 %[[VAR65]], i64 %[[VAR67]])
|
||||
|
||||
|
@ -170,13 +170,13 @@ void bar_long_long(void) {
|
|||
|
||||
// CHECK: define void @bar_long_long() [[NUW]] {
|
||||
// CHECK: %[[VAR71:[A-Za-z0-9.]+]] = alloca { i64, i64 }, align 8
|
||||
// CHECK: %[[VAR72:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }* %[[VAR71]], i32 0, i32 0
|
||||
// CHECK: %[[VAR73:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }* %[[VAR71]], i32 0, i32 1
|
||||
// CHECK: %[[VAR72:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* %[[VAR71]], i32 0, i32 0
|
||||
// CHECK: %[[VAR73:[A-Za-z0-9.]+]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* %[[VAR71]], i32 0, i32 1
|
||||
// CHECK: store i64 2, i64* %[[VAR72]]
|
||||
// CHECK: store i64 -3, i64* %[[VAR73]]
|
||||
// CHECK: %[[VAR74:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }* %[[VAR71]], i32 0, i32 0
|
||||
// CHECK: %[[VAR74:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAR71]], i32 0, i32 0
|
||||
// CHECK: %[[VAR75:[A-Za-z0-9.]+]] = load i64* %[[VAR74]], align 1
|
||||
// CHECK: %[[VAR76:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }* %[[VAR71]], i32 0, i32 1
|
||||
// CHECK: %[[VAR76:[A-Za-z0-9.]+]] = getelementptr { i64, i64 }, { i64, i64 }* %[[VAR71]], i32 0, i32 1
|
||||
// CHECK: %[[VAR77:[A-Za-z0-9.]+]] = load i64* %[[VAR76]], align 1
|
||||
// CHECK: %{{[A-Za-z0-9.]+}} = call i64 @foo_long_long(i64 %[[VAR75]], i64 %[[VAR77]])
|
||||
|
||||
|
|
|
@ -13,15 +13,15 @@ void bar(Sf a, Sd b, SSf d, SSd e) {}
|
|||
// CHECK: %b = alloca %struct.s2, align 8
|
||||
// CHECK: %d = alloca %struct.s4, align 4
|
||||
// CHECK: %e = alloca %struct.s5, align 8
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1* %a, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1, %struct.s1* %a, i32 0, i32 0
|
||||
// CHECK: store float %a.coerce, float* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2* %b, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2, %struct.s2* %b, i32 0, i32 0
|
||||
// CHECK: store double %b.coerce, double* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s4* %d, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s4, %struct.s4* %d, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1, %struct.s1* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: store float %d.coerce, float* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s5* %e, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s5, %struct.s5* %e, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2, %struct.s2* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: store double %e.coerce, double* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: ret void
|
||||
|
||||
|
@ -35,15 +35,15 @@ void foo(void)
|
|||
}
|
||||
|
||||
// CHECK-LABEL: define void @foo
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1* %p1, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1, %struct.s1* %p1, i32 0, i32 0
|
||||
// CHECK: %{{[0-9]+}} = load float* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2* %p2, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2, %struct.s2* %p2, i32 0, i32 0
|
||||
// CHECK: %{{[0-9]+}} = load double* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s4* %p4, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s4, %struct.s4* %p4, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s1, %struct.s1* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: %{{[0-9]+}} = load float* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s5* %p5, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s5, %struct.s5* %p5, i32 0, i32 0
|
||||
// CHECK: %{{[a-zA-Z0-9.]+}} = getelementptr %struct.s2, %struct.s2* %{{[a-zA-Z0-9.]+}}, i32 0, i32 0
|
||||
// CHECK: %{{[0-9]+}} = load double* %{{[a-zA-Z0-9.]+}}, align 1
|
||||
// CHECK: call void @bar(float inreg %{{[0-9]+}}, double inreg %{{[0-9]+}}, float inreg %{{[0-9]+}}, double inreg %{{[0-9]+}})
|
||||
// CHECK: ret void
|
||||
|
|
|
@ -9,7 +9,7 @@ void testva (int n, ...)
|
|||
|
||||
_Complex int i = va_arg(ap, _Complex int);
|
||||
// CHECK: %[[VAR40:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR41:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR40]], i64 16
|
||||
// CHECK-NEXT: %[[VAR41:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR40]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR41]], i8** %[[VAR100]]
|
||||
// CHECK-NEXT: %[[VAR1:[A-Za-z0-9.]+]] = ptrtoint i8* %[[VAR40]] to i64
|
||||
// CHECK-NEXT: %[[VAR2:[A-Za-z0-9.]+]] = add i64 %[[VAR1]], 4
|
||||
|
@ -18,14 +18,14 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR5:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR3]] to i32*
|
||||
// CHECK-NEXT: %[[VAR6:[A-Za-z0-9.]+]] = load i32* %[[VAR4]]
|
||||
// CHECK-NEXT: %[[VAR7:[A-Za-z0-9.]+]] = load i32* %[[VAR5]]
|
||||
// CHECK-NEXT: %[[VAR8:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }* %[[VAR0:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR9:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }* %[[VAR0]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR8:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* %[[VAR0:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR9:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* %[[VAR0]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i32 %[[VAR6]], i32* %[[VAR8]]
|
||||
// CHECK-NEXT: store i32 %[[VAR7]], i32* %[[VAR9]]
|
||||
|
||||
_Complex short s = va_arg(ap, _Complex short);
|
||||
// CHECK: %[[VAR50:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR51:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR50]], i64 16
|
||||
// CHECK-NEXT: %[[VAR51:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR50]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR51]], i8** %[[VAR100]]
|
||||
// CHECK: %[[VAR11:[A-Za-z0-9.]+]] = ptrtoint i8* %{{[A-Za-z0-9.]+}} to i64
|
||||
// CHECK-NEXT: %[[VAR12:[A-Za-z0-9.]+]] = add i64 %[[VAR11]], 6
|
||||
|
@ -34,14 +34,14 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR15:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR13]] to i16*
|
||||
// CHECK-NEXT: %[[VAR16:[A-Za-z0-9.]+]] = load i16* %[[VAR14]]
|
||||
// CHECK-NEXT: %[[VAR17:[A-Za-z0-9.]+]] = load i16* %[[VAR15]]
|
||||
// CHECK-NEXT: %[[VAR18:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }* %[[VAR10:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR19:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }* %[[VAR10]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR18:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* %[[VAR10:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR19:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* %[[VAR10]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 %[[VAR16]], i16* %[[VAR18]]
|
||||
// CHECK-NEXT: store i16 %[[VAR17]], i16* %[[VAR19]]
|
||||
|
||||
_Complex char c = va_arg(ap, _Complex char);
|
||||
// CHECK: %[[VAR60:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR61:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR60]], i64 16
|
||||
// CHECK-NEXT: %[[VAR61:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR60]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR61]], i8** %[[VAR100]]
|
||||
// CHECK: %[[VAR21:[A-Za-z0-9.]+]] = ptrtoint i8* %{{[A-Za-z0-9.]+}} to i64
|
||||
// CHECK-NEXT: %[[VAR22:[A-Za-z0-9.]+]] = add i64 %[[VAR21]], 7
|
||||
|
@ -50,14 +50,14 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR25:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR23]] to i8*
|
||||
// CHECK-NEXT: %[[VAR26:[A-Za-z0-9.]+]] = load i8* %[[VAR24]]
|
||||
// CHECK-NEXT: %[[VAR27:[A-Za-z0-9.]+]] = load i8* %[[VAR25]]
|
||||
// CHECK-NEXT: %[[VAR28:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }* %[[VAR20:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR29:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }* %[[VAR20]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR28:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }, { i8, i8 }* %[[VAR20:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR29:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }, { i8, i8 }* %[[VAR20]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i8 %[[VAR26]], i8* %[[VAR28]]
|
||||
// CHECK-NEXT: store i8 %[[VAR27]], i8* %[[VAR29]]
|
||||
|
||||
_Complex float f = va_arg(ap, _Complex float);
|
||||
// CHECK: %[[VAR70:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR71:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR70]], i64 16
|
||||
// CHECK-NEXT: %[[VAR71:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR70]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR71]], i8** %[[VAR100]]
|
||||
// CHECK: %[[VAR31:[A-Za-z0-9.]+]] = ptrtoint i8* %{{[A-Za-z0-9.]+}} to i64
|
||||
// CHECK-NEXT: %[[VAR32:[A-Za-z0-9.]+]] = add i64 %[[VAR31]], 4
|
||||
|
@ -66,8 +66,8 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR35:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR33]] to float*
|
||||
// CHECK-NEXT: %[[VAR36:[A-Za-z0-9.]+]] = load float* %[[VAR34]]
|
||||
// CHECK-NEXT: %[[VAR37:[A-Za-z0-9.]+]] = load float* %[[VAR35]]
|
||||
// CHECK-NEXT: %[[VAR38:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }* %[[VAR30:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR39:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }* %[[VAR30]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR38:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }, { float, float }* %[[VAR30:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR39:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }, { float, float }* %[[VAR30]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float %[[VAR36]], float* %[[VAR38]]
|
||||
// CHECK-NEXT: store float %[[VAR37]], float* %[[VAR39]]
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ void testva (int n, ...)
|
|||
|
||||
_Complex int i = va_arg(ap, _Complex int);
|
||||
// CHECK: %[[VAR40:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR41:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR40]], i64 16
|
||||
// CHECK-NEXT: %[[VAR41:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR40]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR41]], i8** %[[VAR100]]
|
||||
// CHECK-NEXT: %[[VAR1:[A-Za-z0-9.]+]] = ptrtoint i8* %[[VAR40]] to i64
|
||||
// CHECK-NEXT: %[[VAR3:[A-Za-z0-9.]+]] = add i64 %[[VAR1]], 8
|
||||
|
@ -17,14 +17,14 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR5:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR3]] to i32*
|
||||
// CHECK-NEXT: %[[VAR6:[A-Za-z0-9.]+]] = load i32* %[[VAR4]]
|
||||
// CHECK-NEXT: %[[VAR7:[A-Za-z0-9.]+]] = load i32* %[[VAR5]]
|
||||
// CHECK-NEXT: %[[VAR8:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }* %[[VAR0:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR9:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }* %[[VAR0]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR8:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* %[[VAR0:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR9:[A-Za-z0-9.]+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* %[[VAR0]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i32 %[[VAR6]], i32* %[[VAR8]]
|
||||
// CHECK-NEXT: store i32 %[[VAR7]], i32* %[[VAR9]]
|
||||
|
||||
_Complex short s = va_arg(ap, _Complex short);
|
||||
// CHECK: %[[VAR50:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR51:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR50]], i64 16
|
||||
// CHECK-NEXT: %[[VAR51:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR50]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR51]], i8** %[[VAR100]]
|
||||
// CHECK: %[[VAR11:[A-Za-z0-9.]+]] = ptrtoint i8* %{{[A-Za-z0-9.]+}} to i64
|
||||
// CHECK-NEXT: %[[VAR13:[A-Za-z0-9.]+]] = add i64 %[[VAR11]], 8
|
||||
|
@ -32,14 +32,14 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR15:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR13]] to i16*
|
||||
// CHECK-NEXT: %[[VAR16:[A-Za-z0-9.]+]] = load i16* %[[VAR14]]
|
||||
// CHECK-NEXT: %[[VAR17:[A-Za-z0-9.]+]] = load i16* %[[VAR15]]
|
||||
// CHECK-NEXT: %[[VAR18:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }* %[[VAR10:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR19:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }* %[[VAR10]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR18:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* %[[VAR10:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR19:[A-Za-z0-9.]+]] = getelementptr inbounds { i16, i16 }, { i16, i16 }* %[[VAR10]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i16 %[[VAR16]], i16* %[[VAR18]]
|
||||
// CHECK-NEXT: store i16 %[[VAR17]], i16* %[[VAR19]]
|
||||
|
||||
_Complex char c = va_arg(ap, _Complex char);
|
||||
// CHECK: %[[VAR60:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR61:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR60]], i64 16
|
||||
// CHECK-NEXT: %[[VAR61:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR60]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR61]], i8** %[[VAR100]]
|
||||
// CHECK: %[[VAR21:[A-Za-z0-9.]+]] = ptrtoint i8* %{{[A-Za-z0-9.]+}} to i64
|
||||
// CHECK-NEXT: %[[VAR23:[A-Za-z0-9.]+]] = add i64 %[[VAR21]], 8
|
||||
|
@ -47,14 +47,14 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR25:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR23]] to i8*
|
||||
// CHECK-NEXT: %[[VAR26:[A-Za-z0-9.]+]] = load i8* %[[VAR24]]
|
||||
// CHECK-NEXT: %[[VAR27:[A-Za-z0-9.]+]] = load i8* %[[VAR25]]
|
||||
// CHECK-NEXT: %[[VAR28:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }* %[[VAR20:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR29:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }* %[[VAR20]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR28:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }, { i8, i8 }* %[[VAR20:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR29:[A-Za-z0-9.]+]] = getelementptr inbounds { i8, i8 }, { i8, i8 }* %[[VAR20]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i8 %[[VAR26]], i8* %[[VAR28]]
|
||||
// CHECK-NEXT: store i8 %[[VAR27]], i8* %[[VAR29]]
|
||||
|
||||
_Complex float f = va_arg(ap, _Complex float);
|
||||
// CHECK: %[[VAR70:[A-Za-z0-9.]+]] = load i8** %[[VAR100:[A-Za-z0-9.]+]]
|
||||
// CHECK-NEXT: %[[VAR71:[A-Za-z0-9.]+]] = getelementptr i8* %[[VAR70]], i64 16
|
||||
// CHECK-NEXT: %[[VAR71:[A-Za-z0-9.]+]] = getelementptr i8, i8* %[[VAR70]], i64 16
|
||||
// CHECK-NEXT: store i8* %[[VAR71]], i8** %[[VAR100]]
|
||||
// CHECK: %[[VAR31:[A-Za-z0-9.]+]] = ptrtoint i8* %{{[A-Za-z0-9.]+}} to i64
|
||||
// CHECK-NEXT: %[[VAR33:[A-Za-z0-9.]+]] = add i64 %[[VAR31]], 8
|
||||
|
@ -62,8 +62,8 @@ void testva (int n, ...)
|
|||
// CHECK-NEXT: %[[VAR35:[A-Za-z0-9.]+]] = inttoptr i64 %[[VAR33]] to float*
|
||||
// CHECK-NEXT: %[[VAR36:[A-Za-z0-9.]+]] = load float* %[[VAR34]]
|
||||
// CHECK-NEXT: %[[VAR37:[A-Za-z0-9.]+]] = load float* %[[VAR35]]
|
||||
// CHECK-NEXT: %[[VAR38:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }* %[[VAR30:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR39:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }* %[[VAR30]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[VAR38:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }, { float, float }* %[[VAR30:[A-Za-z0-9.]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: %[[VAR39:[A-Za-z0-9.]+]] = getelementptr inbounds { float, float }, { float, float }* %[[VAR30]], i32 0, i32 1
|
||||
// CHECK-NEXT: store float %[[VAR36]], float* %[[VAR38]]
|
||||
// CHECK-NEXT: store float %[[VAR37]], float* %[[VAR39]]
|
||||
}
|
||||
|
|
|
@ -132,9 +132,9 @@ int f_variable(char *f, ...) {
|
|||
while ((c = *f++)) switch (c) {
|
||||
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: store i8* %[[NXT]], i8** %ap
|
||||
// CHECK-DAG: %[[EXT:[^ ]+]] = getelementptr i8* %[[CUR]], i32 4
|
||||
// CHECK-DAG: %[[EXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i32 4
|
||||
// CHECK-DAG: %[[ADR:[^ ]+]] = bitcast i8* %[[EXT]] to i32*
|
||||
// CHECK-DAG: load i32* %[[ADR]]
|
||||
// CHECK: br
|
||||
|
@ -143,7 +143,7 @@ int f_variable(char *f, ...) {
|
|||
break;
|
||||
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: store i8* %[[NXT]], i8** %ap
|
||||
// CHECK-DAG: %[[ADR:[^ ]+]] = bitcast i8* %[[CUR]] to i64*
|
||||
// CHECK-DAG: load i64* %[[ADR]]
|
||||
|
@ -153,7 +153,7 @@ int f_variable(char *f, ...) {
|
|||
break;
|
||||
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: store i8* %[[NXT]], i8** %ap
|
||||
// CHECK-DAG: %[[ADR:[^ ]+]] = bitcast i8* %[[CUR]] to %struct.tiny*
|
||||
// CHECK: br
|
||||
|
@ -162,7 +162,7 @@ int f_variable(char *f, ...) {
|
|||
break;
|
||||
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8* %[[CUR]], i32 16
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i32 16
|
||||
// CHECK-DAG: store i8* %[[NXT]], i8** %ap
|
||||
// CHECK-DAG: %[[ADR:[^ ]+]] = bitcast i8* %[[CUR]] to %struct.small*
|
||||
// CHECK: br
|
||||
|
@ -171,7 +171,7 @@ int f_variable(char *f, ...) {
|
|||
break;
|
||||
|
||||
// CHECK: %[[CUR:[^ ]+]] = load i8** %ap
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: %[[NXT:[^ ]+]] = getelementptr i8, i8* %[[CUR]], i32 8
|
||||
// CHECK-DAG: store i8* %[[NXT]], i8** %ap
|
||||
// CHECK-DAG: %[[IND:[^ ]+]] = bitcast i8* %[[CUR]] to %struct.medium**
|
||||
// CHECK-DAG: %[[ADR:[^ ]+]] = load %struct.medium** %[[IND]]
|
||||
|
|
|
@ -8,8 +8,8 @@ struct Bar {
|
|||
|
||||
struct Bar foo(__builtin_va_list ap) {
|
||||
return __builtin_va_arg(ap, struct Bar);
|
||||
// CHECK: [[FPOP:%.*]] = getelementptr inbounds %struct.__va_list_tag* {{.*}}, i32 0, i32 1
|
||||
// CHECK: [[FPOP:%.*]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* {{.*}}, i32 0, i32 1
|
||||
// CHECK: [[FPO:%.*]] = load i32* [[FPOP]]
|
||||
// CHECK: [[FPVEC:%.*]] = getelementptr i8* {{.*}}, i32 [[FPO]]
|
||||
// CHECK: [[FPVEC:%.*]] = getelementptr i8, i8* {{.*}}, i32 [[FPO]]
|
||||
// CHECK: bitcast i8* [[FPVEC]] to <2 x float>*
|
||||
}
|
||||
|
|
|
@ -95,9 +95,9 @@ double test_PR8567(int n, double (*p)[n][5]) {
|
|||
// CHECK-NEXT: [[N:%.*]] = load i32* [[NV]], align 4
|
||||
// CHECK-NEXT: [[P:%.*]] = load [5 x double]** [[PV]], align 4
|
||||
// CHECK-NEXT: [[T0:%.*]] = mul nsw i32 1, [[N]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [5 x double]* [[P]], i32 [[T0]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [5 x double]* [[T1]], i32 2
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [5 x double]* [[T2]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [5 x double], [5 x double]* [[P]], i32 [[T0]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [5 x double], [5 x double]* [[T1]], i32 2
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [5 x double], [5 x double]* [[T2]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[T4:%.*]] = load double* [[T3]]
|
||||
// CHECK-NEXT: ret double [[T4]]
|
||||
return p[1][2][3];
|
||||
|
@ -121,13 +121,13 @@ int test4(unsigned n, char (*p)[n][n+1][6]) {
|
|||
// CHECK-NEXT: [[T2:%.*]] = udiv i32 [[T1]], 2
|
||||
// CHECK-NEXT: [[T3:%.*]] = mul nuw i32 [[DIM0]], [[DIM1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = mul nsw i32 [[T2]], [[T3]]
|
||||
// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [6 x i8]* [[T0]], i32 [[T4]]
|
||||
// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [6 x i8], [6 x i8]* [[T0]], i32 [[T4]]
|
||||
// CHECK-NEXT: [[T6:%.*]] = load i32* [[N]], align 4
|
||||
// CHECK-NEXT: [[T7:%.*]] = udiv i32 [[T6]], 4
|
||||
// CHECK-NEXT: [[T8:%.*]] = sub i32 0, [[T7]]
|
||||
// CHECK-NEXT: [[T9:%.*]] = mul nuw i32 [[DIM0]], [[DIM1]]
|
||||
// CHECK-NEXT: [[T10:%.*]] = mul nsw i32 [[T8]], [[T9]]
|
||||
// CHECK-NEXT: [[T11:%.*]] = getelementptr inbounds [6 x i8]* [[T5]], i32 [[T10]]
|
||||
// CHECK-NEXT: [[T11:%.*]] = getelementptr inbounds [6 x i8], [6 x i8]* [[T5]], i32 [[T10]]
|
||||
// CHECK-NEXT: store [6 x i8]* [[T11]], [6 x i8]** [[P2]], align 4
|
||||
__typeof(p) p2 = (p + n/2) - n/4;
|
||||
|
||||
|
@ -158,12 +158,12 @@ void test5(void)
|
|||
// CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[Z]], 1
|
||||
// CHECK-NEXT: store i32 [[INC]], i32* [[I]], align 4
|
||||
// CHECK-NEXT: [[O:%.*]] = load i32* [[I]], align 4
|
||||
// CHECK-NEXT: [[AR:%.*]] = getelementptr inbounds [5 x i32]* [[A]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[AR:%.*]] = getelementptr inbounds [5 x i32], [5 x i32]* [[A]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T:%.*]] = bitcast [5 x i32]* [[A]] to i32*
|
||||
// CHECK-NEXT: store i32* [[T]], i32** [[CL]]
|
||||
// CHECK-NEXT: [[TH:%.*]] = load i32** [[CL]]
|
||||
// CHECK-NEXT: [[VLAIX:%.*]] = mul nsw i32 0, [[O]]
|
||||
// CHECK-NEXT: [[ADDPTR:%.*]] = getelementptr inbounds i32* [[TH]], i32 [[VLAIX]]
|
||||
// CHECK-NEXT: [[ADDPTR:%.*]] = getelementptr inbounds i32, i32* [[TH]], i32 [[VLAIX]]
|
||||
// CHECK-NEXT: store i32* [[ADDPTR]], i32** [[CL]]
|
||||
}
|
||||
|
||||
|
@ -182,11 +182,11 @@ void test6(void)
|
|||
// CHECK-NEXT: [[O:%.*]] = bitcast i32*** [[A]] to i32**
|
||||
// CHECK-NEXT: store i32** [[O]], i32*** [[CL]]
|
||||
// CHECK-NEXT: [[T:%.*]] = load i32*** [[CL]]
|
||||
// CHECK-NEXT: [[IX:%.*]] = getelementptr inbounds i32** [[T]], i32 0
|
||||
// CHECK-NEXT: [[IX:%.*]] = getelementptr inbounds i32*, i32** [[T]], i32 0
|
||||
// CHECK-NEXT: [[TH:%.*]] = load i32** [[IX]], align 4
|
||||
// CHECK-NEXT: [[F:%.*]] = mul nsw i32 1, [[Z]]
|
||||
// CHECK-NEXT: [[IX1:%.*]] = getelementptr inbounds i32* [[TH]], i32 [[F]]
|
||||
// CHECK-NEXT: [[IX2:%.*]] = getelementptr inbounds i32* [[IX1]], i32 5
|
||||
// CHECK-NEXT: [[IX1:%.*]] = getelementptr inbounds i32, i32* [[TH]], i32 [[F]]
|
||||
// CHECK-NEXT: [[IX2:%.*]] = getelementptr inbounds i32, i32* [[IX1]], i32 5
|
||||
// CHECK-NEXT: store i32 0, i32* [[IX2]], align 4
|
||||
}
|
||||
|
||||
|
|
|
@ -425,7 +425,7 @@ void test51(struct test51_s *s, __builtin_va_list argList) {
|
|||
// CHECK: br i1
|
||||
// CHECK: [[REG_SAVE_AREA_PTR:%.*]] = getelementptr inbounds {{.*}}, i32 0, i32 3
|
||||
// CHECK-NEXT: [[REG_SAVE_AREA:%.*]] = load i8** [[REG_SAVE_AREA_PTR]]
|
||||
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = getelementptr i8* [[REG_SAVE_AREA]], i32 {{.*}}
|
||||
// CHECK-NEXT: [[VALUE_ADDR:%.*]] = getelementptr i8, i8* [[REG_SAVE_AREA]], i32 {{.*}}
|
||||
// CHECK-NEXT: [[CASTED_VALUE_ADDR:%.*]] = bitcast i8* [[VALUE_ADDR]] to [[STRUCT_TEST51]]
|
||||
// CHECK-NEXT: [[CASTED_TMP_ADDR:%.*]] = bitcast [[STRUCT_TEST51]]* [[TMP_ADDR]] to i8*
|
||||
// CHECK-NEXT: [[RECASTED_VALUE_ADDR:%.*]] = bitcast [[STRUCT_TEST51]]* [[CASTED_VALUE_ADDR]] to i8*
|
||||
|
|
|
@ -33,7 +33,7 @@ void testva (int n, ...) {
|
|||
f(v1);
|
||||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[P:%[a-z0-9]+]] = bitcast i8* [[I]] to i8**
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 4
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 4
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = load i8** [[P]]
|
||||
// CHECK: store i8* [[V1]], i8** [[V:%[a-z0-9]+]], align 4
|
||||
|
@ -43,7 +43,7 @@ void testva (int n, ...) {
|
|||
char v2 = va_arg (ap, char); // expected-warning{{second argument to 'va_arg' is of promotable type 'char'}}
|
||||
f(&v2);
|
||||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 4
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 4
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = load i8* [[I]]
|
||||
// CHECK: store i8 [[V1]], i8* [[V:%[a-z0-9]+]], align 1
|
||||
|
@ -53,7 +53,7 @@ void testva (int n, ...) {
|
|||
f(&v3);
|
||||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[P:%[a-z0-9]+]] = bitcast i8* [[I]] to i32*
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 4
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 4
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = load i32* [[P]]
|
||||
// CHECK: store i32 [[V1]], i32* [[V:%[a-z0-9]+]], align 4
|
||||
|
@ -64,7 +64,7 @@ void testva (int n, ...) {
|
|||
f(&v4);
|
||||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[P:%[a-z0-9]+]] = bitcast i8* [[I]] to i64*
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 8
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 8
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = load i64* [[P]]
|
||||
// CHECK: store i64 [[V1]], i64* [[V:%[a-z0-9]+]], align 4
|
||||
|
@ -76,7 +76,7 @@ void testva (int n, ...) {
|
|||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[I2:%[a-z0-9]+]] = bitcast i8* [[I]] to %struct.x**
|
||||
// CHECK: [[P:%[a-z0-9]+]] = load %struct.x** [[I2]]
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 4
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 4
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = bitcast %struct.x* [[V:%[a-z0-9]+]] to i8*
|
||||
// CHECK: [[P1:%[a-z0-9]+]] = bitcast %struct.x* [[P]] to i8*
|
||||
|
@ -89,12 +89,12 @@ void testva (int n, ...) {
|
|||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[I2:%[a-z0-9]+]] = bitcast i8* [[I]] to [4 x i32]**
|
||||
// CHECK: [[P:%[a-z0-9]+]] = load [4 x i32]** [[I2]]
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 4
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 4
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = bitcast [4 x i32]* [[V0:%[a-z0-9]+]] to i8*
|
||||
// CHECK: [[P1:%[a-z0-9]+]] = bitcast [4 x i32]* [[P]] to i8*
|
||||
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[V1]], i8* [[P1]], i32 16, i32 4, i1 false)
|
||||
// CHECK: [[V2:%[a-z0-9]+]] = getelementptr inbounds [4 x i32]* [[V0]], i32 0, i32 0
|
||||
// CHECK: [[V2:%[a-z0-9]+]] = getelementptr inbounds [4 x i32], [4 x i32]* [[V0]], i32 0, i32 0
|
||||
// CHECK: store i32* [[V2]], i32** [[V:%[a-z0-9]+]], align 4
|
||||
// CHECK: [[V3:%[a-z0-9]+]] = load i32** [[V]], align 4
|
||||
// CHECK: [[V4:%[a-z0-9]+]] = bitcast i32* [[V3]] to i8*
|
||||
|
@ -104,7 +104,7 @@ void testva (int n, ...) {
|
|||
f(&v7);
|
||||
// CHECK: [[I:%[a-z0-9]+]] = load i8** [[AP]]
|
||||
// CHECK: [[P:%[a-z0-9]+]] = bitcast i8* [[I]] to double*
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8* [[I]], i32 8
|
||||
// CHECK: [[IN:%[a-z0-9]+]] = getelementptr i8, i8* [[I]], i32 8
|
||||
// CHECK: store i8* [[IN]], i8** [[AP]]
|
||||
// CHECK: [[V1:%[a-z0-9]+]] = load double* [[P]]
|
||||
// CHECK: store double [[V1]], double* [[V:%[a-z0-9]+]], align 4
|
||||
|
|
|
@ -277,7 +277,7 @@ namespace test6 {
|
|||
// CHECK-NEXT: br i1 [[ISNULL]]
|
||||
// CHECK: [[T0:%.*]] = bitcast [[A]]* [[V]] to void ([[A]]*)***
|
||||
// CHECK-NEXT: [[T1:%.*]] = load void ([[A]]*)*** [[T0]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds void ([[A]]*)** [[T1]], i64 1
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds void ([[A]]*)*, void ([[A]]*)** [[T1]], i64 1
|
||||
// CHECK-NEXT: [[T3:%.*]] = load void ([[A]]*)** [[T2]]
|
||||
// CHECK-NEXT: call void [[T3]]([[A]]* [[V]])
|
||||
// CHECK-NEXT: br label
|
||||
|
@ -386,9 +386,9 @@ namespace test9 {
|
|||
// CHECK-NEXT: [[ALLOC:%.*]] = call noalias i8* @_Znam(i32 [[T4]])
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[ALLOC]] to i32*
|
||||
// CHECK-NEXT: store i32 16, i32* [[T0]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i32* [[T0]], i32 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i32, i32* [[T0]], i32 1
|
||||
// CHECK-NEXT: store i32 [[N]], i32* [[T1]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8* [[ALLOC]], i64 16
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i64 16
|
||||
// CHECK-NEXT: bitcast i8* [[T0]] to [[TEST9]]*
|
||||
// Array allocation follows.
|
||||
|
||||
|
@ -400,11 +400,11 @@ namespace test9 {
|
|||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], null
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
// CHECK: [[T0:%.*]] = bitcast [[TEST9]]* [[BEGIN]] to i8*
|
||||
// CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8* [[T0]], i64 -16
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8* [[ALLOC]], i64 4
|
||||
// CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 -16
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i64 4
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to i32*
|
||||
// CHECK-NEXT: [[N:%.*]] = load i32* [[T1]]
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[TEST9]]* [[BEGIN]], i32 [[N]]
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[TEST9]], [[TEST9]]* [[BEGIN]], i32 [[N]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
// Array deallocation follows.
|
||||
|
|
|
@ -167,13 +167,13 @@ namespace N1 {
|
|||
};
|
||||
unsigned read(S* s) {
|
||||
// CHECK-X86-64-LABEL: define i32 @_ZN2N14read
|
||||
// CHECK-X86-64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}, %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[val:.*]] = load i8* %[[ptr]]
|
||||
// CHECK-X86-64: %[[and:.*]] = and i8 %[[val]], 1
|
||||
// CHECK-X86-64: %[[ext:.*]] = zext i8 %[[and]] to i32
|
||||
// CHECK-X86-64: ret i32 %[[ext]]
|
||||
// CHECK-PPC64-LABEL: define zeroext i32 @_ZN2N14read
|
||||
// CHECK-PPC64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}, %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[val:.*]] = load i8* %[[ptr]]
|
||||
// CHECK-PPC64: %[[shr:.*]] = lshr i8 %[[val]], 7
|
||||
// CHECK-PPC64: %[[ext:.*]] = zext i8 %[[shr]] to i32
|
||||
|
@ -182,7 +182,7 @@ namespace N1 {
|
|||
}
|
||||
void write(S* s, unsigned x) {
|
||||
// CHECK-X86-64-LABEL: define void @_ZN2N15write
|
||||
// CHECK-X86-64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}, %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[x_trunc:.*]] = trunc i32 %{{.*}} to i8
|
||||
// CHECK-X86-64: %[[old:.*]] = load i8* %[[ptr]]
|
||||
// CHECK-X86-64: %[[x_and:.*]] = and i8 %[[x_trunc]], 1
|
||||
|
@ -190,7 +190,7 @@ namespace N1 {
|
|||
// CHECK-X86-64: %[[new:.*]] = or i8 %[[old_and]], %[[x_and]]
|
||||
// CHECK-X86-64: store i8 %[[new]], i8* %[[ptr]]
|
||||
// CHECK-PPC64-LABEL: define void @_ZN2N15write
|
||||
// CHECK-PPC64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr:.*]] = getelementptr inbounds %{{.*}}, %{{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[x_trunc:.*]] = trunc i32 %{{.*}} to i8
|
||||
// CHECK-PPC64: %[[old:.*]] = load i8* %[[ptr]]
|
||||
// CHECK-PPC64: %[[x_and:.*]] = and i8 %[[x_trunc]], 1
|
||||
|
@ -301,13 +301,13 @@ namespace N4 {
|
|||
// instrumented by ThreadSanitizer.
|
||||
//
|
||||
// CHECK-X86-64-LABEL: define i32 @_ZN2N44read
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-X86-64: %[[val:.*]] = load i24* %[[ptr]]
|
||||
// CHECK-X86-64: %[[ext:.*]] = zext i24 %[[val]] to i32
|
||||
// CHECK-X86-64: ret i32 %[[ext]]
|
||||
// CHECK-PPC64-LABEL: define zeroext i32 @_ZN2N44read
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-PPC64: %[[val:.*]] = load i24* %[[ptr]]
|
||||
// CHECK-PPC64: %[[ext:.*]] = zext i24 %[[val]] to i32
|
||||
|
@ -316,12 +316,12 @@ namespace N4 {
|
|||
}
|
||||
void write(Base* s, unsigned x) {
|
||||
// CHECK-X86-64-LABEL: define void @_ZN2N45write
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-X86-64: %[[new:.*]] = trunc i32 %{{.*}} to i24
|
||||
// CHECK-X86-64: store i24 %[[new]], i24* %[[ptr]]
|
||||
// CHECK-PPC64-LABEL: define void @_ZN2N45write
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-PPC64: %[[new:.*]] = trunc i32 %{{.*}} to i24
|
||||
// CHECK-PPC64: store i24 %[[new]], i24* %[[ptr]]
|
||||
|
@ -391,7 +391,7 @@ namespace N6 {
|
|||
// CHECK-X86-64: %[[ptr1:.*]] = bitcast {{.*}}* %{{.*}} to i24*
|
||||
// CHECK-X86-64: %[[val1:.*]] = load i24* %[[ptr1]]
|
||||
// CHECK-X86-64: %[[ext1:.*]] = zext i24 %[[val1]] to i32
|
||||
// CHECK-X86-64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[val2:.*]] = load i8* %[[ptr2]]
|
||||
// CHECK-X86-64: %[[ext2:.*]] = zext i8 %[[val2]] to i32
|
||||
// CHECK-X86-64: %[[add:.*]] = add nsw i32 %[[ext1]], %[[ext2]]
|
||||
|
@ -400,7 +400,7 @@ namespace N6 {
|
|||
// CHECK-PPC64: %[[ptr1:.*]] = bitcast {{.*}}* %{{.*}} to i24*
|
||||
// CHECK-PPC64: %[[val1:.*]] = load i24* %[[ptr1]]
|
||||
// CHECK-PPC64: %[[ext1:.*]] = zext i24 %[[val1]] to i32
|
||||
// CHECK-PPC64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[val2:.*]] = load i8* %[[ptr2]]
|
||||
// CHECK-PPC64: %[[ext2:.*]] = zext i8 %[[val2]] to i32
|
||||
// CHECK-PPC64: %[[add:.*]] = add nsw i32 %[[ext1]], %[[ext2]]
|
||||
|
@ -413,14 +413,14 @@ namespace N6 {
|
|||
// CHECK-X86-64: %[[new1:.*]] = trunc i32 %{{.*}} to i24
|
||||
// CHECK-X86-64: store i24 %[[new1]], i24* %[[ptr1]]
|
||||
// CHECK-X86-64: %[[new2:.*]] = trunc i32 %{{.*}} to i8
|
||||
// CHECK-X86-64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: store i8 %[[new2]], i8* %[[ptr2]]
|
||||
// CHECK-PPC64-LABEL: define void @_ZN2N65write
|
||||
// CHECK-PPC64: %[[ptr1:.*]] = bitcast {{.*}}* %{{.*}} to i24*
|
||||
// CHECK-PPC64: %[[new1:.*]] = trunc i32 %{{.*}} to i24
|
||||
// CHECK-PPC64: store i24 %[[new1]], i24* %[[ptr1]]
|
||||
// CHECK-PPC64: %[[new2:.*]] = trunc i32 %{{.*}} to i8
|
||||
// CHECK-PPC64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr2:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: store i8 %[[new2]], i8* %[[ptr2]]
|
||||
s->b1 = x;
|
||||
s->b2 = x;
|
||||
|
@ -451,13 +451,13 @@ namespace N7 {
|
|||
// instrumented by ThreadSanitizer.
|
||||
//
|
||||
// CHECK-X86-64-LABEL: define i32 @_ZN2N74read
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-X86-64: %[[val:.*]] = load i24* %[[ptr]]
|
||||
// CHECK-X86-64: %[[ext:.*]] = zext i24 %[[val]] to i32
|
||||
// CHECK-X86-64: ret i32 %[[ext]]
|
||||
// CHECK-PPC64-LABEL: define zeroext i32 @_ZN2N74read
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-PPC64: %[[val:.*]] = load i24* %[[ptr]]
|
||||
// CHECK-PPC64: %[[ext:.*]] = zext i24 %[[val]] to i32
|
||||
|
@ -466,12 +466,12 @@ namespace N7 {
|
|||
}
|
||||
void write(B2* s, unsigned x) {
|
||||
// CHECK-X86-64-LABEL: define void @_ZN2N75write
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-X86-64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-X86-64: %[[new:.*]] = trunc i32 %{{.*}} to i24
|
||||
// CHECK-X86-64: store i24 %[[new]], i24* %[[ptr]]
|
||||
// CHECK-PPC64-LABEL: define void @_ZN2N75write
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}}* %{{.*}}, i32 0, i32 1
|
||||
// CHECK-PPC64: %[[ptr:.*]] = bitcast [3 x i8]* %[[gep]] to i24*
|
||||
// CHECK-PPC64: %[[new:.*]] = trunc i32 %{{.*}} to i24
|
||||
// CHECK-PPC64: store i24 %[[new]], i24* %[[ptr]]
|
||||
|
|
|
@ -72,8 +72,8 @@ namespace test_complex_int_ref_mutable {
|
|||
takeABlock(^{ takeItByValue(x); });
|
||||
// CHECK: [[R:%.*]] = load i32* getelementptr inbounds ({ i32, i32 }* @_ZN28test_complex_int_ref_mutable1yE, i32 0, i32 0)
|
||||
// CHECK-NEXT: [[I:%.*]] = load i32* getelementptr inbounds ({ i32, i32 }* @_ZN28test_complex_int_ref_mutable1yE, i32 0, i32 1)
|
||||
// CHECK-NEXT: [[RSLOT:%.*]] = getelementptr inbounds { i32, i32 }* [[CSLOT:%.*]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[ISLOT:%.*]] = getelementptr inbounds { i32, i32 }* [[CSLOT]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[RSLOT:%.*]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[CSLOT:%.*]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[ISLOT:%.*]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[CSLOT]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i32 [[R]], i32* [[RSLOT]]
|
||||
// CHECK-NEXT: store i32 [[I]], i32* [[ISLOT]]
|
||||
// CHECK-NEXT: [[COERCE:%.*]] = bitcast { i32, i32 }* [[CSLOT]] to i64*
|
||||
|
@ -103,9 +103,9 @@ namespace test_block_in_lambda {
|
|||
// CHECK-LABEL: define internal void @"_ZZN20test_block_in_lambda4testENS_1AEENK3$_0clEv"(
|
||||
// CHECK: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]], align 8
|
||||
// CHECK: [[THIS:%.*]] = load [[LAMBDA_T:%.*]]**
|
||||
// CHECK: [[TO_DESTROY:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[LAMBDA_T]]* [[THIS]], i32 0, i32 0
|
||||
// CHECK: [[TO_DESTROY:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[LAMBDA_T]], [[LAMBDA_T]]* [[THIS]], i32 0, i32 0
|
||||
// CHECK-NEXT: call void @_ZN20test_block_in_lambda1AC1ERKS0_({{.*}}* [[T0]], {{.*}}* dereferenceable({{[0-9]+}}) [[T1]])
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[BLOCK_T]]* [[BLOCK]] to void ()*
|
||||
// CHECK-NEXT: call void @_ZN20test_block_in_lambda9takeBlockEU13block_pointerFvvE(void ()* [[T0]])
|
||||
|
|
|
@ -156,14 +156,14 @@ namespace test5 {
|
|||
// CHECK-NEXT: [[T0:%.*]] = zext i1
|
||||
// CHECK-NEXT: store i8 [[T0]], i8* [[COND]], align 1
|
||||
// CHECK-NEXT: call void @_ZN5test51AC1Ev([[A]]* [[X]])
|
||||
// CHECK-NEXT: [[CLEANUP_ADDR:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[CLEANUP_ADDR:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8* [[COND]], align 1
|
||||
// CHECK-NEXT: [[T1:%.*]] = trunc i8 [[T0]] to i1
|
||||
// CHECK-NEXT: store i1 false, i1* [[CLEANUP_ACTIVE]]
|
||||
// CHECK-NEXT: br i1 [[T1]],
|
||||
|
||||
// CHECK-NOT: br
|
||||
// CHECK: [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: call void @_ZN5test51AC1ERKS0_([[A]]* [[CAPTURE]], [[A]]* dereferenceable({{[0-9]+}}) [[X]])
|
||||
// CHECK-NEXT: store i1 true, i1* [[CLEANUP_ACTIVE]]
|
||||
// CHECK-NEXT: bitcast [[BLOCK_T]]* [[BLOCK]] to void ()*
|
||||
|
|
|
@ -33,18 +33,18 @@ void test1() {
|
|||
|
||||
// CHECK-1: define {{.*}} void @_ZN9TestClass10MemberFuncEv
|
||||
// CHECK-1: alloca %struct.anon
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]]* %{{[^,]*}}, i32 0, i32 0
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* %{{[^,]*}}, i32 0, i32 0
|
||||
// CHECK-1: store %struct.Foo* %f, %struct.Foo**
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]]* %{{[^,]*}}, i32 0, i32 1
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* %{{[^,]*}}, i32 0, i32 1
|
||||
// CHECK-1: call void @[[HelperName:[A-Za-z0-9_]+]](%[[Capture]]*
|
||||
// CHECK-1: call {{.*}}FooD1Ev
|
||||
// CHECK-1: ret
|
||||
}
|
||||
|
||||
// CHECK-1: define internal void @[[HelperName]]
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]]* {{[^,]*}}, i32 0, i32 1
|
||||
// CHECK-1: getelementptr inbounds %struct.TestClass* {{[^,]*}}, i32 0, i32 0
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]]* {{[^,]*}}, i32 0, i32 0
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* {{[^,]*}}, i32 0, i32 1
|
||||
// CHECK-1: getelementptr inbounds %struct.TestClass, %struct.TestClass* {{[^,]*}}, i32 0, i32 0
|
||||
// CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* {{[^,]*}}, i32 0, i32 0
|
||||
|
||||
void test2(int x) {
|
||||
int y = [&]() {
|
||||
|
@ -62,7 +62,7 @@ void test2(int x) {
|
|||
// CHECK-2: call void @[[HelperName:["$_A-Za-z0-9]+]](%[[Capture:.*]]*
|
||||
//
|
||||
// CHECK-2: define internal void @[[HelperName]]
|
||||
// CHECK-2: getelementptr inbounds %[[Capture]]*
|
||||
// CHECK-2: getelementptr inbounds %[[Capture]], %[[Capture]]*
|
||||
// CHECK-2: load i32**
|
||||
// CHECK-2: load i32*
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ void member_access(S *p) {
|
|||
// Check the hash against the table:
|
||||
//
|
||||
// CHECK-NEXT: %[[IDX:.*]] = and i64 %{{.*}}, 127
|
||||
// CHECK-NEXT: getelementptr inbounds [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %[[IDX]]
|
||||
// CHECK-NEXT: getelementptr inbounds [128 x i64], [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %[[IDX]]
|
||||
// CHECK-NEXT: %[[CACHEVAL:.*]] = load i64*
|
||||
// CHECK-NEXT: icmp eq i64 %[[CACHEVAL]], %[[HASH]]
|
||||
// CHECK-NEXT: br i1
|
||||
|
@ -119,7 +119,7 @@ void member_access(S *p) {
|
|||
// CHECK: load i64*
|
||||
// CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}},
|
||||
// [...]
|
||||
// CHECK: getelementptr inbounds [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %
|
||||
// CHECK: getelementptr inbounds [128 x i64], [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %
|
||||
// CHECK: br i1
|
||||
// CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %{{.*}})
|
||||
// CHECK-NOT: unreachable
|
||||
|
@ -363,7 +363,7 @@ class C : public A, public B // align=16
|
|||
void downcast_pointer(B *b) {
|
||||
(void) static_cast<C*>(b);
|
||||
// Alignment check from EmitTypeCheck(TCK_DowncastPointer, ...)
|
||||
// CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8* {{.*}}, i64 -16
|
||||
// CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8, i8* {{.*}}, i64 -16
|
||||
// CHECK-NEXT: [[C:%[0-9]*]] = bitcast i8* [[SUB]] to %class.C*
|
||||
// null check goes here
|
||||
// CHECK: [[FROM_PHI:%[0-9]*]] = phi %class.C* [ [[C]], {{.*}} ], {{.*}}
|
||||
|
@ -380,7 +380,7 @@ void downcast_pointer(B *b) {
|
|||
void downcast_reference(B &b) {
|
||||
(void) static_cast<C&>(b);
|
||||
// Alignment check from EmitTypeCheck(TCK_DowncastReference, ...)
|
||||
// CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8* {{.*}}, i64 -16
|
||||
// CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8, i8* {{.*}}, i64 -16
|
||||
// CHECK-NEXT: [[C:%[0-9]*]] = bitcast i8* [[SUB]] to %class.C*
|
||||
// Objectsize check goes here
|
||||
// CHECK: [[C_INT:%[0-9]*]] = ptrtoint %class.C* [[C]] to i64
|
||||
|
@ -398,13 +398,13 @@ void indirect_function_call(void (*p)(int)) {
|
|||
// CHECK: [[PTR:%[0-9]*]] = bitcast void (i32)* {{.*}} to <{ i32, i8* }>*
|
||||
|
||||
// Signature check
|
||||
// CHECK-NEXT: [[SIGPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>* [[PTR]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[SIGPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>, <{ i32, i8* }>* [[PTR]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[SIG:%[0-9]*]] = load i32* [[SIGPTR]]
|
||||
// CHECK-NEXT: [[SIGCMP:%[0-9]*]] = icmp eq i32 [[SIG]], 1413876459
|
||||
// CHECK-NEXT: br i1 [[SIGCMP]]
|
||||
|
||||
// RTTI pointer check
|
||||
// CHECK: [[RTTIPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>* [[PTR]], i32 0, i32 1
|
||||
// CHECK: [[RTTIPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>, <{ i32, i8* }>* [[PTR]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[RTTI:%[0-9]*]] = load i8** [[RTTIPTR]]
|
||||
// CHECK-NEXT: [[RTTICMP:%[0-9]*]] = icmp eq i8* [[RTTI]], bitcast ({ i8*, i8* }* @_ZTIFviE to i8*)
|
||||
// CHECK-NEXT: br i1 [[RTTICMP]]
|
||||
|
|
|
@ -15,7 +15,7 @@ struct Y {
|
|||
// CHECK-LABEL: define i32 @_Z1fv()
|
||||
int f() {
|
||||
// CHECK: [[LVALUE:%[a-z0-9.]+]] = alloca
|
||||
// CHECK-NEXT: [[I:%[a-z0-9]+]] = getelementptr inbounds {{.*}}* [[LVALUE]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[I:%[a-z0-9]+]] = getelementptr inbounds {{.*}}, {{.*}}* [[LVALUE]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i32 17, i32* [[I]]
|
||||
// CHECK-NEXT: [[X:%[a-z0-9]+]] = getelementptr inbounds {{.*}} [[LVALUE]], i32 0, i32 1
|
||||
// CHECK-NEXT: call %struct.X* @_ZN1XC1EPKc({{.*}}[[X]]
|
||||
|
@ -32,7 +32,7 @@ int g() {
|
|||
const int (&v)[2] = (int [2]) {1,2};
|
||||
|
||||
// CHECK: [[A:%[a-z0-9.]+]] = load [2 x i32]** [[V]]
|
||||
// CHECK-NEXT: [[A0ADDR:%[a-z0-9.]+]] = getelementptr inbounds [2 x i32]* [[A]], i32 0, {{.*}} 0
|
||||
// CHECK-NEXT: [[A0ADDR:%[a-z0-9.]+]] = getelementptr inbounds [2 x i32], [2 x i32]* [[A]], i32 0, {{.*}} 0
|
||||
// CHECK-NEXT: [[A0:%[a-z0-9.]+]] = load i32* [[A0ADDR]]
|
||||
// CHECK-NEXT: ret i32 [[A0]]
|
||||
return v[0];
|
||||
|
|
|
@ -129,7 +129,7 @@ void test_destructor() {
|
|||
|
||||
// Verify that virtual calls to destructors are not marked with a 'returned'
|
||||
// this parameter at the call site...
|
||||
// CHECKARM: [[VFN:%.*]] = getelementptr inbounds %class.E* (%class.E*)**
|
||||
// CHECKARM: [[VFN:%.*]] = getelementptr inbounds %class.E* (%class.E*)*, %class.E* (%class.E*)**
|
||||
// CHECKARM: [[THUNK:%.*]] = load %class.E* (%class.E*)** [[VFN]]
|
||||
// CHECKARM: call %class.E* [[THUNK]](%class.E* %
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ namespace InitVTable {
|
|||
// CHECK: [[T0:%.*]] = bitcast [[B:%.*]]* [[THIS:%.*]] to i32 (...)***
|
||||
// CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]]
|
||||
// CHECK: [[VTBL:%.*]] = load i32 ([[B]]*)*** {{%.*}}
|
||||
// CHECK-NEXT: [[FNP:%.*]] = getelementptr inbounds i32 ([[B]]*)** [[VTBL]], i64 0
|
||||
// CHECK-NEXT: [[FNP:%.*]] = getelementptr inbounds i32 ([[B]]*)*, i32 ([[B]]*)** [[VTBL]], i64 0
|
||||
// CHECK-NEXT: [[FN:%.*]] = load i32 ([[B]]*)** [[FNP]]
|
||||
// CHECK-NEXT: [[ARG:%.*]] = call i32 [[FN]]([[B]]* [[THIS]])
|
||||
// CHECK-NEXT: call void @_ZN10InitVTable1AC2Ei({{.*}}* {{%.*}}, i32 [[ARG]])
|
||||
|
|
|
@ -138,9 +138,9 @@ void f(B b1) {
|
|||
|
||||
// CHECK: define linkonce_odr dereferenceable({{[0-9]+}}) [[A:%.*]]* @_ZN12rdar138169401AaSERKS0_(
|
||||
// CHECK: [[THIS:%.*]] = load [[A]]**
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]]* [[THIS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[OTHER:%.*]] = load [[A]]**
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]]* [[OTHER]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OTHER]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i16* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T5:%.*]] = bitcast i16* [[T2]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T4]], i8* [[T5]], i64 8, i32 8, i1 false)
|
||||
|
@ -167,9 +167,9 @@ void f(B b1) {
|
|||
// CHECK: [[THIS:%.*]] = load [[A]]**
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[THIS]] to i32 (...)***
|
||||
// CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([4 x i8*]* @_ZTVN12rdar138169401AE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]]* [[THIS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[OTHER:%.*]] = load [[A]]**
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]]* [[OTHER]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[OTHER]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i16* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T5:%.*]] = bitcast i16* [[T2]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T4]], i8* [[T5]], i64 8, i32 8, i1 false)
|
||||
|
|
|
@ -43,11 +43,11 @@ namespace reference {
|
|||
// CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %{{.*}}, align
|
||||
const A &ra1{1, 2};
|
||||
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32]* %{{.*}}, i{{32|64}} 0, i{{32|64}} 0
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]* %{{.*}}, i{{32|64}} 0, i{{32|64}} 0
|
||||
// CHECK-NEXT: store i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds i32* %{{.*}}, i{{32|64}} 1
|
||||
// CHECK-NEXT: getelementptr inbounds i32, i32* %{{.*}}, i{{32|64}} 1
|
||||
// CHECK-NEXT: store i32 2
|
||||
// CHECK-NEXT: getelementptr inbounds i32* %{{.*}}, i{{32|64}} 1
|
||||
// CHECK-NEXT: getelementptr inbounds i32, i32* %{{.*}}, i{{32|64}} 1
|
||||
// CHECK-NEXT: store i32 3
|
||||
// CHECK-NEXT: store [3 x i32]* %{{.*}}, [3 x i32]** %{{.*}}, align
|
||||
const int (&arrayRef)[] = {1, 2, 3};
|
||||
|
|
|
@ -40,7 +40,7 @@ void fn1(int i) {
|
|||
// CHECK-LABEL: define void @_Z3fn1i
|
||||
// temporary array
|
||||
// CHECK: [[array:%[^ ]+]] = alloca [3 x i32]
|
||||
// CHECK: getelementptr inbounds [3 x i32]* [[array]], i{{32|64}} 0
|
||||
// CHECK: getelementptr inbounds [3 x i32], [3 x i32]* [[array]], i{{32|64}} 0
|
||||
// CHECK-NEXT: store i32 1, i32*
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: store
|
||||
|
@ -49,10 +49,10 @@ void fn1(int i) {
|
|||
// CHECK-NEXT: store
|
||||
// init the list
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32]*
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]*
|
||||
// CHECK-NEXT: store i32*
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32]* [[array]], i{{32|64}} 0, i{{32|64}} 3
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]* [[array]], i{{32|64}} 0, i{{32|64}} 3
|
||||
// CHECK-NEXT: store i32*
|
||||
std::initializer_list<int> intlist{1, 2, i};
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ void fn1(int i) {
|
|||
// CHECK-LABEL: define void @_Z3fn1i
|
||||
// temporary array
|
||||
// CHECK: [[array:%[^ ]+]] = alloca [3 x i32]
|
||||
// CHECK: getelementptr inbounds [3 x i32]* [[array]], i{{32|64}} 0
|
||||
// CHECK: getelementptr inbounds [3 x i32], [3 x i32]* [[array]], i{{32|64}} 0
|
||||
// CHECK-NEXT: store i32 1, i32*
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: store
|
||||
|
@ -108,7 +108,7 @@ void fn1(int i) {
|
|||
// CHECK-NEXT: store
|
||||
// init the list
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32]*
|
||||
// CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]*
|
||||
// CHECK-NEXT: store i32*
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: store i{{32|64}} 3
|
||||
|
|
|
@ -5,9 +5,9 @@ struct A { int a, b; int f(); };
|
|||
// CHECK: define {{.*}}@_Z3fn1i(
|
||||
int fn1(int x) {
|
||||
// CHECK: %[[INITLIST:.*]] = alloca %struct.A
|
||||
// CHECK: %[[A:.*]] = getelementptr inbounds %struct.A* %[[INITLIST]], i32 0, i32 0
|
||||
// CHECK: %[[A:.*]] = getelementptr inbounds %struct.A, %struct.A* %[[INITLIST]], i32 0, i32 0
|
||||
// CHECK: store i32 %{{.*}}, i32* %[[A]], align 4
|
||||
// CHECK: %[[B:.*]] = getelementptr inbounds %struct.A* %[[INITLIST]], i32 0, i32 1
|
||||
// CHECK: %[[B:.*]] = getelementptr inbounds %struct.A, %struct.A* %[[INITLIST]], i32 0, i32 1
|
||||
// CHECK: store i32 5, i32* %[[B]], align 4
|
||||
// CHECK: call i32 @_ZN1A1fEv(%struct.A* %[[INITLIST]])
|
||||
return A{x, 5}.f();
|
||||
|
@ -18,7 +18,7 @@ struct B { int &r; int &f() { return r; } };
|
|||
// CHECK: define {{.*}}@_Z3fn2Ri(
|
||||
int &fn2(int &v) {
|
||||
// CHECK: %[[INITLIST2:.*]] = alloca %struct.B, align 8
|
||||
// CHECK: %[[R:.*]] = getelementptr inbounds %struct.B* %[[INITLIST2:.*]], i32 0, i32 0
|
||||
// CHECK: %[[R:.*]] = getelementptr inbounds %struct.B, %struct.B* %[[INITLIST2:.*]], i32 0, i32 0
|
||||
// CHECK: store i32* %{{.*}}, i32** %[[R]], align 8
|
||||
// CHECK: call dereferenceable({{[0-9]+}}) i32* @_ZN1B1fEv(%struct.B* %[[INITLIST2:.*]])
|
||||
return B{v}.f();
|
||||
|
|
|
@ -10,7 +10,7 @@ void *p = new S[2][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
|
|||
// CHECK: %[[ALLOC:.*]] = call noalias i8* @_Znam(i64 32)
|
||||
// CHECK: %[[COOKIE:.*]] = bitcast i8* %[[ALLOC]] to i64*
|
||||
// CHECK: store i64 6, i64* %[[COOKIE]]
|
||||
// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8* %[[ALLOC]], i64 8
|
||||
// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8, i8* %[[ALLOC]], i64 8
|
||||
// CHECK: %[[START_AS_S:.*]] = bitcast i8* %[[START_AS_i8]] to %[[S:.*]]*
|
||||
//
|
||||
// Explicit initializers:
|
||||
|
@ -19,22 +19,22 @@ void *p = new S[2][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
|
|||
//
|
||||
// CHECK: %[[S_0:.*]] = bitcast %[[S]]* %[[START_AS_S]] to [3 x %[[S]]]*
|
||||
//
|
||||
// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_0]], i64 0, i64 0
|
||||
// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i64 0, i64 0
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_0_0]], i32 1)
|
||||
// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]]* %[[S_0_0]], i64 1
|
||||
// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_0]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_0_1]], i32 2)
|
||||
// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]]* %[[S_0_1]], i64 1
|
||||
// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_1]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_0_2]], i32 3)
|
||||
//
|
||||
// { 4, 5, 6 }
|
||||
//
|
||||
// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_0]], i32 1
|
||||
// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i32 1
|
||||
//
|
||||
// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_1]], i64 0, i64 0
|
||||
// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_1]], i64 0, i64 0
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_1_0]], i32 4)
|
||||
// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]]* %[[S_1_0]], i64 1
|
||||
// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_0]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_1_1]], i32 5)
|
||||
// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]]* %[[S_1_1]], i64 1
|
||||
// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_1]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_1_2]], i32 6)
|
||||
//
|
||||
// CHECK-NOT: br i1
|
||||
|
@ -54,7 +54,7 @@ void *q = new S[n][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
|
|||
//
|
||||
// CHECK: %[[COOKIE:.*]] = bitcast i8* %[[ALLOC]] to i64*
|
||||
// CHECK: store i64 %[[ELTS]], i64* %[[COOKIE]]
|
||||
// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8* %[[ALLOC]], i64 8
|
||||
// CHECK: %[[START_AS_i8:.*]] = getelementptr inbounds i8, i8* %[[ALLOC]], i64 8
|
||||
// CHECK: %[[START_AS_S:.*]] = bitcast i8* %[[START_AS_i8]] to %[[S]]*
|
||||
//
|
||||
// Explicit initializers:
|
||||
|
@ -63,39 +63,39 @@ void *q = new S[n][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
|
|||
//
|
||||
// CHECK: %[[S_0:.*]] = bitcast %[[S]]* %[[START_AS_S]] to [3 x %[[S]]]*
|
||||
//
|
||||
// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_0]], i64 0, i64 0
|
||||
// CHECK: %[[S_0_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i64 0, i64 0
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_0_0]], i32 1)
|
||||
// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]]* %[[S_0_0]], i64 1
|
||||
// CHECK: %[[S_0_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_0]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_0_1]], i32 2)
|
||||
// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]]* %[[S_0_1]], i64 1
|
||||
// CHECK: %[[S_0_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_0_1]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_0_2]], i32 3)
|
||||
//
|
||||
// { 4, 5, 6 }
|
||||
//
|
||||
// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_0]], i32 1
|
||||
// CHECK: %[[S_1:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_0]], i32 1
|
||||
//
|
||||
// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_1]], i64 0, i64 0
|
||||
// CHECK: %[[S_1_0:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_1]], i64 0, i64 0
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_1_0]], i32 4)
|
||||
// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]]* %[[S_1_0]], i64 1
|
||||
// CHECK: %[[S_1_1:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_0]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_1_1]], i32 5)
|
||||
// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]]* %[[S_1_1]], i64 1
|
||||
// CHECK: %[[S_1_2:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_1_1]], i64 1
|
||||
// CHECK: call void @_ZN1SC1Ei(%[[S]]* %[[S_1_2]], i32 6)
|
||||
//
|
||||
// And the rest.
|
||||
//
|
||||
// CHECK: %[[S_2:.*]] = getelementptr inbounds [3 x %[[S]]]* %[[S_1]], i32 1
|
||||
// CHECK: %[[S_2:.*]] = getelementptr inbounds [3 x %[[S]]], [3 x %[[S]]]* %[[S_1]], i32 1
|
||||
// CHECK: %[[S_2_AS_S:.*]] = bitcast [3 x %[[S]]]* %[[S_2]] to %[[S]]*
|
||||
//
|
||||
// CHECK: %[[REST:.*]] = sub i64 %[[ELTS]], 6
|
||||
// CHECK: icmp eq i64 %[[REST]], 0
|
||||
// CHECK: br i1
|
||||
//
|
||||
// CHECK: %[[END:.*]] = getelementptr inbounds %[[S]]* %[[S_2_AS_S]], i64 %[[REST]]
|
||||
// CHECK: %[[END:.*]] = getelementptr inbounds %[[S]], %[[S]]* %[[S_2_AS_S]], i64 %[[REST]]
|
||||
// CHECK: br label
|
||||
//
|
||||
// CHECK: %[[CUR:.*]] = phi %[[S]]* [ %[[S_2_AS_S]], {{.*}} ], [ %[[NEXT:.*]], {{.*}} ]
|
||||
// CHECK: call void @_ZN1SC1Ev(%[[S]]* %[[CUR]])
|
||||
// CHECK: %[[NEXT]] = getelementptr inbounds %[[S]]* %[[CUR]], i64 1
|
||||
// CHECK: %[[NEXT]] = getelementptr inbounds %[[S]], %[[S]]* %[[CUR]], i64 1
|
||||
// CHECK: icmp eq %[[S]]* %[[NEXT]], %[[END]]
|
||||
// CHECK: br i1
|
||||
//
|
||||
|
@ -123,33 +123,33 @@ void *r = new T[n][3]{ { 1, 2, 3 }, { 4, 5, 6 } };
|
|||
//
|
||||
// CHECK: %[[T_0:.*]] = bitcast %[[T]]* %[[START_AS_T]] to [3 x %[[T]]]*
|
||||
//
|
||||
// CHECK: %[[T_0_0:.*]] = getelementptr inbounds [3 x %[[T]]]* %[[T_0]], i64 0, i64 0
|
||||
// CHECK: %[[T_0_0_0:.*]] = getelementptr inbounds %[[T]]* %[[T_0_0]], i32 0, i32 0
|
||||
// CHECK: %[[T_0_0:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_0]], i64 0, i64 0
|
||||
// CHECK: %[[T_0_0_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_0]], i32 0, i32 0
|
||||
// CHECK: store i32 1, i32* %[[T_0_0_0]]
|
||||
// CHECK: %[[T_0_1:.*]] = getelementptr inbounds %[[T]]* %[[T_0_0]], i64 1
|
||||
// CHECK: %[[T_0_1_0:.*]] = getelementptr inbounds %[[T]]* %[[T_0_1]], i32 0, i32 0
|
||||
// CHECK: %[[T_0_1:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_0]], i64 1
|
||||
// CHECK: %[[T_0_1_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_1]], i32 0, i32 0
|
||||
// CHECK: store i32 2, i32* %[[T_0_1_0]]
|
||||
// CHECK: %[[T_0_2:.*]] = getelementptr inbounds %[[T]]* %[[T_0_1]], i64 1
|
||||
// CHECK: %[[T_0_2_0:.*]] = getelementptr inbounds %[[T]]* %[[T_0_2]], i32 0, i32 0
|
||||
// CHECK: %[[T_0_2:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_1]], i64 1
|
||||
// CHECK: %[[T_0_2_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_0_2]], i32 0, i32 0
|
||||
// CHECK: store i32 3, i32* %[[T_0_2_0]]
|
||||
//
|
||||
// { 4, 5, 6 }
|
||||
//
|
||||
// CHECK: %[[T_1:.*]] = getelementptr inbounds [3 x %[[T]]]* %[[T_0]], i32 1
|
||||
// CHECK: %[[T_1:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_0]], i32 1
|
||||
//
|
||||
// CHECK: %[[T_1_0:.*]] = getelementptr inbounds [3 x %[[T]]]* %[[T_1]], i64 0, i64 0
|
||||
// CHECK: %[[T_1_0_0:.*]] = getelementptr inbounds %[[T]]* %[[T_1_0]], i32 0, i32 0
|
||||
// CHECK: %[[T_1_0:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_1]], i64 0, i64 0
|
||||
// CHECK: %[[T_1_0_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_0]], i32 0, i32 0
|
||||
// CHECK: store i32 4, i32* %[[T_1_0_0]]
|
||||
// CHECK: %[[T_1_1:.*]] = getelementptr inbounds %[[T]]* %[[T_1_0]], i64 1
|
||||
// CHECK: %[[T_1_1_0:.*]] = getelementptr inbounds %[[T]]* %[[T_1_1]], i32 0, i32 0
|
||||
// CHECK: %[[T_1_1:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_0]], i64 1
|
||||
// CHECK: %[[T_1_1_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_1]], i32 0, i32 0
|
||||
// CHECK: store i32 5, i32* %[[T_1_1_0]]
|
||||
// CHECK: %[[T_1_2:.*]] = getelementptr inbounds %[[T]]* %[[T_1_1]], i64 1
|
||||
// CHECK: %[[T_1_2_0:.*]] = getelementptr inbounds %[[T]]* %[[T_1_2]], i32 0, i32 0
|
||||
// CHECK: %[[T_1_2:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_1]], i64 1
|
||||
// CHECK: %[[T_1_2_0:.*]] = getelementptr inbounds %[[T]], %[[T]]* %[[T_1_2]], i32 0, i32 0
|
||||
// CHECK: store i32 6, i32* %[[T_1_2_0]]
|
||||
//
|
||||
// And the rest gets memset to 0.
|
||||
//
|
||||
// CHECK: %[[T_2:.*]] = getelementptr inbounds [3 x %[[T]]]* %[[T_1]], i32 1
|
||||
// CHECK: %[[T_2:.*]] = getelementptr inbounds [3 x %[[T]]], [3 x %[[T]]]* %[[T_1]], i32 1
|
||||
// CHECK: %[[T_2_AS_T:.*]] = bitcast [3 x %[[T]]]* %[[T_2]] to %[[T]]*
|
||||
//
|
||||
// CHECK: %[[SIZE:.*]] = sub i64 %{{.*}}, 24
|
||||
|
|
|
@ -45,11 +45,11 @@ int h(int a) {
|
|||
// CHECK: store i32 {{.*}}, i32* %[[A_ADDR]],
|
||||
//
|
||||
// Initialize init-capture 'b(a)' by reference.
|
||||
// CHECK: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds {{.*}}, {{.*}}* %[[OUTER]], i32 0, i32 0
|
||||
// CHECK: store i32* %[[A_ADDR]], i32** {{.*}},
|
||||
//
|
||||
// Initialize init-capture 'c(a)' by copy.
|
||||
// CHECK: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds {{.*}}, {{.*}}* %[[OUTER]], i32 0, i32 1
|
||||
// CHECK: load i32* %[[A_ADDR]],
|
||||
// CHECK: store i32
|
||||
//
|
||||
|
@ -62,13 +62,13 @@ int h(int a) {
|
|||
//
|
||||
// Capture outer 'c' by reference.
|
||||
// CHECK: %[[OUTER:.*]] = load {{.*}}** %[[OUTER_ADDR]]
|
||||
// CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds {{.*}}, {{.*}}* %[[INNER]], i32 0, i32 0
|
||||
// CHECK-NEXT: getelementptr inbounds {{.*}}, {{.*}}* %[[OUTER]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i32* %
|
||||
//
|
||||
// Capture outer 'b' by copy.
|
||||
// CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds {{.*}}* %[[OUTER]], i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds {{.*}}, {{.*}}* %[[INNER]], i32 0, i32 1
|
||||
// CHECK-NEXT: getelementptr inbounds {{.*}}, {{.*}}* %[[OUTER]], i32 0, i32 0
|
||||
// CHECK-NEXT: load i32** %
|
||||
// CHECK-NEXT: load i32* %
|
||||
// CHECK-NEXT: store i32
|
||||
|
@ -84,11 +84,11 @@ int h(int a) {
|
|||
// CHECK: %[[INNER:.*]] = load {{.*}}** %[[INNER_ADDR]]
|
||||
//
|
||||
// Load capture of 'b'
|
||||
// CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds {{.*}}, {{.*}}* %[[INNER]], i32 0, i32 1
|
||||
// CHECK: load i32* %
|
||||
//
|
||||
// Load capture of 'c'
|
||||
// CHECK: getelementptr inbounds {{.*}}* %[[INNER]], i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds {{.*}}, {{.*}}* %[[INNER]], i32 0, i32 0
|
||||
// CHECK: load i32** %
|
||||
// CHECK: load i32* %
|
||||
//
|
||||
|
|
|
@ -53,7 +53,7 @@ C n{};
|
|||
// CHECK: store i8* {{.*}} @[[STR_A]]{{.*}}, i8** getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
|
||||
// CHECK: load i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
|
||||
// CHECK: load i8** getelementptr inbounds ({{.*}} @a, i32 0, i32 1)
|
||||
// CHECK: getelementptr inbounds i8* %{{.*}}, {{.*}} %{{.*}}
|
||||
// CHECK: getelementptr inbounds i8, i8* %{{.*}}, {{.*}} %{{.*}}
|
||||
// CHECK: store i8 %{{.*}}, i8* getelementptr inbounds ({{.*}} @a, i32 0, i32 2)
|
||||
// CHECK: call i32 @_ZN1A1fEv({{.*}} @a)
|
||||
// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({{.*}}* @a, i32 0, i32 3)
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace test2 {
|
|||
// CHECK: [[NEW:%.*]] = call noalias i8* @_Znaj(i32 44)
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[NEW]] to i32*
|
||||
// CHECK-NEXT: store i32 10, i32* [[T0]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[NEW]], i64 4
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8, i8* [[NEW]], i64 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to [[A]]*
|
||||
// CHECK-NEXT: ret [[A]]* [[T2]]
|
||||
return ::new A[10];
|
||||
|
@ -44,7 +44,7 @@ namespace test2 {
|
|||
// CHECK-NEXT: [[T1:%.*]] = icmp eq [[A]]* [[T0]], null
|
||||
// CHECK-NEXT: br i1 [[T1]],
|
||||
// CHECK: [[T2:%.*]] = bitcast [[A]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 -4
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 -4
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i32*
|
||||
// CHECK-NEXT: [[T5:%.*]] = load i32* [[T4]]
|
||||
// CHECK-NEXT: call void @_ZdaPv(i8* [[T3]])
|
||||
|
|
|
@ -70,16 +70,16 @@ namespace test1 {
|
|||
// CHECK: icmp eq [10 x [20 x [[A:%.*]]]]* [[PTR:%.*]], null
|
||||
// CHECK-NEXT: br i1
|
||||
|
||||
// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]]* [[PTR]], i32 0, i32 0, i32 0
|
||||
// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]], [10 x [20 x [[A]]]]* [[PTR]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[BEGIN]] to i8*
|
||||
// CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8* [[T0]], i64 -8
|
||||
// CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 -8
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[ALLOC]] to i64*
|
||||
// CHECK-NEXT: [[COUNT:%.*]] = load i64* [[T1]]
|
||||
// CHECK: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 [[COUNT]]
|
||||
// CHECK: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 [[COUNT]]
|
||||
// CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[ISEMPTY]],
|
||||
// CHECK: [[PAST:%.*]] = phi [[A]]* [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[PAST]], i64 -1
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], [[A]]* [[PAST]], i64 -1
|
||||
// CHECK-NEXT: call void @_ZN5test11AD1Ev([[A]]* [[CUR]])
|
||||
// CHECK-NEXT: [[ISDONE:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[ISDONE]]
|
||||
|
@ -117,15 +117,15 @@ namespace test4 {
|
|||
// This has to be done first because the dtor can mess it up.
|
||||
// CHECK: [[T0:%.*]] = bitcast [[X:%.*]]* [[XP:%.*]] to i64**
|
||||
// CHECK-NEXT: [[VTABLE:%.*]] = load i64** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i64* [[VTABLE]], i64 -2
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i64, i64* [[VTABLE]], i64 -2
|
||||
// CHECK-NEXT: [[OFFSET:%.*]] = load i64* [[T0]], align 8
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[X]]* [[XP]] to i8*
|
||||
// CHECK-NEXT: [[ALLOCATED:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[ALLOCATED:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[OFFSET]]
|
||||
// Load the complete-object destructor (not the deleting destructor)
|
||||
// and call it.
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[X:%.*]]* [[XP:%.*]] to void ([[X]]*)***
|
||||
// CHECK-NEXT: [[VTABLE:%.*]] = load void ([[X]]*)*** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds void ([[X]]*)** [[VTABLE]], i64 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds void ([[X]]*)*, void ([[X]]*)** [[VTABLE]], i64 0
|
||||
// CHECK-NEXT: [[DTOR:%.*]] = load void ([[X]]*)** [[T0]]
|
||||
// CHECK-NEXT: call void [[DTOR]]([[X]]* [[OBJ:%.*]])
|
||||
// Call the global operator delete.
|
||||
|
|
|
@ -200,12 +200,12 @@ namespace test3 {
|
|||
// CHECK4: resume { i8*, i32 }
|
||||
|
||||
// CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11DD1Ev(
|
||||
// CHECK4: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
|
||||
// CHECK4: call void {{.*}} @_ZN5test312_GLOBAL__N_11CD2Ev
|
||||
// CHECK4: ret void
|
||||
|
||||
// CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11DD0Ev(
|
||||
// CHECK4: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
|
||||
// CHECK4: call void @_ZN5test312_GLOBAL__N_11DD0Ev(
|
||||
// CHECK4: ret void
|
||||
|
||||
|
@ -219,12 +219,12 @@ namespace test3 {
|
|||
// CHECK4: resume { i8*, i32 }
|
||||
|
||||
// CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD1Ev(
|
||||
// CHECK4: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
|
||||
// CHECK4: call void @_ZN5test312_GLOBAL__N_11CD2Ev(
|
||||
// CHECK4: ret void
|
||||
|
||||
// CHECK4-LABEL: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD0Ev(
|
||||
// CHECK4: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK4: getelementptr inbounds i8, i8* {{.*}}, i64 -8
|
||||
// CHECK4: call void @_ZN5test312_GLOBAL__N_11CD0Ev(
|
||||
// CHECK4: ret void
|
||||
|
||||
|
@ -279,11 +279,11 @@ namespace test5 {
|
|||
// CHECK5: [[ELEMS:%.*]] = alloca [5 x [[A:%.*]]], align
|
||||
// CHECK5-NEXT: [[EXN:%.*]] = alloca i8*
|
||||
// CHECK5-NEXT: [[SEL:%.*]] = alloca i32
|
||||
// CHECK5-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]]* [[ELEMS]], i32 0, i32 0
|
||||
// CHECK5-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5
|
||||
// CHECK5-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]], [5 x [[A]]]* [[ELEMS]], i32 0, i32 0
|
||||
// CHECK5-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 5
|
||||
// CHECK5-NEXT: br label
|
||||
// CHECK5: [[POST:%.*]] = phi [[A]]* [ [[END]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
|
||||
// CHECK5-NEXT: [[ELT]] = getelementptr inbounds [[A]]* [[POST]], i64 -1
|
||||
// CHECK5-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[POST]], i64 -1
|
||||
// CHECK5-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* [[ELT]])
|
||||
// CHECK5: [[T0:%.*]] = icmp eq [[A]]* [[ELT]], [[BEGIN]]
|
||||
// CHECK5-NEXT: br i1 [[T0]],
|
||||
|
@ -292,7 +292,7 @@ namespace test5 {
|
|||
// CHECK5: [[EMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[ELT]]
|
||||
// CHECK5-NEXT: br i1 [[EMPTY]]
|
||||
// CHECK5: [[AFTER:%.*]] = phi [[A]]* [ [[ELT]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK5-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK5-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK5-NEXT: invoke void @_ZN5test51AD1Ev([[A]]* [[CUR]])
|
||||
// CHECK5: [[DONE:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
|
||||
// CHECK5-NEXT: br i1 [[DONE]],
|
||||
|
|
|
@ -253,7 +253,7 @@ namespace test11 {
|
|||
} catch (int**&p) {
|
||||
// CHECK: [[EXN:%.*]] = load i8**
|
||||
// CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
|
||||
// CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8* [[EXN]], i32 32
|
||||
// CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8, i8* [[EXN]], i32 32
|
||||
// CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to i32***
|
||||
// CHECK-NEXT: store i32*** [[ADJ2]], i32**** [[P:%.*]]
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace test1 {
|
|||
// CHECK-NEXT: store i1 true, i1* [[ACTIVE]]
|
||||
// CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
|
||||
// CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]])
|
||||
// CHECK: [[T1:%.*]] = getelementptr inbounds [[B]]* [[T0]], i32 0, i32 0
|
||||
// CHECK: [[T1:%.*]] = getelementptr inbounds [[B]], [[B]]* [[T0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T2:%.*]] = load i32* [[T1]], align 4
|
||||
// CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T2]])
|
||||
// CHECK: store i1 false, i1* [[ACTIVE]]
|
||||
|
@ -480,16 +480,16 @@ namespace test11 {
|
|||
// CHECK-LABEL: define void @_ZN6test111CC2Ev(
|
||||
// CHECK: [[THIS:%.*]] = load [[C:%.*]]** {{%.*}}
|
||||
// Construct single.
|
||||
// CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[C]]* [[THIS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[C]], [[C]]* [[THIS]], i32 0, i32 0
|
||||
// CHECK-NEXT: call void @_ZN6test111AC1Ev([[A:%.*]]* [[SINGLE]])
|
||||
// Construct array.
|
||||
// CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[C]]* [[THIS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]]* [[ARRAYBEGIN]], i64 6
|
||||
// CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[C]], [[C]]* [[THIS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]], [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARRAYBEGIN]], i64 6
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [[A]]* [ [[ARRAYBEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: invoke void @_ZN6test111AC1Ev([[A:%.*]]* [[CUR]])
|
||||
// CHECK: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1
|
||||
// CHECK: [[NEXT]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[ARRAYEND]]
|
||||
// CHECK-NEXT: br i1 [[DONE]],
|
||||
// throw 0;
|
||||
|
@ -500,7 +500,7 @@ namespace test11 {
|
|||
// CHECK: [[EMPTY:%.*]] = icmp eq [[A]]* [[ARRAYBEGIN]], [[CUR]]
|
||||
// CHECK-NEXT: br i1 [[EMPTY]]
|
||||
// CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* [[ELT]])
|
||||
// CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]]
|
||||
// CHECK-NEXT: br i1 [[DONE]],
|
||||
|
@ -509,11 +509,11 @@ namespace test11 {
|
|||
// Landing pad 2, from throw site.
|
||||
// CHECK: landingpad
|
||||
// - First, destroy all of array.
|
||||
// CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]]* [[ARRAYBEGIN]], i64 6
|
||||
// CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]], [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARRAYBEGIN]], i64 6
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* [[ELT]])
|
||||
// CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]]
|
||||
// CHECK-NEXT: br i1 [[DONE]],
|
||||
|
|
|
@ -15,9 +15,9 @@ void foo(A a, A b, A c) {
|
|||
//
|
||||
// X86-LABEL: define void @"\01?foo@@YAXUA@@00@Z"
|
||||
// X86: ([[argmem_ty:<{ %struct.A, %struct.A, %struct.A }>]]* inalloca)
|
||||
// X86: %[[a:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %0, i32 0, i32 0
|
||||
// X86: %[[b:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %0, i32 0, i32 1
|
||||
// X86: %[[c:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %0, i32 0, i32 2
|
||||
// X86: %[[a:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %0, i32 0, i32 0
|
||||
// X86: %[[b:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %0, i32 0, i32 1
|
||||
// X86: %[[c:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %0, i32 0, i32 2
|
||||
// X86: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %[[a]])
|
||||
// X86: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %[[b]])
|
||||
// X86: call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %[[c]])
|
||||
|
@ -41,11 +41,11 @@ void call_foo() {
|
|||
// X86-LABEL: define void @"\01?call_foo@@YAXXZ"()
|
||||
// X86: call i8* @llvm.stacksave()
|
||||
// X86: %[[argmem:[^ ]*]] = alloca inalloca [[argmem_ty]]
|
||||
// X86: %[[arg3:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 2
|
||||
// X86: %[[arg3:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 2
|
||||
// X86: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@H@Z"(%struct.A* %[[arg3]], i32 3)
|
||||
// X86: %[[arg2:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// X86: %[[arg2:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// X86: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@H@Z"(%struct.A* %[[arg2]], i32 2)
|
||||
// X86: %[[arg1:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// X86: %[[arg1:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// X86: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@H@Z"(%struct.A* %[[arg1]], i32 1)
|
||||
// X86: invoke void @"\01?foo@@YAXUA@@00@Z"([[argmem_ty]]* inalloca %[[argmem]])
|
||||
// X86: call void @llvm.stackrestore
|
||||
|
|
|
@ -28,12 +28,12 @@ void check_array_cookies_simple() {
|
|||
// 46 = 42 + size of cookie (4)
|
||||
// CHECK: [[COOKIE:%.*]] = bitcast i8* [[ALLOCATED]] to i32*
|
||||
// CHECK: store i32 42, i32* [[COOKIE]]
|
||||
// CHECK: [[ARRAY:%.*]] = getelementptr inbounds i8* [[ALLOCATED]], i64 4
|
||||
// CHECK: [[ARRAY:%.*]] = getelementptr inbounds i8, i8* [[ALLOCATED]], i64 4
|
||||
// CHECK: bitcast i8* [[ARRAY]] to [[CLASS:%.*]]*
|
||||
|
||||
delete [] array;
|
||||
// CHECK: [[ARRAY_AS_CHAR:%.*]] = bitcast [[CLASS]]* {{%.*}} to i8*
|
||||
// CHECK: getelementptr inbounds i8* [[ARRAY_AS_CHAR]], i64 -4
|
||||
// CHECK: getelementptr inbounds i8, i8* [[ARRAY_AS_CHAR]], i64 -4
|
||||
}
|
||||
|
||||
struct __attribute__((aligned(8))) ClassWithAlignment {
|
||||
|
@ -50,12 +50,12 @@ void check_array_cookies_aligned() {
|
|||
// 344 = 42*8 + size of cookie (8, due to alignment)
|
||||
// CHECK: [[COOKIE:%.*]] = bitcast i8* [[ALLOCATED]] to i32*
|
||||
// CHECK: store i32 42, i32* [[COOKIE]]
|
||||
// CHECK: [[ARRAY:%.*]] = getelementptr inbounds i8* [[ALLOCATED]], i64 8
|
||||
// CHECK: [[ARRAY:%.*]] = getelementptr inbounds i8, i8* [[ALLOCATED]], i64 8
|
||||
// CHECK: bitcast i8* [[ARRAY]] to [[CLASS:%.*]]*
|
||||
|
||||
delete [] array;
|
||||
// CHECK: [[ARRAY_AS_CHAR:%.*]] = bitcast [[CLASS]]*
|
||||
// CHECK: getelementptr inbounds i8* [[ARRAY_AS_CHAR]], i64 -8
|
||||
// CHECK: getelementptr inbounds i8, i8* [[ARRAY_AS_CHAR]], i64 -8
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
|
@ -20,7 +20,7 @@ A B::foo(A x) {
|
|||
|
||||
// CHECK-LABEL: define x86_thiscallcc %struct.A* @"\01?foo@B@@QAE?AUA@@U2@@Z"
|
||||
// CHECK: (%struct.B* %this, <{ %struct.A*, %struct.A }>* inalloca)
|
||||
// CHECK: getelementptr inbounds <{ %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 0
|
||||
// CHECK: getelementptr inbounds <{ %struct.A*, %struct.A }>, <{ %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 0
|
||||
// CHECK: load %struct.A**
|
||||
// CHECK: ret %struct.A*
|
||||
|
||||
|
@ -30,7 +30,7 @@ A B::bar(A x) {
|
|||
|
||||
// CHECK-LABEL: define %struct.A* @"\01?bar@B@@QAA?AUA@@U2@@Z"
|
||||
// CHECK: (<{ %struct.B*, %struct.A*, %struct.A }>* inalloca)
|
||||
// CHECK: getelementptr inbounds <{ %struct.B*, %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds <{ %struct.B*, %struct.A*, %struct.A }>, <{ %struct.B*, %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 1
|
||||
// CHECK: load %struct.A**
|
||||
// CHECK: ret %struct.A*
|
||||
|
||||
|
@ -40,7 +40,7 @@ A B::baz(A x) {
|
|||
|
||||
// CHECK-LABEL: define x86_stdcallcc %struct.A* @"\01?baz@B@@QAG?AUA@@U2@@Z"
|
||||
// CHECK: (<{ %struct.B*, %struct.A*, %struct.A }>* inalloca)
|
||||
// CHECK: getelementptr inbounds <{ %struct.B*, %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 1
|
||||
// CHECK: getelementptr inbounds <{ %struct.B*, %struct.A*, %struct.A }>, <{ %struct.B*, %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 1
|
||||
// CHECK: load %struct.A**
|
||||
// CHECK: ret %struct.A*
|
||||
|
||||
|
|
|
@ -16,14 +16,14 @@ C::C() {} // force emission
|
|||
|
||||
// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01?foo@C@byval_thunk@@W3AEXUAgg@2@@Z"
|
||||
// CHECK32: (%"struct.byval_thunk::C"* %this, <{ %"struct.byval_thunk::Agg" }>* inalloca)
|
||||
// CHECK32: getelementptr i8* %{{.*}}, i32 -4
|
||||
// CHECK32: getelementptr i8, i8* %{{.*}}, i32 -4
|
||||
// CHECK32: musttail call x86_thiscallcc void @"\01?foo@C@byval_thunk@@UAEXUAgg@2@@Z"
|
||||
// CHECK32: (%"struct.byval_thunk::C"* %{{.*}}, <{ %"struct.byval_thunk::Agg" }>* inalloca %0)
|
||||
// CHECK32-NEXT: ret void
|
||||
|
||||
// CHECK64-LABEL: define linkonce_odr void @"\01?foo@C@byval_thunk@@W7EAAXUAgg@2@@Z"
|
||||
// CHECK64: (%"struct.byval_thunk::C"* %this, %"struct.byval_thunk::Agg"* %x)
|
||||
// CHECK64: getelementptr i8* %{{.*}}, i32 -8
|
||||
// CHECK64: getelementptr i8, i8* %{{.*}}, i32 -8
|
||||
// CHECK64: call void @"\01?foo@C@byval_thunk@@UEAAXUAgg@2@@Z"
|
||||
// CHECK64: (%"struct.byval_thunk::C"* %{{.*}}, %"struct.byval_thunk::Agg"* %x)
|
||||
// CHECK64-NOT: call
|
||||
|
@ -45,9 +45,9 @@ C::C() {} // force emission
|
|||
|
||||
// CHECK32-LABEL: define linkonce_odr x86_stdcallcc void @"\01?foo@C@stdcall_thunk@@W3AGXUAgg@2@@Z"
|
||||
// CHECK32: (<{ %"struct.stdcall_thunk::C"*, %"struct.stdcall_thunk::Agg" }>* inalloca)
|
||||
// CHECK32: %[[this_slot:[^ ]*]] = getelementptr inbounds <{ %"struct.stdcall_thunk::C"*, %"struct.stdcall_thunk::Agg" }>* %0, i32 0, i32 0
|
||||
// CHECK32: %[[this_slot:[^ ]*]] = getelementptr inbounds <{ %"struct.stdcall_thunk::C"*, %"struct.stdcall_thunk::Agg" }>, <{ %"struct.stdcall_thunk::C"*, %"struct.stdcall_thunk::Agg" }>* %0, i32 0, i32 0
|
||||
// CHECK32: load %"struct.stdcall_thunk::C"** %[[this_slot]]
|
||||
// CHECK32: getelementptr i8* %{{.*}}, i32 -4
|
||||
// CHECK32: getelementptr i8, i8* %{{.*}}, i32 -4
|
||||
// CHECK32: store %"struct.stdcall_thunk::C"* %{{.*}}, %"struct.stdcall_thunk::C"** %[[this_slot]]
|
||||
// CHECK32: musttail call x86_stdcallcc void @"\01?foo@C@stdcall_thunk@@UAGXUAgg@2@@Z"
|
||||
// CHECK32: (<{ %"struct.stdcall_thunk::C"*, %"struct.stdcall_thunk::Agg" }>* inalloca %0)
|
||||
|
@ -55,7 +55,7 @@ C::C() {} // force emission
|
|||
|
||||
// CHECK64-LABEL: define linkonce_odr void @"\01?foo@C@stdcall_thunk@@W7EAAXUAgg@2@@Z"
|
||||
// CHECK64: (%"struct.stdcall_thunk::C"* %this, %"struct.stdcall_thunk::Agg"* %x)
|
||||
// CHECK64: getelementptr i8* %{{.*}}, i32 -8
|
||||
// CHECK64: getelementptr i8, i8* %{{.*}}, i32 -8
|
||||
// CHECK64: call void @"\01?foo@C@stdcall_thunk@@UEAAXUAgg@2@@Z"
|
||||
// CHECK64: (%"struct.stdcall_thunk::C"* %{{.*}}, %"struct.stdcall_thunk::Agg"* %x)
|
||||
// CHECK64-NOT: call
|
||||
|
@ -77,9 +77,9 @@ C::C() {} // force emission
|
|||
|
||||
// CHECK32-LABEL: define linkonce_odr %"struct.sret_thunk::Agg"* @"\01?foo@C@sret_thunk@@W3AA?AUAgg@2@U32@@Z"
|
||||
// CHECK32: (<{ %"struct.sret_thunk::C"*, %"struct.sret_thunk::Agg"*, %"struct.sret_thunk::Agg" }>* inalloca)
|
||||
// CHECK32: %[[this_slot:[^ ]*]] = getelementptr inbounds <{ %"struct.sret_thunk::C"*, %"struct.sret_thunk::Agg"*, %"struct.sret_thunk::Agg" }>* %0, i32 0, i32 0
|
||||
// CHECK32: %[[this_slot:[^ ]*]] = getelementptr inbounds <{ %"struct.sret_thunk::C"*, %"struct.sret_thunk::Agg"*, %"struct.sret_thunk::Agg" }>, <{ %"struct.sret_thunk::C"*, %"struct.sret_thunk::Agg"*, %"struct.sret_thunk::Agg" }>* %0, i32 0, i32 0
|
||||
// CHECK32: load %"struct.sret_thunk::C"** %[[this_slot]]
|
||||
// CHECK32: getelementptr i8* %{{.*}}, i32 -4
|
||||
// CHECK32: getelementptr i8, i8* %{{.*}}, i32 -4
|
||||
// CHECK32: store %"struct.sret_thunk::C"* %{{.*}}, %"struct.sret_thunk::C"** %[[this_slot]]
|
||||
// CHECK32: %[[rv:[^ ]*]] = musttail call %"struct.sret_thunk::Agg"* @"\01?foo@C@sret_thunk@@UAA?AUAgg@2@U32@@Z"
|
||||
// CHECK32: (<{ %"struct.sret_thunk::C"*, %"struct.sret_thunk::Agg"*, %"struct.sret_thunk::Agg" }>* inalloca %0)
|
||||
|
@ -87,7 +87,7 @@ C::C() {} // force emission
|
|||
|
||||
// CHECK64-LABEL: define linkonce_odr void @"\01?foo@C@sret_thunk@@W7EAA?AUAgg@2@U32@@Z"
|
||||
// CHECK64: (%"struct.sret_thunk::C"* %this, %"struct.sret_thunk::Agg"* noalias sret %agg.result, %"struct.sret_thunk::Agg"* %x)
|
||||
// CHECK64: getelementptr i8* %{{.*}}, i32 -8
|
||||
// CHECK64: getelementptr i8, i8* %{{.*}}, i32 -8
|
||||
// CHECK64: call void @"\01?foo@C@sret_thunk@@UEAA?AUAgg@2@U32@@Z"
|
||||
// CHECK64: (%"struct.sret_thunk::C"* %{{.*}}, %"struct.sret_thunk::Agg"* sret %agg.result, %"struct.sret_thunk::Agg"* %x)
|
||||
// CHECK64-NOT: call
|
||||
|
|
|
@ -20,25 +20,25 @@ T* test1(V* x) { return &dynamic_cast<T&>(*x); }
|
|||
T* test2(A* x) { return &dynamic_cast<T&>(*x); }
|
||||
// CHECK-LABEL: define %struct.T* @"\01?test2@@YAPAUT@@PAUA@@@Z"(%struct.A* %x)
|
||||
// CHECK: [[CAST:%.*]] = bitcast %struct.A* %x to i8*
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = getelementptr inbounds %struct.A* %x, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = getelementptr inbounds %struct.A, %struct.A* %x, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBPTRPTR]], align 4
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFP]], align 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[CAST]], i32 [[VBOFFS]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[CAST]], i32 [[VBOFFS]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTDynamicCast(i8* [[ADJ]], i32 [[VBOFFS]], i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUA@@@8" to i8*), i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUT@@@8" to i8*), i32 1)
|
||||
// CHECK-NEXT: [[RET:%.*]] = bitcast i8* [[CALL]] to %struct.T*
|
||||
// CHECK-NEXT: ret %struct.T* [[RET]]
|
||||
|
||||
T* test3(B* x) { return &dynamic_cast<T&>(*x); }
|
||||
// CHECK-LABEL: define %struct.T* @"\01?test3@@YAPAUT@@PAUB@@@Z"(%struct.B* %x)
|
||||
// CHECK: [[VOIDP:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8* [[VOIDP]], i32 4
|
||||
// CHECK: [[VOIDP:%.*]] = getelementptr inbounds %struct.B, %struct.B* %x, i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8, i8* [[VOIDP]], i32 4
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = bitcast i8* [[VBPTR:%.*]] to i32**
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBPTRPTR]], align 4
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFP]], align 4
|
||||
// CHECK-NEXT: [[DELTA:%.*]] = add nsw i32 [[VBOFFS]], 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[VOIDP]], i32 [[DELTA]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[VOIDP]], i32 [[DELTA]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTDynamicCast(i8* [[ADJ]], i32 [[DELTA]], i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUB@@@8" to i8*), i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUT@@@8" to i8*), i32 1)
|
||||
// CHECK-NEXT: [[RET:%.*]] = bitcast i8* [[CALL]] to %struct.T*
|
||||
// CHECK-NEXT: ret %struct.T* [[RET]]
|
||||
|
@ -55,11 +55,11 @@ T* test5(A* x) { return dynamic_cast<T*>(x); }
|
|||
// CHECK: [[CHECK:%.*]] = icmp eq %struct.A* %x, null
|
||||
// CHECK-NEXT: br i1 [[CHECK]]
|
||||
// CHECK: [[VOIDP:%.*]] = bitcast %struct.A* %x to i8*
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = getelementptr inbounds %struct.A* %x, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = getelementptr inbounds %struct.A, %struct.A* %x, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBPTRPTR]], align 4
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFP]], align 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[VOIDP]], i32 [[VBOFFS]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[VOIDP]], i32 [[VBOFFS]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTDynamicCast(i8* [[ADJ]], i32 [[VBOFFS]], i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUA@@@8" to i8*), i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUT@@@8" to i8*), i32 0)
|
||||
// CHECK-NEXT: [[RES:%.*]] = bitcast i8* [[CALL]] to %struct.T*
|
||||
// CHECK-NEXT: br label
|
||||
|
@ -70,14 +70,14 @@ T* test6(B* x) { return dynamic_cast<T*>(x); }
|
|||
// CHECK-LABEL: define %struct.T* @"\01?test6@@YAPAUT@@PAUB@@@Z"(%struct.B* %x)
|
||||
// CHECK: [[CHECK:%.*]] = icmp eq %struct.B* %x, null
|
||||
// CHECK-NEXT: br i1 [[CHECK]]
|
||||
// CHECK: [[CAST:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8* [[CAST]], i32 4
|
||||
// CHECK: [[CAST:%.*]] = getelementptr inbounds %struct.B, %struct.B* %x, i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8, i8* [[CAST]], i32 4
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = bitcast i8* [[VBPTR]] to i32**
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBPTRPTR]], align 4
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFP]], align 4
|
||||
// CHECK-NEXT: [[DELTA:%.*]] = add nsw i32 [[VBOFFS]], 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[CAST]], i32 [[DELTA]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[CAST]], i32 [[DELTA]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTDynamicCast(i8* [[ADJ]], i32 [[DELTA]], i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUB@@@8" to i8*), i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUT@@@8" to i8*), i32 0)
|
||||
// CHECK-NEXT: [[RES:%.*]] = bitcast i8* [[CALL]] to %struct.T*
|
||||
// CHECK-NEXT: br label
|
||||
|
@ -95,11 +95,11 @@ void* test8(A* x) { return dynamic_cast<void*>(x); }
|
|||
// CHECK: [[CHECK:%.*]] = icmp eq %struct.A* %x, null
|
||||
// CHECK-NEXT: br i1 [[CHECK]]
|
||||
// CHECK: [[VOIDP:%.*]] = bitcast %struct.A* %x to i8*
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = getelementptr inbounds %struct.A* %x, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = getelementptr inbounds %struct.A, %struct.A* %x, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBPTRPTR]], align 4
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFP]], align 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[VOIDP]], i32 [[VBOFFS]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[VOIDP]], i32 [[VBOFFS]]
|
||||
// CHECK-NEXT: [[RES:%.*]] = tail call i8* @__RTCastToVoid(i8* [[ADJ]])
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[RET:%.*]] = phi i8*
|
||||
|
@ -109,14 +109,14 @@ void* test9(B* x) { return dynamic_cast<void*>(x); }
|
|||
// CHECK-LABEL: define i8* @"\01?test9@@YAPAXPAUB@@@Z"(%struct.B* %x)
|
||||
// CHECK: [[CHECK:%.*]] = icmp eq %struct.B* %x, null
|
||||
// CHECK-NEXT: br i1 [[CHECK]]
|
||||
// CHECK: [[CAST:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8* [[CAST]], i32 4
|
||||
// CHECK: [[CAST:%.*]] = getelementptr inbounds %struct.B, %struct.B* %x, i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8, i8* [[CAST]], i32 4
|
||||
// CHECK-NEXT: [[VBPTRPTR:%.*]] = bitcast i8* [[VBPTR]] to i32**
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBPTRPTR]], align 4
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFP]], align 4
|
||||
// CHECK-NEXT: [[DELTA:%.*]] = add nsw i32 [[VBOFFS]], 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[CAST]], i32 [[DELTA]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[CAST]], i32 [[DELTA]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTCastToVoid(i8* [[ADJ]])
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[RET:%.*]] = phi i8*
|
||||
|
|
|
@ -40,14 +40,14 @@ int HasDeactivatedCleanups() {
|
|||
// WIN32: %[[isactive:.*]] = alloca i1
|
||||
// WIN32: call i8* @llvm.stacksave()
|
||||
// WIN32: %[[argmem:.*]] = alloca inalloca [[argmem_ty:<{ %struct.A, %struct.A }>]]
|
||||
// WIN32: %[[arg1:.*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// WIN32: %[[arg1:.*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// WIN32: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"
|
||||
// WIN32: invoke void @"\01?TakeRef@@YAXABUA@@@Z"
|
||||
//
|
||||
// WIN32: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"(%struct.A* %[[arg1]])
|
||||
// WIN32: store i1 true, i1* %[[isactive]]
|
||||
//
|
||||
// WIN32: %[[arg0:.*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// WIN32: %[[arg0:.*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// WIN32: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"
|
||||
// WIN32: invoke void @"\01?TakeRef@@YAXABUA@@@Z"
|
||||
// WIN32: invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"
|
||||
|
@ -154,7 +154,7 @@ C::C() { foo(); }
|
|||
//
|
||||
// We shouldn't do any vbptr loads, just constant GEPs.
|
||||
// WIN32-NOT: load
|
||||
// WIN32: getelementptr i8* %{{.*}}, i32 4
|
||||
// WIN32: getelementptr i8, i8* %{{.*}}, i32 4
|
||||
// WIN32-NOT: load
|
||||
// WIN32: bitcast i8* %{{.*}} to %"struct.crash_on_partial_destroy::B"*
|
||||
// WIN32: invoke x86_thiscallcc void @"\01??1B@crash_on_partial_destroy@@UAE@XZ"
|
||||
|
@ -162,7 +162,7 @@ C::C() { foo(); }
|
|||
// WIN32-NOT: load
|
||||
// WIN32: bitcast %"struct.crash_on_partial_destroy::C"* %{{.*}} to i8*
|
||||
// WIN32-NOT: load
|
||||
// WIN32: getelementptr inbounds i8* %{{.*}}, i64 4
|
||||
// WIN32: getelementptr inbounds i8, i8* %{{.*}}, i64 4
|
||||
// WIN32-NOT: load
|
||||
// WIN32: bitcast i8* %{{.*}} to %"struct.crash_on_partial_destroy::A"*
|
||||
// WIN32: invoke x86_thiscallcc void @"\01??1A@crash_on_partial_destroy@@UAE@XZ"
|
||||
|
|
|
@ -284,14 +284,14 @@ int loadDataMemberPointerVirtual(Virtual *o, int Virtual::*memptr) {
|
|||
// CHECK: %[[memptr0:.*]] = extractvalue { i32, i32 } %[[memptr:.*]], 0
|
||||
// CHECK: %[[memptr1:.*]] = extractvalue { i32, i32 } %[[memptr:.*]], 1
|
||||
// CHECK: %[[v6:.*]] = bitcast %{{.*}}* %[[o]] to i8*
|
||||
// CHECK: %[[vbptr:.*]] = getelementptr inbounds i8* %[[v6]], i32 0
|
||||
// CHECK: %[[vbptr:.*]] = getelementptr inbounds i8, i8* %[[v6]], i32 0
|
||||
// CHECK: %[[vbptr_a:.*]] = bitcast i8* %[[vbptr]] to i32**
|
||||
// CHECK: %[[vbtable:.*]] = load i32** %[[vbptr_a:.*]]
|
||||
// CHECK: %[[memptr1_shr:.*]] = ashr exact i32 %[[memptr1]], 2
|
||||
// CHECK: %[[v7:.*]] = getelementptr inbounds i32* %[[vbtable]], i32 %[[memptr1_shr]]
|
||||
// CHECK: %[[v7:.*]] = getelementptr inbounds i32, i32* %[[vbtable]], i32 %[[memptr1_shr]]
|
||||
// CHECK: %[[vbase_offs:.*]] = load i32* %[[v7]]
|
||||
// CHECK: %[[v10:.*]] = getelementptr inbounds i8* %[[vbptr]], i32 %[[vbase_offs]]
|
||||
// CHECK: %[[offset:.*]] = getelementptr inbounds i8* %[[v10]], i32 %[[memptr0]]
|
||||
// CHECK: %[[v10:.*]] = getelementptr inbounds i8, i8* %[[vbptr]], i32 %[[vbase_offs]]
|
||||
// CHECK: %[[offset:.*]] = getelementptr inbounds i8, i8* %[[v10]], i32 %[[memptr0]]
|
||||
// CHECK: %[[v11:.*]] = bitcast i8* %[[offset]] to i32*
|
||||
// CHECK: %[[v12:.*]] = load i32* %[[v11]]
|
||||
// CHECK: ret i32 %[[v12]]
|
||||
|
@ -318,17 +318,17 @@ int loadDataMemberPointerUnspecified(Unspecified *o, int Unspecified::*memptr) {
|
|||
// CHECK: br i1 %[[is_vbase]], label %[[vadjust:.*]], label %[[skip:.*]]
|
||||
//
|
||||
// CHECK: [[vadjust]]
|
||||
// CHECK: %[[vbptr:.*]] = getelementptr inbounds i8* %[[base]], i32 %[[memptr1]]
|
||||
// CHECK: %[[vbptr:.*]] = getelementptr inbounds i8, i8* %[[base]], i32 %[[memptr1]]
|
||||
// CHECK: %[[vbptr_a:.*]] = bitcast i8* %[[vbptr]] to i32**
|
||||
// CHECK: %[[vbtable:.*]] = load i32** %[[vbptr_a:.*]]
|
||||
// CHECK: %[[memptr2_shr:.*]] = ashr exact i32 %[[memptr2]], 2
|
||||
// CHECK: %[[v7:.*]] = getelementptr inbounds i32* %[[vbtable]], i32 %[[memptr2_shr]]
|
||||
// CHECK: %[[v7:.*]] = getelementptr inbounds i32, i32* %[[vbtable]], i32 %[[memptr2_shr]]
|
||||
// CHECK: %[[vbase_offs:.*]] = load i32* %[[v7]]
|
||||
// CHECK: %[[base_adj:.*]] = getelementptr inbounds i8* %[[vbptr]], i32 %[[vbase_offs]]
|
||||
// CHECK: %[[base_adj:.*]] = getelementptr inbounds i8, i8* %[[vbptr]], i32 %[[vbase_offs]]
|
||||
//
|
||||
// CHECK: [[skip]]
|
||||
// CHECK: %[[new_base:.*]] = phi i8* [ %[[base]], %{{.*}} ], [ %[[base_adj]], %[[vadjust]] ]
|
||||
// CHECK: %[[offset:.*]] = getelementptr inbounds i8* %[[new_base]], i32 %[[memptr0]]
|
||||
// CHECK: %[[offset:.*]] = getelementptr inbounds i8, i8* %[[new_base]], i32 %[[memptr0]]
|
||||
// CHECK: %[[v11:.*]] = bitcast i8* %[[offset]] to i32*
|
||||
// CHECK: %[[v12:.*]] = load i32* %[[v11]]
|
||||
// CHECK: ret i32 %[[v12]]
|
||||
|
@ -354,7 +354,7 @@ void callMemberPointerMultiple(Multiple *o, void (Multiple::*memptr)()) {
|
|||
// CHECK: define void @"\01?callMemberPointerMultiple@@{{.*}} {
|
||||
// CHECK: %[[memptr0:.*]] = extractvalue { i8*, i32 } %{{.*}}, 0
|
||||
// CHECK: %[[memptr1:.*]] = extractvalue { i8*, i32 } %{{.*}}, 1
|
||||
// CHECK: %[[this_adjusted:.*]] = getelementptr inbounds i8* %{{.*}}, i32 %[[memptr1]]
|
||||
// CHECK: %[[this_adjusted:.*]] = getelementptr inbounds i8, i8* %{{.*}}, i32 %[[memptr1]]
|
||||
// CHECK: %[[this:.*]] = bitcast i8* %[[this_adjusted]] to {{.*}}
|
||||
// CHECK: %[[fptr:.*]] = bitcast i8* %[[memptr0]] to {{.*}}
|
||||
// CHECK: call x86_thiscallcc void %[[fptr]](%{{.*}} %[[this]])
|
||||
|
@ -369,14 +369,14 @@ void callMemberPointerVirtualBase(Virtual *o, void (Virtual::*memptr)()) {
|
|||
// CHECK: %[[memptr0:.*]] = extractvalue { i8*, i32, i32 } %{{.*}}, 0
|
||||
// CHECK: %[[memptr1:.*]] = extractvalue { i8*, i32, i32 } %{{.*}}, 1
|
||||
// CHECK: %[[memptr2:.*]] = extractvalue { i8*, i32, i32 } %{{.*}}, 2
|
||||
// CHECK: %[[vbptr:.*]] = getelementptr inbounds i8* %{{.*}}, i32 0
|
||||
// CHECK: %[[vbptr:.*]] = getelementptr inbounds i8, i8* %{{.*}}, i32 0
|
||||
// CHECK: %[[vbptr_a:.*]] = bitcast i8* %[[vbptr]] to i32**
|
||||
// CHECK: %[[vbtable:.*]] = load i32** %[[vbptr_a:.*]]
|
||||
// CHECK: %[[memptr2_shr:.*]] = ashr exact i32 %[[memptr2]], 2
|
||||
// CHECK: %[[v7:.*]] = getelementptr inbounds i32* %[[vbtable]], i32 %[[memptr2_shr]]
|
||||
// CHECK: %[[v7:.*]] = getelementptr inbounds i32, i32* %[[vbtable]], i32 %[[memptr2_shr]]
|
||||
// CHECK: %[[vbase_offs:.*]] = load i32* %[[v7]]
|
||||
// CHECK: %[[v10:.*]] = getelementptr inbounds i8* %[[vbptr]], i32 %[[vbase_offs]]
|
||||
// CHECK: %[[this_adjusted:.*]] = getelementptr inbounds i8* %[[v10]], i32 %[[memptr1]]
|
||||
// CHECK: %[[v10:.*]] = getelementptr inbounds i8, i8* %[[vbptr]], i32 %[[vbase_offs]]
|
||||
// CHECK: %[[this_adjusted:.*]] = getelementptr inbounds i8, i8* %[[v10]], i32 %[[memptr1]]
|
||||
// CHECK: %[[fptr:.*]] = bitcast i8* %[[memptr0]] to void ({{.*}})
|
||||
// CHECK: %[[this:.*]] = bitcast i8* %[[this_adjusted]] to {{.*}}
|
||||
// CHECK: call x86_thiscallcc void %[[fptr]](%{{.*}} %[[this]])
|
||||
|
@ -599,7 +599,7 @@ int *load_data(A *a, int A::*mp) {
|
|||
// CHECK: %[[a:.*]] = load %"struct.Test3::A"** %{{.*}}, align 4
|
||||
// CHECK: %[[mp:.*]] = load i32* %{{.*}}, align 4
|
||||
// CHECK: %[[a_i8:.*]] = bitcast %"struct.Test3::A"* %[[a]] to i8*
|
||||
// CHECK: getelementptr inbounds i8* %[[a_i8]], i32 %[[mp]]
|
||||
// CHECK: getelementptr inbounds i8, i8* %[[a_i8]], i32 %[[mp]]
|
||||
// CHECK: }
|
||||
}
|
||||
|
||||
|
@ -621,7 +621,7 @@ void (C::*getmp())() {
|
|||
// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@Test4@@$BA@AE"(%"struct.Test4::C"* %this, ...) {{.*}} comdat
|
||||
// CHECK-NOT: getelementptr
|
||||
// CHECK: load void (%"struct.Test4::C"*, ...)*** %{{.*}}
|
||||
// CHECK: getelementptr inbounds void (%"struct.Test4::C"*, ...)** %{{.*}}, i64 0
|
||||
// CHECK: getelementptr inbounds void (%"struct.Test4::C"*, ...)*, void (%"struct.Test4::C"*, ...)** %{{.*}}, i64 0
|
||||
// CHECK-NOT: getelementptr
|
||||
// CHECK: musttail call x86_thiscallcc void (%"struct.Test4::C"*, ...)* %
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ void call_left_no_override(ChildNoOverride *child) {
|
|||
// CHECK: %[[LEFT:.*]] = bitcast %struct.ChildNoOverride* %[[CHILD]] to %struct.Left*
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast %struct.Left* %[[LEFT]] to void (%struct.Left*)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load void (%struct.Left*)*** %[[VFPTR]]
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.Left*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.Left*)*, void (%struct.Left*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN_VALUE:.*]] = load void (%struct.Left*)** %[[VFUN]]
|
||||
// CHECK: call x86_thiscallcc void %[[VFUN_VALUE]](%struct.Left* %[[LEFT]])
|
||||
// CHECK: ret
|
||||
|
@ -54,7 +54,7 @@ void call_left_override(ChildOverride *child) {
|
|||
child->left();
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast %struct.ChildOverride* %[[CHILD]] to void (%struct.ChildOverride*)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load void (%struct.ChildOverride*)*** %[[VFPTR]]
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.ChildOverride*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.ChildOverride*)*, void (%struct.ChildOverride*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN_VALUE:.*]] = load void (%struct.ChildOverride*)** %[[VFUN]]
|
||||
//
|
||||
// CHECK: call x86_thiscallcc void %[[VFUN_VALUE]](%struct.ChildOverride* %[[CHILD]])
|
||||
|
@ -70,12 +70,12 @@ void call_right_no_override(ChildNoOverride *child) {
|
|||
// the caller site.
|
||||
//
|
||||
// CHECK: %[[CHILD_i8:.*]] = bitcast %struct.ChildNoOverride* %[[CHILD]] to i8*
|
||||
// CHECK: %[[RIGHT_i8:.*]] = getelementptr inbounds i8* %[[CHILD_i8]], i32 4
|
||||
// CHECK: %[[RIGHT_i8:.*]] = getelementptr inbounds i8, i8* %[[CHILD_i8]], i32 4
|
||||
// CHECK: %[[RIGHT:.*]] = bitcast i8* %[[RIGHT_i8]] to %struct.Right*
|
||||
//
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast %struct.Right* %[[RIGHT]] to void (%struct.Right*)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load void (%struct.Right*)*** %[[VFPTR]]
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.Right*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (%struct.Right*)*, void (%struct.Right*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN_VALUE:.*]] = load void (%struct.Right*)** %[[VFUN]]
|
||||
// CHECK: call x86_thiscallcc void %[[VFUN_VALUE]](%struct.Right* %[[RIGHT]])
|
||||
// CHECK: ret
|
||||
|
@ -88,7 +88,7 @@ void ChildOverride::right() {
|
|||
// need to adjust 'this' before use.
|
||||
//
|
||||
// CHECK: %[[THIS_ADDR:.*]] = alloca %struct.ChildOverride*, align 4
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8* %[[ECX:.*]], i32 -4
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8, i8* %[[ECX:.*]], i32 -4
|
||||
// CHECK: %[[THIS:.*]] = bitcast i8* %[[THIS_i8]] to %struct.ChildOverride*
|
||||
// CHECK: store %struct.ChildOverride* %[[THIS]], %struct.ChildOverride** %[[THIS_ADDR]], align 4
|
||||
|
||||
|
@ -109,14 +109,14 @@ void call_right_override(ChildOverride *child) {
|
|||
//
|
||||
// CHECK: %[[CHILD_i8:.*]] = bitcast %struct.ChildOverride* %[[CHILD]] to i8*
|
||||
//
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[CHILD_i8]], i32 4
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[CHILD_i8]], i32 4
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to void (i8*)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load void (i8*)*** %[[VFPTR]]
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (i8*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (i8*)*, void (i8*)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN_VALUE:.*]] = load void (i8*)** %[[VFUN]]
|
||||
//
|
||||
// CHECK: %[[CHILD_i8:.*]] = bitcast %struct.ChildOverride* %[[CHILD]] to i8*
|
||||
// CHECK: %[[RIGHT:.*]] = getelementptr inbounds i8* %[[CHILD_i8]], i32 4
|
||||
// CHECK: %[[RIGHT:.*]] = getelementptr inbounds i8, i8* %[[CHILD_i8]], i32 4
|
||||
//
|
||||
// CHECK: call x86_thiscallcc void %[[VFUN_VALUE]](i8* %[[RIGHT]])
|
||||
// CHECK: ret
|
||||
|
@ -130,7 +130,7 @@ void GrandchildOverride::right() {
|
|||
// CHECK: define x86_thiscallcc void @"\01?right@GrandchildOverride@@UAEXXZ"(i8*
|
||||
//
|
||||
// CHECK: %[[THIS_ADDR:.*]] = alloca %struct.GrandchildOverride*, align 4
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8* %[[ECX:.*]], i32 -4
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8, i8* %[[ECX:.*]], i32 -4
|
||||
// CHECK: %[[THIS:.*]] = bitcast i8* %[[THIS_i8]] to %struct.GrandchildOverride*
|
||||
// CHECK: store %struct.GrandchildOverride* %[[THIS]], %struct.GrandchildOverride** %[[THIS_ADDR]], align 4
|
||||
|
||||
|
@ -165,7 +165,7 @@ void emit_ctors() {
|
|||
// CHECK: %[[VFPTR:.*]] = bitcast %struct.ChildOverride* %[[THIS]] to i32 (...)***
|
||||
// CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7ChildOverride@@6BLeft@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.ChildOverride* %[[THIS]] to i8*
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 4
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 4
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
|
||||
// CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7ChildOverride@@6BRight@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
|
||||
// CHECK: ret
|
||||
|
@ -176,7 +176,7 @@ void emit_ctors() {
|
|||
// CHECK: %[[VFPTR:.*]] = bitcast %struct.GrandchildOverride* %[[THIS]] to i32 (...)***
|
||||
// CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7GrandchildOverride@@6BLeft@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.GrandchildOverride* %[[THIS]] to i8*
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 4
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 4
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
|
||||
// CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7GrandchildOverride@@6BRight@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
|
||||
// CHECK: ret
|
||||
|
|
|
@ -296,9 +296,9 @@ void bar() {
|
|||
}
|
||||
// WIN32-LABEL: define void @"\01?bar@test2@@YAXXZ"() {{.*}} {
|
||||
// WIN32: %[[argmem:[^ ]*]] = alloca inalloca [[argmem_ty:<{ %"struct.test2::NonTrivial", %"struct.test2::POD" }>]]
|
||||
// WIN32: getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// WIN32: getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// WIN32: call void @llvm.memcpy
|
||||
// WIN32: getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// WIN32: getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// WIN32: call x86_thiscallcc %"struct.test2::NonTrivial"* @"\01??0NonTrivial@test2@@QAE@XZ"
|
||||
// WIN32: call i32 @"\01?foo@test2@@YAHUNonTrivial@1@UPOD@1@@Z"([[argmem_ty]]* inalloca %argmem)
|
||||
// WIN32: ret void
|
||||
|
@ -332,14 +332,14 @@ struct ForwardDeclare1 {};
|
|||
|
||||
void fn2(FnPtr1 a, SmallWithDtor b) { fn1(a, b); };
|
||||
// WIN32-LABEL: define void @"\01?fn2@@YAXP6AXUForwardDeclare1@@@ZUSmallWithDtor@@@Z"
|
||||
// WIN32: %[[a:[^ ]*]] = getelementptr inbounds [[argmem_ty:<{ {}\*, %struct.SmallWithDtor }>]]* %{{.*}}, i32 0, i32 0
|
||||
// WIN32: %[[a:[^ ]*]] = getelementptr inbounds [[argmem_ty:<{ {}\*, %struct.SmallWithDtor }>]], [[argmem_ty:<{ {}\*, %struct.SmallWithDtor }>]]* %{{.*}}, i32 0, i32 0
|
||||
// WIN32: %[[a1:[^ ]*]] = bitcast {}** %[[a]] to void [[dst_ty:\(%struct.ForwardDeclare1\*\)\*]]*
|
||||
// WIN32: %[[argmem:[^ ]*]] = alloca inalloca [[argmem_ty]]
|
||||
// WIN32: %[[gep1:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// WIN32: %[[gep1:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 1
|
||||
// WIN32: %[[bc1:[^ ]*]] = bitcast %struct.SmallWithDtor* %[[gep1]] to i8*
|
||||
// WIN32: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[bc1]], i8* {{.*}}, i32 4, i32 4, i1 false)
|
||||
// WIN32: %[[a2:[^ ]*]] = load void [[dst_ty]]* %[[a1]], align 4
|
||||
// WIN32: %[[gep2:[^ ]*]] = getelementptr inbounds [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// WIN32: %[[gep2:[^ ]*]] = getelementptr inbounds [[argmem_ty]], [[argmem_ty]]* %[[argmem]], i32 0, i32 0
|
||||
// WIN32: %[[addr:[^ ]*]] = bitcast {}** %[[gep2]] to void [[dst_ty]]*
|
||||
// WIN32: store void [[dst_ty]] %[[a2]], void [[dst_ty]]* %[[addr]], align 4
|
||||
// WIN32: call void @"\01?fn1@@YAXP6AXUForwardDeclare1@@@ZUSmallWithDtor@@@Z"([[argmem_ty]]* inalloca %[[argmem]])
|
||||
|
|
|
@ -85,7 +85,7 @@ void call_complete_dtor(C *obj_ptr) {
|
|||
// CHECK: %[[OBJ_PTR_VALUE:.*]] = load %"struct.basic::C"** %{{.*}}, align 4
|
||||
// CHECK-NEXT: %[[PVTABLE:.*]] = bitcast %"struct.basic::C"* %[[OBJ_PTR_VALUE]] to i8* (%"struct.basic::C"*, i32)***
|
||||
// CHECK-NEXT: %[[VTABLE:.*]] = load i8* (%"struct.basic::C"*, i32)*** %[[PVTABLE]]
|
||||
// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0
|
||||
// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0
|
||||
// CHECK-NEXT: %[[VDTOR:.*]] = load i8* (%"struct.basic::C"*, i32)** %[[PVDTOR]]
|
||||
// CHECK-NEXT: call x86_thiscallcc i8* %[[VDTOR]](%"struct.basic::C"* %[[OBJ_PTR_VALUE]], i32 0)
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -100,7 +100,7 @@ void call_deleting_dtor(C *obj_ptr) {
|
|||
// CHECK: [[DELETE_NOTNULL]]
|
||||
// CHECK-NEXT: %[[PVTABLE:.*]] = bitcast %"struct.basic::C"* %[[OBJ_PTR_VALUE]] to i8* (%"struct.basic::C"*, i32)***
|
||||
// CHECK-NEXT: %[[VTABLE:.*]] = load i8* (%"struct.basic::C"*, i32)*** %[[PVTABLE]]
|
||||
// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0
|
||||
// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0
|
||||
// CHECK-NEXT: %[[VDTOR:.*]] = load i8* (%"struct.basic::C"*, i32)** %[[PVDTOR]]
|
||||
// CHECK-NEXT: call x86_thiscallcc i8* %[[VDTOR]](%"struct.basic::C"* %[[OBJ_PTR_VALUE]], i32 1)
|
||||
// CHECK: ret void
|
||||
|
@ -115,7 +115,7 @@ void call_deleting_dtor_and_global_delete(C *obj_ptr) {
|
|||
// CHECK: [[DELETE_NOTNULL]]
|
||||
// CHECK-NEXT: %[[PVTABLE:.*]] = bitcast %"struct.basic::C"* %[[OBJ_PTR_VALUE]] to i8* (%"struct.basic::C"*, i32)***
|
||||
// CHECK-NEXT: %[[VTABLE:.*]] = load i8* (%"struct.basic::C"*, i32)*** %[[PVTABLE]]
|
||||
// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0
|
||||
// CHECK-NEXT: %[[PVDTOR:.*]] = getelementptr inbounds i8* (%"struct.basic::C"*, i32)*, i8* (%"struct.basic::C"*, i32)** %[[VTABLE]], i64 0
|
||||
// CHECK-NEXT: %[[VDTOR:.*]] = load i8* (%"struct.basic::C"*, i32)** %[[PVDTOR]]
|
||||
// CHECK-NEXT: %[[CALL:.*]] = call x86_thiscallcc i8* %[[VDTOR]](%"struct.basic::C"* %[[OBJ_PTR_VALUE]], i32 0)
|
||||
// CHECK-NEXT: call void @"\01??3@YAXPAX@Z"(i8* %[[CALL]])
|
||||
|
@ -161,7 +161,7 @@ C::~C() {
|
|||
// CHECK: load %"struct.dtor_in_second_nvbase::C"** %{{.*}}
|
||||
// Now we this-adjust before calling ~B.
|
||||
// CHECK: bitcast %"struct.dtor_in_second_nvbase::C"* %{{.*}} to i8*
|
||||
// CHECK: getelementptr inbounds i8* %{{.*}}, i64 4
|
||||
// CHECK: getelementptr inbounds i8, i8* %{{.*}}, i64 4
|
||||
// CHECK: bitcast i8* %{{.*}} to %"struct.dtor_in_second_nvbase::B"*
|
||||
// CHECK: call x86_thiscallcc void @"\01??1B@dtor_in_second_nvbase@@UAE@XZ"
|
||||
// CHECK: (%"struct.dtor_in_second_nvbase::B"* %{{.*}})
|
||||
|
@ -174,7 +174,7 @@ void foo() {
|
|||
// DTORS2-LABEL: define linkonce_odr x86_thiscallcc i8* @"\01??_EC@dtor_in_second_nvbase@@W3AEPAXI@Z"
|
||||
// DTORS2: (%"struct.dtor_in_second_nvbase::C"* %this, i32 %should_call_delete)
|
||||
// Do an adjustment from B* to C*.
|
||||
// DTORS2: getelementptr i8* %{{.*}}, i32 -4
|
||||
// DTORS2: getelementptr i8, i8* %{{.*}}, i32 -4
|
||||
// DTORS2: bitcast i8* %{{.*}} to %"struct.dtor_in_second_nvbase::C"*
|
||||
// DTORS2: %[[CALL:.*]] = call x86_thiscallcc i8* @"\01??_GC@dtor_in_second_nvbase@@UAEPAXI@Z"
|
||||
// DTORS2: ret i8* %[[CALL]]
|
||||
|
@ -198,7 +198,7 @@ F::~F() {
|
|||
// CHECK-LABEL: define x86_thiscallcc void @"\01??1F@test2@@UAE@XZ"(%"struct.test2::F"*)
|
||||
// Do an adjustment from C vbase subobject to F as though F was the
|
||||
// complete type.
|
||||
// CHECK: getelementptr inbounds i8* %{{.*}}, i32 -20
|
||||
// CHECK: getelementptr inbounds i8, i8* %{{.*}}, i32 -20
|
||||
// CHECK: bitcast i8* %{{.*}} to %"struct.test2::F"*
|
||||
// CHECK: store %"struct.test2::F"*
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ void foo() {
|
|||
}
|
||||
// DTORS3-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_DF@test2@@UAE@XZ"({{.*}} {{.*}} comdat
|
||||
// Do an adjustment from C* to F*.
|
||||
// DTORS3: getelementptr i8* %{{.*}}, i32 20
|
||||
// DTORS3: getelementptr i8, i8* %{{.*}}, i32 20
|
||||
// DTORS3: bitcast i8* %{{.*}} to %"struct.test2::F"*
|
||||
// DTORS3: call x86_thiscallcc void @"\01??1F@test2@@UAE@XZ"
|
||||
// DTORS3: ret void
|
||||
|
@ -246,11 +246,11 @@ C::C() {
|
|||
//
|
||||
// CHECK: [[INIT_VBASES]]
|
||||
// CHECK-NEXT: %[[this_i8:.*]] = bitcast %"struct.constructors::C"* %{{.*}} to i8*
|
||||
// CHECK-NEXT: %[[vbptr_off:.*]] = getelementptr inbounds i8* %[[this_i8]], i64 0
|
||||
// CHECK-NEXT: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i64 0
|
||||
// CHECK-NEXT: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32**
|
||||
// CHECK-NEXT: store i32* getelementptr inbounds ([2 x i32]* @"\01??_8C@constructors@@7B@", i32 0, i32 0), i32** %[[vbptr]]
|
||||
// CHECK-NEXT: bitcast %"struct.constructors::C"* %{{.*}} to i8*
|
||||
// CHECK-NEXT: getelementptr inbounds i8* %{{.*}}, i64 4
|
||||
// CHECK-NEXT: getelementptr inbounds i8, i8* %{{.*}}, i64 4
|
||||
// CHECK-NEXT: bitcast i8* %{{.*}} to %"struct.constructors::A"*
|
||||
// CHECK-NEXT: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}})
|
||||
// CHECK-NEXT: br label %[[SKIP_VBASES]]
|
||||
|
@ -281,11 +281,11 @@ D::D() {
|
|||
//
|
||||
// CHECK: [[INIT_VBASES]]
|
||||
// CHECK-NEXT: %[[this_i8:.*]] = bitcast %"struct.constructors::D"* %{{.*}} to i8*
|
||||
// CHECK-NEXT: %[[vbptr_off:.*]] = getelementptr inbounds i8* %[[this_i8]], i64 0
|
||||
// CHECK-NEXT: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i64 0
|
||||
// CHECK-NEXT: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32**
|
||||
// CHECK-NEXT: store i32* getelementptr inbounds ([2 x i32]* @"\01??_8D@constructors@@7B@", i32 0, i32 0), i32** %[[vbptr]]
|
||||
// CHECK-NEXT: bitcast %"struct.constructors::D"* %{{.*}} to i8*
|
||||
// CHECK-NEXT: getelementptr inbounds i8* %{{.*}}, i64 4
|
||||
// CHECK-NEXT: getelementptr inbounds i8, i8* %{{.*}}, i64 4
|
||||
// CHECK-NEXT: bitcast i8* %{{.*}} to %"struct.constructors::A"*
|
||||
// CHECK-NEXT: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}})
|
||||
// CHECK-NEXT: br label %[[SKIP_VBASES]]
|
||||
|
@ -308,14 +308,14 @@ E::E() {
|
|||
//
|
||||
// CHECK: [[INIT_VBASES]]
|
||||
// CHECK-NEXT: %[[this_i8:.*]] = bitcast %"struct.constructors::E"* %{{.*}} to i8*
|
||||
// CHECK-NEXT: %[[offs:.*]] = getelementptr inbounds i8* %[[this_i8]], i64 0
|
||||
// CHECK-NEXT: %[[offs:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i64 0
|
||||
// CHECK-NEXT: %[[vbptr_E:.*]] = bitcast i8* %[[offs]] to i32**
|
||||
// CHECK-NEXT: store i32* getelementptr inbounds ([3 x i32]* @"\01??_8E@constructors@@7B01@@", i32 0, i32 0), i32** %[[vbptr_E]]
|
||||
// CHECK-NEXT: %[[offs:.*]] = getelementptr inbounds i8* %[[this_i8]], i64 4
|
||||
// CHECK-NEXT: %[[offs:.*]] = getelementptr inbounds i8, i8* %[[this_i8]], i64 4
|
||||
// CHECK-NEXT: %[[vbptr_C:.*]] = bitcast i8* %[[offs]] to i32**
|
||||
// CHECK-NEXT: store i32* getelementptr inbounds ([2 x i32]* @"\01??_8E@constructors@@7BC@1@@", i32 0, i32 0), i32** %[[vbptr_C]]
|
||||
// CHECK-NEXT: bitcast %"struct.constructors::E"* %{{.*}} to i8*
|
||||
// CHECK-NEXT: getelementptr inbounds i8* %{{.*}}, i64 4
|
||||
// CHECK-NEXT: getelementptr inbounds i8, i8* %{{.*}}, i64 4
|
||||
// CHECK-NEXT: bitcast i8* %{{.*}} to %"struct.constructors::A"*
|
||||
// CHECK-NEXT: call x86_thiscallcc %"struct.constructors::A"* @"\01??0A@constructors@@QAE@XZ"(%"struct.constructors::A"* %{{.*}})
|
||||
// CHECK: call x86_thiscallcc %"struct.constructors::C"* @"\01??0C@constructors@@QAE@XZ"(%"struct.constructors::C"* %{{.*}}, i32 0)
|
||||
|
|
|
@ -62,13 +62,13 @@ struct C : A, B {
|
|||
C::C() {} // Emits vftable and forces thunk generation.
|
||||
|
||||
// CODEGEN-LABEL: define linkonce_odr x86_thiscallcc i8* @"\01??_EC@@W3AEPAXI@Z"(%struct.C* %this, i32 %should_call_delete) {{.*}} comdat
|
||||
// CODEGEN: getelementptr i8* {{.*}}, i32 -4
|
||||
// CODEGEN: getelementptr i8, i8* {{.*}}, i32 -4
|
||||
// FIXME: should actually call _EC, not _GC.
|
||||
// CODEGEN: call x86_thiscallcc i8* @"\01??_GC@@UAEPAXI@Z"
|
||||
// CODEGEN: ret
|
||||
|
||||
// CODEGEN-LABEL: define linkonce_odr x86_thiscallcc void @"\01?public_f@C@@W3AEXXZ"(%struct.C*
|
||||
// CODEGEN: getelementptr i8* {{.*}}, i32 -4
|
||||
// CODEGEN: getelementptr i8, i8* {{.*}}, i32 -4
|
||||
// CODEGEN: call x86_thiscallcc void @"\01?public_f@C@@UAEXXZ"(%struct.C*
|
||||
// CODEGEN: ret
|
||||
|
||||
|
@ -93,7 +93,7 @@ E::E() {} // Emits vftable and forces thunk generation.
|
|||
|
||||
// CODEGEN-LABEL: define weak_odr x86_thiscallcc %struct.C* @"\01?goo@E@@QAEPAUB@@XZ"
|
||||
// CODEGEN: call x86_thiscallcc %struct.C* @"\01?goo@E@@UAEPAUC@@XZ"
|
||||
// CODEGEN: getelementptr inbounds i8* {{.*}}, i32 4
|
||||
// CODEGEN: getelementptr inbounds i8, i8* {{.*}}, i32 4
|
||||
// CODEGEN: ret
|
||||
|
||||
struct F : virtual A, virtual B {
|
||||
|
@ -127,12 +127,12 @@ I::I() {} // Emits vftable and forces thunk generation.
|
|||
// CODEGEN-LABEL: define weak_odr x86_thiscallcc %struct.{{[BF]}}* @"\01?goo@I@@QAEPAUB@@XZ"
|
||||
// CODEGEN: %[[ORIG_RET:.*]] = call x86_thiscallcc %struct.F* @"\01?goo@I@@UAEPAUF@@XZ"
|
||||
// CODEGEN: %[[ORIG_RET_i8:.*]] = bitcast %struct.F* %[[ORIG_RET]] to i8*
|
||||
// CODEGEN: %[[VBPTR_i8:.*]] = getelementptr inbounds i8* %[[ORIG_RET_i8]], i32 4
|
||||
// CODEGEN: %[[VBPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[ORIG_RET_i8]], i32 4
|
||||
// CODEGEN: %[[VBPTR:.*]] = bitcast i8* %[[VBPTR_i8]] to i32**
|
||||
// CODEGEN: %[[VBTABLE:.*]] = load i32** %[[VBPTR]]
|
||||
// CODEGEN: %[[VBASE_OFFSET_PTR:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 2
|
||||
// CODEGEN: %[[VBASE_OFFSET_PTR:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 2
|
||||
// CODEGEN: %[[VBASE_OFFSET:.*]] = load i32* %[[VBASE_OFFSET_PTR]]
|
||||
// CODEGEN: %[[RES_i8:.*]] = getelementptr inbounds i8* %[[VBPTR_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CODEGEN: %[[RES_i8:.*]] = getelementptr inbounds i8, i8* %[[VBPTR_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CODEGEN: %[[RES:.*]] = bitcast i8* %[[RES_i8]] to %struct.F*
|
||||
// CODEGEN: phi %struct.F* {{.*}} %[[RES]]
|
||||
// CODEGEN: ret %struct.{{[BF]}}*
|
||||
|
|
|
@ -31,11 +31,11 @@ const std::type_info* test3_typeid() { return &typeid(*fn()); }
|
|||
// CHECK: tail call i8* @__RTtypeid(i8* null)
|
||||
// CHECK-NEXT: unreachable
|
||||
// CHECK: [[THIS:%.*]] = bitcast %struct.A* [[CALL]] to i8*
|
||||
// CHECK-NEXT: [[VBTBLP:%.*]] = getelementptr inbounds %struct.A* [[CALL]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBTBLP:%.*]] = getelementptr inbounds %struct.A, %struct.A* [[CALL]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[VBTBL:%.*]] = load i32** [[VBTBLP]], align 4
|
||||
// CHECK-NEXT: [[VBSLOT:%.*]] = getelementptr inbounds i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBSLOT:%.*]] = getelementptr inbounds i32, i32* [[VBTBL]], i32 1
|
||||
// CHECK-NEXT: [[VBASE_OFFS:%.*]] = load i32* [[VBSLOT]], align 4
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[THIS]], i32 [[VBASE_OFFS]]
|
||||
// CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8, i8* [[THIS]], i32 [[VBASE_OFFS]]
|
||||
// CHECK-NEXT: [[RT:%.*]] = tail call i8* @__RTtypeid(i8* [[ADJ]])
|
||||
// CHECK-NEXT: [[RET:%.*]] = bitcast i8* [[RT]] to %struct.type_info*
|
||||
// CHECK-NEXT: ret %struct.type_info* [[RET]]
|
||||
|
|
|
@ -26,23 +26,23 @@ D::D() {} // Forces vftable emission.
|
|||
// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@D@@$4PPPPPPPM@A@AEXXZ"
|
||||
// CHECK: %[[ECX:.*]] = load %struct.D** %{{.*}}
|
||||
// CHECK: %[[ECX_i8:.*]] = bitcast %struct.D* %[[ECX]] to i8*
|
||||
// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8* %[[ECX_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
|
||||
// CHECK: %[[VTORDISP:.*]] = load i32* %[[VTORDISP_PTR]]
|
||||
// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
|
||||
// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
|
||||
// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
|
||||
// CHECK: call x86_thiscallcc void @"\01?f@D@@UAEXXZ"(i8* %[[ADJUSTED_i8]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@D@@$4PPPPPPPI@3AEXXZ"
|
||||
// CHECK: %[[ECX:.*]] = load %struct.D** %{{.*}}
|
||||
// CHECK: %[[ECX_i8:.*]] = bitcast %struct.D* %[[ECX]] to i8*
|
||||
// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8* %[[ECX_i8]], i32 -8
|
||||
// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -8
|
||||
// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
|
||||
// CHECK: %[[VTORDISP:.*]] = load i32* %[[VTORDISP_PTR]]
|
||||
// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
|
||||
// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
|
||||
// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8* %[[VTORDISP_ADJUSTED_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
|
||||
// CHECK: %[[ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[VTORDISP_ADJUSTED_i8]], i32 -4
|
||||
// CHECK: call x86_thiscallcc void @"\01?f@D@@UAEXXZ"(i8* %[[ADJUSTED_i8]])
|
||||
// CHECK: ret void
|
||||
|
||||
|
@ -66,17 +66,17 @@ G::G() {} // Forces vftable emission.
|
|||
// CHECK-LABEL: define linkonce_odr x86_thiscallcc void @"\01?f@E@@$R4BA@M@PPPPPPPM@7AEXXZ"(i8*)
|
||||
// CHECK: %[[ECX:.*]] = load %struct.E** %{{.*}}
|
||||
// CHECK: %[[ECX_i8:.*]] = bitcast %struct.E* %[[ECX]] to i8*
|
||||
// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8* %[[ECX_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_PTR_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_PTR_i8]] to i32*
|
||||
// CHECK: %[[VTORDISP:.*]] = load i32* %[[VTORDISP_PTR]]
|
||||
// CHECK: %[[VTORDISP_NEG:.*]] = sub i32 0, %[[VTORDISP]]
|
||||
// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
|
||||
// CHECK: %[[VBPTR_i8:.*]] = getelementptr inbounds i8* %[[VTORDISP_ADJUSTED_i8]], i32 -16
|
||||
// CHECK: %[[VTORDISP_ADJUSTED_i8:.*]] = getelementptr i8, i8* %[[ECX_i8]], i32 %[[VTORDISP_NEG]]
|
||||
// CHECK: %[[VBPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[VTORDISP_ADJUSTED_i8]], i32 -16
|
||||
// CHECK: %[[VBPTR:.*]] = bitcast i8* %[[VBPTR_i8]] to i32**
|
||||
// CHECK: %[[VBTABLE:.*]] = load i32** %[[VBPTR]]
|
||||
// CHECK: %[[VBOFFSET_PTR:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 3
|
||||
// CHECK: %[[VBOFFSET_PTR:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 3
|
||||
// CHECK: %[[VBASE_OFFSET:.*]] = load i32* %[[VBOFFSET_PTR]]
|
||||
// CHECK: %[[VBASE:.*]] = getelementptr inbounds i8* %[[VBPTR_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CHECK: %[[ARG_i8:.*]] = getelementptr i8* %[[VBASE]], i32 8
|
||||
// CHECK: %[[VBASE:.*]] = getelementptr inbounds i8, i8* %[[VBPTR_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CHECK: %[[ARG_i8:.*]] = getelementptr i8, i8* %[[VBASE]], i32 8
|
||||
// CHECK: call x86_thiscallcc void @"\01?f@E@@UAEXXZ"(i8* %[[ARG_i8]])
|
||||
// CHECK: ret void
|
||||
|
|
|
@ -28,22 +28,22 @@ B::B() {
|
|||
|
||||
// CHECK: %[[SKIP_VBASES]]
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 0
|
||||
// ...
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 %{{.*}}
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 %{{.*}}
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
|
||||
// CHECK: store i32 (...)** bitcast ([3 x i8*]* @"\01??_7B@@6B@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
|
||||
|
||||
// Initialize vtorDisp:
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 0
|
||||
// ...
|
||||
// CHECK: %[[VBASE_OFFSET:.*]] = add nsw i32 0, %{{.*}}
|
||||
// CHECK: %[[VTORDISP_VAL:.*]] = sub i32 %[[VBASE_OFFSET]], 8
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CHECK: %[[VTORDISP_i8:.*]] = getelementptr i8* %[[VBASE_i8]], i32 -4
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CHECK: %[[VTORDISP_i8:.*]] = getelementptr i8, i8* %[[VBASE_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_i8]] to i32*
|
||||
// CHECK: store i32 %[[VTORDISP_VAL]], i32* %[[VTORDISP_PTR]]
|
||||
|
||||
|
@ -54,29 +54,29 @@ B::~B() {
|
|||
// CHECK-LABEL: define x86_thiscallcc void @"\01??1B@@UAE@XZ"
|
||||
// Adjust the this parameter:
|
||||
// CHECK: %[[THIS_PARAM_i8:.*]] = bitcast %struct.B* {{.*}} to i8*
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8* %[[THIS_PARAM_i8]], i32 -8
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_PARAM_i8]], i32 -8
|
||||
// CHECK: %[[THIS:.*]] = bitcast i8* %[[THIS_i8]] to %struct.B*
|
||||
// CHECK: store %struct.B* %[[THIS]], %struct.B** %[[THIS_ADDR:.*]], align 4
|
||||
// CHECK: %[[THIS:.*]] = load %struct.B** %[[THIS_ADDR]]
|
||||
|
||||
// Restore the vfptr that could have been changed by a subclass.
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 0
|
||||
// ...
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 %{{.*}}
|
||||
// CHECK: %[[VFPTR_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 %{{.*}}
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
|
||||
// CHECK: store i32 (...)** bitcast ([3 x i8*]* @"\01??_7B@@6B@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
|
||||
|
||||
// Initialize vtorDisp:
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 0
|
||||
// ...
|
||||
// CHECK: %[[VBASE_OFFSET:.*]] = add nsw i32 0, %{{.*}}
|
||||
// CHECK: %[[VTORDISP_VAL:.*]] = sub i32 %[[VBASE_OFFSET]], 8
|
||||
// CHECK: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CHECK: %[[VTORDISP_i8:.*]] = getelementptr i8* %[[VBASE_i8]], i32 -4
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i32 %[[VBASE_OFFSET]]
|
||||
// CHECK: %[[VTORDISP_i8:.*]] = getelementptr i8, i8* %[[VBASE_i8]], i32 -4
|
||||
// CHECK: %[[VTORDISP_PTR:.*]] = bitcast i8* %[[VTORDISP_i8]] to i32*
|
||||
// CHECK: store i32 %[[VTORDISP_VAL]], i32* %[[VTORDISP_PTR]]
|
||||
|
||||
|
@ -87,18 +87,18 @@ B::~B() {
|
|||
// CHECK2-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_DB@@UAE@XZ"(%struct.B*
|
||||
// CHECK2: %[[THIS:.*]] = load %struct.B** {{.*}}
|
||||
// CHECK2: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK2: %[[B_i8:.*]] = getelementptr i8* %[[THIS_i8]], i32 8
|
||||
// CHECK2: %[[B_i8:.*]] = getelementptr i8, i8* %[[THIS_i8]], i32 8
|
||||
// CHECK2: %[[B:.*]] = bitcast i8* %[[B_i8]] to %struct.B*
|
||||
// CHECK2: call x86_thiscallcc void @"\01??1B@@UAE@XZ"(%struct.B* %[[B]])
|
||||
// CHECK2: %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK2: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i64 8
|
||||
// CHECK2: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_i8]], i64 8
|
||||
// CHECK2: %[[VBASE:.*]] = bitcast i8* %[[VBASE_i8]] to %struct.VBase*
|
||||
// CHECK2: call x86_thiscallcc void @"\01??1VBase@@UAE@XZ"(%struct.VBase* %[[VBASE]])
|
||||
// CHECK2: ret
|
||||
|
||||
// CHECK2-LABEL: define linkonce_odr x86_thiscallcc i8* @"\01??_GB@@UAEPAXI@Z"
|
||||
// CHECK2: %[[THIS_PARAM_i8:.*]] = bitcast %struct.B* {{.*}} to i8*
|
||||
// CHECK2: %[[THIS_i8:.*]] = getelementptr inbounds i8* %[[THIS_PARAM_i8:.*]], i32 -8
|
||||
// CHECK2: %[[THIS_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS_PARAM_i8:.*]], i32 -8
|
||||
// CHECK2: %[[THIS:.*]] = bitcast i8* %[[THIS_i8]] to %struct.B*
|
||||
// CHECK2: store %struct.B* %[[THIS]], %struct.B** %[[THIS_ADDR:.*]], align 4
|
||||
// CHECK2: %[[THIS:.*]] = load %struct.B** %[[THIS_ADDR]]
|
||||
|
@ -114,23 +114,23 @@ void B::foo() {
|
|||
// need to adjust 'this' before use.
|
||||
//
|
||||
// CHECK: %[[THIS_ADDR:.*]] = alloca %struct.B*, align 4
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8* %[[ECX:.*]], i32 -8
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8, i8* %[[ECX:.*]], i32 -8
|
||||
// CHECK: %[[THIS:.*]] = bitcast i8* %[[THIS_i8]] to %struct.B*
|
||||
// CHECK: store %struct.B* %[[THIS]], %struct.B** %[[THIS_ADDR]], align 4
|
||||
|
||||
field = 42;
|
||||
// CHECK: %[[THIS:.*]] = load %struct.B** %[[THIS_ADDR]]
|
||||
// CHECK: %[[THIS8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[THIS8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[THIS8]], i32 0
|
||||
// CHECK: %[[VBPTR8:.*]] = bitcast i8* %[[VBPTR]] to i32**
|
||||
// CHECK: %[[VBTABLE:.*]] = load i32** %[[VBPTR8]]
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBOFFSET32:.*]] = load i32* %[[VBENTRY]]
|
||||
// CHECK: %[[VBOFFSET:.*]] = add nsw i32 0, %[[VBOFFSET32]]
|
||||
// CHECK: %[[THIS8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[THIS8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[THIS8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE:.*]] = bitcast i8* %[[VBASE_i8]] to %struct.VBase*
|
||||
// CHECK: %[[FIELD:.*]] = getelementptr inbounds %struct.VBase* %[[VBASE]], i32 0, i32 1
|
||||
// CHECK: %[[FIELD:.*]] = getelementptr inbounds %struct.VBase, %struct.VBase* %[[VBASE]], i32 0, i32 1
|
||||
// CHECK: store i32 42, i32* %[[FIELD]], align 4
|
||||
//
|
||||
// CHECK: ret void
|
||||
|
@ -145,26 +145,26 @@ void call_vbase_bar(B *obj) {
|
|||
// at the caller site.
|
||||
//
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %struct.B* %[[OBJ]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR8:.*]] = bitcast i8* %[[VBPTR]] to i32**
|
||||
// CHECK: %[[VBTABLE:.*]] = load i32** %[[VBPTR8]]
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBOFFSET32:.*]] = load i32* %[[VBENTRY]]
|
||||
// CHECK: %[[VBOFFSET:.*]] = add nsw i32 0, %[[VBOFFSET32]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VBASE_i8]] to void (i8*)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load void (i8*)*** %[[VFPTR]]
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (i8*)** %[[VFTABLE]], i64 2
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds void (i8*)*, void (i8*)** %[[VFTABLE]], i64 2
|
||||
// CHECK: %[[VFUN_VALUE:.*]] = load void (i8*)** %[[VFUN]]
|
||||
//
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %struct.B* %[[OBJ]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR8:.*]] = bitcast i8* %[[VBPTR]] to i32**
|
||||
// CHECK: %[[VBTABLE:.*]] = load i32** %[[VBPTR8]]
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBOFFSET32:.*]] = load i32* %[[VBENTRY]]
|
||||
// CHECK: %[[VBOFFSET:.*]] = add nsw i32 0, %[[VBOFFSET32]]
|
||||
// CHECK: %[[VBASE:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
//
|
||||
// CHECK: call x86_thiscallcc void %[[VFUN_VALUE]](i8* %[[VBASE]])
|
||||
//
|
||||
|
@ -177,26 +177,26 @@ void delete_B(B *obj) {
|
|||
|
||||
delete obj;
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %struct.B* %[[OBJ]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR8:.*]] = bitcast i8* %[[VBPTR]] to i32**
|
||||
// CHECK: %[[VBTABLE:.*]] = load i32** %[[VBPTR8]]
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBOFFSET32:.*]] = load i32* %[[VBENTRY]]
|
||||
// CHECK: %[[VBOFFSET:.*]] = add nsw i32 0, %[[VBOFFSET32]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VFPTR:.*]] = bitcast i8* %[[VBASE_i8]] to i8* (%struct.B*, i32)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load i8* (%struct.B*, i32)*** %[[VFPTR]]
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds i8* (%struct.B*, i32)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = getelementptr inbounds i8* (%struct.B*, i32)*, i8* (%struct.B*, i32)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN_VALUE:.*]] = load i8* (%struct.B*, i32)** %[[VFUN]]
|
||||
//
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %struct.B* %[[OBJ]] to i8*
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 0
|
||||
// CHECK: %[[VBPTR8:.*]] = bitcast i8* %[[VBPTR]] to i32**
|
||||
// CHECK: %[[VBTABLE:.*]] = load i32** %[[VBPTR8]]
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBENTRY:.*]] = getelementptr inbounds i32, i32* %[[VBTABLE]], i32 1
|
||||
// CHECK: %[[VBOFFSET32:.*]] = load i32* %[[VBENTRY]]
|
||||
// CHECK: %[[VBOFFSET:.*]] = add nsw i32 0, %[[VBOFFSET32]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE_i8:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 %[[VBOFFSET]]
|
||||
// CHECK: %[[VBASE:.*]] = bitcast i8* %[[VBASE_i8]] to %struct.B*
|
||||
//
|
||||
// CHECK: call x86_thiscallcc i8* %[[VFUN_VALUE]](%struct.B* %[[VBASE]], i32 1)
|
||||
|
@ -285,22 +285,22 @@ struct D : virtual Z, B, C {
|
|||
D::~D() {
|
||||
// CHECK-LABEL: define x86_thiscallcc void @"\01??1D@diamond@@UAE@XZ"(%"struct.diamond::D"*)
|
||||
// CHECK: %[[ARG_i8:.*]] = bitcast %"struct.diamond::D"* %{{.*}} to i8*
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8* %[[ARG_i8]], i32 -24
|
||||
// CHECK: %[[THIS_i8:.*]] = getelementptr inbounds i8, i8* %[[ARG_i8]], i32 -24
|
||||
// CHECK: %[[THIS:.*]] = bitcast i8* %[[THIS_i8]] to %"struct.diamond::D"*
|
||||
// CHECK: store %"struct.diamond::D"* %[[THIS]], %"struct.diamond::D"** %[[THIS_VAL:.*]], align 4
|
||||
// CHECK: %[[THIS:.*]] = load %"struct.diamond::D"** %[[THIS_VAL]]
|
||||
// CHECK: %[[D_i8:.*]] = bitcast %"struct.diamond::D"* %[[THIS]] to i8*
|
||||
// CHECK: %[[C_i8:.*]] = getelementptr inbounds i8* %[[D_i8]], i64 4
|
||||
// CHECK: %[[C_i8:.*]] = getelementptr inbounds i8, i8* %[[D_i8]], i64 4
|
||||
// CHECK: %[[C:.*]] = bitcast i8* %[[C_i8]] to %"struct.diamond::C"*
|
||||
// CHECK: %[[C_i8:.*]] = bitcast %"struct.diamond::C"* %[[C]] to i8*
|
||||
// CHECK: %[[ARG_i8:.*]] = getelementptr i8* %{{.*}}, i32 16
|
||||
// CHECK: %[[ARG_i8:.*]] = getelementptr i8, i8* %{{.*}}, i32 16
|
||||
// FIXME: We might consider changing the dtor this parameter type to i8*.
|
||||
// CHECK: %[[ARG:.*]] = bitcast i8* %[[ARG_i8]] to %"struct.diamond::C"*
|
||||
// CHECK: call x86_thiscallcc void @"\01??1C@diamond@@UAE@XZ"(%"struct.diamond::C"* %[[ARG]])
|
||||
|
||||
// CHECK: %[[B:.*]] = bitcast %"struct.diamond::D"* %[[THIS]] to %"struct.diamond::B"*
|
||||
// CHECK: %[[B_i8:.*]] = bitcast %"struct.diamond::B"* %[[B]] to i8*
|
||||
// CHECK: %[[ARG_i8:.*]] = getelementptr i8* %[[B_i8]], i32 4
|
||||
// CHECK: %[[ARG_i8:.*]] = getelementptr i8, i8* %[[B_i8]], i32 4
|
||||
// CHECK: %[[ARG:.*]] = bitcast i8* %[[ARG_i8]] to %"struct.diamond::B"*
|
||||
// CHECK: call x86_thiscallcc void @"\01??1B@diamond@@UAE@XZ"(%"struct.diamond::B"* %[[ARG]])
|
||||
// CHECK: ret void
|
||||
|
@ -364,10 +364,10 @@ void D::bar() {
|
|||
// then compensate for the adjustment performed in the C::foo() prologue.
|
||||
// CHECK-NOT: load i8**
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %"struct.test3::D"* %{{.*}} to i8*
|
||||
// CHECK: %[[C_i8:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 8
|
||||
// CHECK: %[[C_i8:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 8
|
||||
// CHECK: %[[C:.*]] = bitcast i8* %[[C_i8]] to %"struct.test3::C"*
|
||||
// CHECK: %[[C_i8:.*]] = bitcast %"struct.test3::C"* %[[C]] to i8*
|
||||
// CHECK: %[[ARG:.*]] = getelementptr i8* %[[C_i8]], i32 4
|
||||
// CHECK: %[[ARG:.*]] = getelementptr i8, i8* %[[C_i8]], i32 4
|
||||
// CHECK: call x86_thiscallcc void @"\01?foo@C@test3@@UAEXXZ"(i8* %[[ARG]])
|
||||
// CHECK: ret
|
||||
}
|
||||
|
@ -409,7 +409,7 @@ void destroy(C *obj) {
|
|||
delete obj;
|
||||
// CHECK: %[[VPTR:.*]] = bitcast %"struct.test4::C"* %[[OBJ:.*]] to i8* (%"struct.test4::C"*, i32)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load i8* (%"struct.test4::C"*, i32)*** %[[VPTR]]
|
||||
// CHECK: %[[VFTENTRY:.*]] = getelementptr inbounds i8* (%"struct.test4::C"*, i32)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFTENTRY:.*]] = getelementptr inbounds i8* (%"struct.test4::C"*, i32)*, i8* (%"struct.test4::C"*, i32)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = load i8* (%"struct.test4::C"*, i32)** %[[VFTENTRY]]
|
||||
// CHECK: call x86_thiscallcc i8* %[[VFUN]](%"struct.test4::C"* %[[OBJ]], i32 1)
|
||||
// CHECK: ret
|
||||
|
@ -441,13 +441,13 @@ void destroy(E *obj) {
|
|||
|
||||
// CHECK-NOT: getelementptr
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %"struct.test4::E"* %[[OBJ:.*]] to i8*
|
||||
// CHECK: %[[B_i8:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 4
|
||||
// CHECK: %[[B_i8:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 4
|
||||
// CHECK: %[[VPTR:.*]] = bitcast i8* %[[B_i8]] to i8* (%"struct.test4::E"*, i32)***
|
||||
// CHECK: %[[VFTABLE:.*]] = load i8* (%"struct.test4::E"*, i32)*** %[[VPTR]]
|
||||
// CHECK: %[[VFTENTRY:.*]] = getelementptr inbounds i8* (%"struct.test4::E"*, i32)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFTENTRY:.*]] = getelementptr inbounds i8* (%"struct.test4::E"*, i32)*, i8* (%"struct.test4::E"*, i32)** %[[VFTABLE]], i64 0
|
||||
// CHECK: %[[VFUN:.*]] = load i8* (%"struct.test4::E"*, i32)** %[[VFTENTRY]]
|
||||
// CHECK: %[[OBJ_i8:.*]] = bitcast %"struct.test4::E"* %[[OBJ]] to i8*
|
||||
// CHECK: %[[B_i8:.*]] = getelementptr inbounds i8* %[[OBJ_i8]], i32 4
|
||||
// CHECK: %[[B_i8:.*]] = getelementptr inbounds i8, i8* %[[OBJ_i8]], i32 4
|
||||
// FIXME: in fact, the call should take i8* and the bitcast is redundant.
|
||||
// CHECK: %[[B_as_E:.*]] = bitcast i8* %[[B_i8]] to %"struct.test4::E"*
|
||||
// CHECK: call x86_thiscallcc i8* %[[VFUN]](%"struct.test4::E"* %[[B_as_E]], i32 1)
|
||||
|
|
|
@ -65,7 +65,7 @@ void f() {
|
|||
// CHECK32: #[[ATTR:[0-9]+]]
|
||||
// CHECK32-NOT: unnamed_addr
|
||||
// CHECK32: comdat
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 0
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 0
|
||||
// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK32-NEXT: ret void
|
||||
|
@ -75,7 +75,7 @@ void f() {
|
|||
// CHECK64: #[[ATTR:[0-9]+]]
|
||||
// CHECK64-NOT: unnamed_addr
|
||||
// CHECK64: comdat
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 0
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 0
|
||||
// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK64: musttail call void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK64-NEXT: ret void
|
||||
|
@ -84,7 +84,7 @@ void f() {
|
|||
// Thunk for calling the 2nd virtual function in C, taking int and double as parameters, returning int.
|
||||
// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$B3AE"(%struct.C* %this, ...)
|
||||
// CHECK32: #[[ATTR]] comdat
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 1
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 1
|
||||
// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK32-NEXT: ret void
|
||||
|
@ -92,7 +92,7 @@ void f() {
|
|||
//
|
||||
// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$B7AA"(%struct.C* %this, ...)
|
||||
// CHECK64: #[[ATTR]] comdat
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 1
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 1
|
||||
// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK64: musttail call void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK64-NEXT: ret void
|
||||
|
@ -101,7 +101,7 @@ void f() {
|
|||
// Thunk for calling the 3rd virtual function in C, taking an int parameter, returning a struct.
|
||||
// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$B7AE"(%struct.C* %this, ...)
|
||||
// CHECK32: #[[ATTR]] comdat
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 2
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 2
|
||||
// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK32-NEXT: ret void
|
||||
|
@ -109,7 +109,7 @@ void f() {
|
|||
//
|
||||
// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BBA@AA"(%struct.C* %this, ...)
|
||||
// CHECK64: #[[ATTR]] comdat
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 2
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 2
|
||||
// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK64: musttail call void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK64-NEXT: ret void
|
||||
|
@ -118,7 +118,7 @@ void f() {
|
|||
// Thunk for calling the virtual function in internal class D.
|
||||
// CHECK32-LABEL: define internal x86_thiscallcc void @"\01??_9D@?A@@$BA@AE"(%"struct.(anonymous namespace)::D"* %this, ...)
|
||||
// CHECK32: #[[ATTR]]
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0
|
||||
// CHECK32: [[CALLEE:%.*]] = load void (%"struct.(anonymous namespace)::D"*, ...)** [[VPTR]]
|
||||
// CHECK32: musttail call x86_thiscallcc void (%"struct.(anonymous namespace)::D"*, ...)* [[CALLEE]](%"struct.(anonymous namespace)::D"* %{{.*}}, ...)
|
||||
// CHECK32-NEXT: ret void
|
||||
|
@ -126,7 +126,7 @@ void f() {
|
|||
//
|
||||
// CHECK64-LABEL: define internal void @"\01??_9D@?A@@$BA@AA"(%"struct.(anonymous namespace)::D"* %this, ...)
|
||||
// CHECK64: #[[ATTR]]
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%"struct.(anonymous namespace)::D"*, ...)*, void (%"struct.(anonymous namespace)::D"*, ...)** %{{.*}}, i64 0
|
||||
// CHECK64: [[CALLEE:%.*]] = load void (%"struct.(anonymous namespace)::D"*, ...)** [[VPTR]]
|
||||
// CHECK64: musttail call void (%"struct.(anonymous namespace)::D"*, ...)* [[CALLEE]](%"struct.(anonymous namespace)::D"* %{{.*}}, ...)
|
||||
// CHECK64-NEXT: ret void
|
||||
|
@ -135,14 +135,14 @@ void f() {
|
|||
// Thunk for calling the fourth virtual function in C, taking a struct parameter
|
||||
// and returning a struct.
|
||||
// CHECK32-LABEL: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$BM@AE"(%struct.C* %this, ...) {{.*}} comdat
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 3
|
||||
// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 3
|
||||
// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK32-NEXT: ret void
|
||||
// CHECK32: }
|
||||
//
|
||||
// CHECK64-LABEL: define linkonce_odr void @"\01??_9C@@$BBI@AA"(%struct.C* %this, ...) {{.*}} comdat
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)** %{{.*}}, i64 3
|
||||
// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*, ...)*, void (%struct.C*, ...)** %{{.*}}, i64 3
|
||||
// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)** [[VPTR]]
|
||||
// CHECK64: musttail call void (%struct.C*, ...)* [[CALLEE]](%struct.C* %{{.*}}, ...)
|
||||
// CHECK64: ret void
|
||||
|
|
|
@ -160,7 +160,7 @@ void ffun(C &c) {
|
|||
// BITCODE: bitcast
|
||||
// BITCODE: bitcast
|
||||
// BITCODE: [[THIS1:%.+]] = bitcast %"struct.test4::C"* {{.*}} to i8*
|
||||
// BITCODE: [[THIS2:%.+]] = getelementptr inbounds i8* [[THIS1]], i32 4
|
||||
// BITCODE: [[THIS2:%.+]] = getelementptr inbounds i8, i8* [[THIS1]], i32 4
|
||||
// BITCODE-NEXT: call x86_thiscallcc {{.*}}(i8* [[THIS2]])
|
||||
c.bar();
|
||||
}
|
||||
|
@ -171,7 +171,7 @@ void fop(C &c) {
|
|||
// BITCODE: bitcast
|
||||
// BITCODE: bitcast
|
||||
// BITCODE: [[THIS1:%.+]] = bitcast %"struct.test4::C"* {{.*}} to i8*
|
||||
// BITCODE: [[THIS2:%.+]] = getelementptr inbounds i8* [[THIS1]], i32 4
|
||||
// BITCODE: [[THIS2:%.+]] = getelementptr inbounds i8, i8* [[THIS1]], i32 4
|
||||
// BITCODE-NEXT: call x86_thiscallcc {{.*}}(i8* [[THIS2]])
|
||||
-c;
|
||||
}
|
||||
|
|
|
@ -38,11 +38,11 @@ void check_array_value_init() {
|
|||
new (int S::*[3][4][5]) ();
|
||||
|
||||
// CHECK: call noalias i8* @_Zna{{.}}(i{{32 240|64 480}})
|
||||
// CHECK: getelementptr inbounds i{{32|64}}* {{.*}}, i{{32|64}} 60
|
||||
// CHECK: getelementptr inbounds i{{32|64}}, i{{32|64}}* {{.*}}, i{{32|64}} 60
|
||||
|
||||
// CHECK: phi
|
||||
// CHECK: store i{{32|64}} -1,
|
||||
// CHECK: getelementptr inbounds i{{32|64}}* {{.*}}, i{{32|64}} 1
|
||||
// CHECK: getelementptr inbounds i{{32|64}}, i{{32|64}}* {{.*}}, i{{32|64}} 1
|
||||
// CHECK: icmp eq
|
||||
// CHECK: br i1
|
||||
}
|
||||
|
|
|
@ -221,11 +221,11 @@ namespace test15 {
|
|||
// CHECK-NOT: icmp eq i8* [[P]], null
|
||||
// CHECK-NOT: br i1
|
||||
// CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]*
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 5
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]])
|
||||
// CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[DONE]]
|
||||
void test1a(void *p) {
|
||||
|
@ -237,13 +237,13 @@ namespace test15 {
|
|||
// CHECK: [[P:%.*]] = call i8* @_ZnamPvb(i64 13, i8* [[P0]]
|
||||
// CHECK-NEXT: icmp eq i8* [[P]], null
|
||||
// CHECK-NEXT: br i1
|
||||
// CHECK: [[AFTER_COOKIE:%.*]] = getelementptr inbounds i8* [[P]], i64 8
|
||||
// CHECK: [[AFTER_COOKIE:%.*]] = getelementptr inbounds i8, i8* [[P]], i64 8
|
||||
// CHECK: [[BEGIN:%.*]] = bitcast i8* [[AFTER_COOKIE]] to [[A:%.*]]*
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 5
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]])
|
||||
// CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[DONE]]
|
||||
void test1b(void *p) {
|
||||
|
@ -261,7 +261,7 @@ namespace test15 {
|
|||
// CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]*
|
||||
// CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq i64 [[T0]], 0
|
||||
// CHECK-NEXT: br i1 [[ISEMPTY]],
|
||||
// CHECK: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 [[T0]]
|
||||
// CHECK: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 [[T0]]
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]],
|
||||
// CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]])
|
||||
|
|
|
@ -18,19 +18,19 @@ namespace test0 {
|
|||
// CHECK-NEXT: [[SEL:%.*]] = alloca i32
|
||||
|
||||
// Initialize.
|
||||
// CHECK-NEXT: [[E_BEGIN:%.*]] = getelementptr inbounds [10 x [[A]]]* [[AS]], i64 0, i64 0
|
||||
// CHECK-NEXT: [[E_BEGIN:%.*]] = getelementptr inbounds [10 x [[A]]], [10 x [[A]]]* [[AS]], i64 0, i64 0
|
||||
// CHECK-NEXT: store [[A]]* [[E_BEGIN]], [[A]]** [[ENDVAR]]
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AC1Ei([[A]]* [[E_BEGIN]], i32 5)
|
||||
// CHECK: [[E1:%.*]] = getelementptr inbounds [[A]]* [[E_BEGIN]], i64 1
|
||||
// CHECK: [[E1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[E_BEGIN]], i64 1
|
||||
// CHECK-NEXT: store [[A]]* [[E1]], [[A]]** [[ENDVAR]]
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AC1Ei([[A]]* [[E1]], i32 7)
|
||||
// CHECK: [[E2:%.*]] = getelementptr inbounds [[A]]* [[E1]], i64 1
|
||||
// CHECK: [[E2:%.*]] = getelementptr inbounds [[A]], [[A]]* [[E1]], i64 1
|
||||
// CHECK-NEXT: store [[A]]* [[E2]], [[A]]** [[ENDVAR]]
|
||||
// CHECK-NEXT: [[E_END:%.*]] = getelementptr inbounds [[A]]* [[E_BEGIN]], i64 10
|
||||
// CHECK-NEXT: [[E_END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[E_BEGIN]], i64 10
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[E_CUR:%.*]] = phi [[A]]* [ [[E2]], {{%.*}} ], [ [[E_NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AC1Ev([[A]]* [[E_CUR]])
|
||||
// CHECK: [[E_NEXT]] = getelementptr inbounds [[A]]* [[E_CUR]], i64 1
|
||||
// CHECK: [[E_NEXT]] = getelementptr inbounds [[A]], [[A]]* [[E_CUR]], i64 1
|
||||
// CHECK-NEXT: store [[A]]* [[E_NEXT]], [[A]]** [[ENDVAR]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[E_NEXT]], [[E_END]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
@ -39,11 +39,11 @@ namespace test0 {
|
|||
// CHECK: invoke void @_Z6opaquev()
|
||||
|
||||
// Normal destroy.
|
||||
// CHECK: [[ED_BEGIN:%.*]] = getelementptr inbounds [10 x [[A]]]* [[AS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[ED_END:%.*]] = getelementptr inbounds [[A]]* [[ED_BEGIN]], i64 10
|
||||
// CHECK: [[ED_BEGIN:%.*]] = getelementptr inbounds [10 x [[A]]], [10 x [[A]]]* [[AS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[ED_END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ED_BEGIN]], i64 10
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[ED_AFTER:%.*]] = phi [[A]]* [ [[ED_END]], {{%.*}} ], [ [[ED_CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[ED_CUR]] = getelementptr inbounds [[A]]* [[ED_AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[ED_CUR]] = getelementptr inbounds [[A]], [[A]]* [[ED_AFTER]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AD1Ev([[A]]* [[ED_CUR]])
|
||||
// CHECK: [[T0:%.*]] = icmp eq [[A]]* [[ED_CUR]], [[ED_BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
@ -56,7 +56,7 @@ namespace test0 {
|
|||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[E_BEGIN]], [[PARTIAL_END]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
// CHECK: [[E_AFTER:%.*]] = phi [[A]]* [ [[PARTIAL_END]], {{%.*}} ], [ [[E_CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]]* [[E_AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]], [[A]]* [[E_AFTER]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AD1Ev([[A]]* [[E_CUR]])
|
||||
// CHECK: [[T0:%.*]] = icmp eq [[A]]* [[E_CUR]], [[E_BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
@ -64,8 +64,8 @@ namespace test0 {
|
|||
// Primary EH destructor.
|
||||
// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: [[E0:%.*]] = getelementptr inbounds [10 x [[A]]]* [[AS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[E_END:%.*]] = getelementptr inbounds [[A]]* [[E0]], i64 10
|
||||
// CHECK: [[E0:%.*]] = getelementptr inbounds [10 x [[A]]], [10 x [[A]]]* [[AS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[E_END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[E0]], i64 10
|
||||
// CHECK-NEXT: br label
|
||||
|
||||
// Partial destructor for primary normal destructor.
|
||||
|
@ -77,14 +77,14 @@ namespace test0 {
|
|||
// CHECK: [[T0:%.*]] = icmp eq [[A]]* [[ED_BEGIN]], [[ED_CUR]]
|
||||
// CHECK-NEXT: br i1 [[T0]]
|
||||
// CHECK: [[EDD_AFTER:%.*]] = phi [[A]]* [ [[ED_CUR]], {{%.*}} ], [ [[EDD_CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[EDD_CUR]] = getelementptr inbounds [[A]]* [[EDD_AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[EDD_CUR]] = getelementptr inbounds [[A]], [[A]]* [[EDD_AFTER]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AD1Ev([[A]]* [[EDD_CUR]])
|
||||
// CHECK: [[T0:%.*]] = icmp eq [[A]]* [[EDD_CUR]], [[ED_BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[T0]]
|
||||
|
||||
// Back to the primary EH destructor.
|
||||
// CHECK: [[E_AFTER:%.*]] = phi [[A]]* [ [[E_END]], {{%.*}} ], [ [[E_CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]]* [[E_AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]], [[A]]* [[E_AFTER]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN5test01AD1Ev([[A]]* [[E_CUR]])
|
||||
// CHECK: [[T0:%.*]] = icmp eq [[A]]* [[E_CUR]], [[E0]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
@ -102,13 +102,13 @@ namespace test1 {
|
|||
// CHECK: [[V:%.*]] = alloca [[B:%.*]], align 4
|
||||
// CHECK-NEXT: alloca i8*
|
||||
// CHECK-NEXT: alloca i32
|
||||
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds [[B]]* [[V]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds [[B]], [[B]]* [[V]], i32 0, i32 0
|
||||
// CHECK-NEXT: call void @_ZN5test11AC1Ei([[A:%.*]]* [[X]], i32 5)
|
||||
// CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds [[B]]* [[V]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds [[B]], [[B]]* [[V]], i32 0, i32 1
|
||||
// CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[Y]], i32 6)
|
||||
// CHECK: [[Z:%.*]] = getelementptr inbounds [[B]]* [[V]], i32 0, i32 2
|
||||
// CHECK: [[Z:%.*]] = getelementptr inbounds [[B]], [[B]]* [[V]], i32 0, i32 2
|
||||
// CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[Z]], i32 7)
|
||||
// CHECK: [[W:%.*]] = getelementptr inbounds [[B]]* [[V]], i32 0, i32 3
|
||||
// CHECK: [[W:%.*]] = getelementptr inbounds [[B]], [[B]]* [[V]], i32 0, i32 3
|
||||
// CHECK-NEXT: store i32 8, i32* [[W]], align 4
|
||||
// CHECK-NEXT: call void @_ZN5test11BD1Ev([[B]]* [[V]])
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -134,12 +134,12 @@ namespace test2 {
|
|||
// CHECK-NEXT: alloca i32
|
||||
|
||||
// Main initialization loop.
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [4 x [7 x [[A]]]]* [[V]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 28
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [4 x [7 x [[A]]]], [4 x [7 x [[A]]]]* [[V]], i32 0, i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 28
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: invoke void @_ZN5test21AC1Ev([[A]]* [[CUR]])
|
||||
// CHECK: [[NEXT:%.*]] = getelementptr inbounds [[A]]* [[CUR]], i64 1
|
||||
// CHECK: [[NEXT:%.*]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[DONE]],
|
||||
|
||||
|
@ -149,7 +149,7 @@ namespace test2 {
|
|||
// CHECK: [[EMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[CUR]]
|
||||
// CHECK-NEXT: br i1 [[EMPTY]],
|
||||
// CHECK: [[PAST:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[DEL:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[DEL]] = getelementptr inbounds [[A]]* [[PAST]], i64 -1
|
||||
// CHECK-NEXT: [[DEL]] = getelementptr inbounds [[A]], [[A]]* [[PAST]], i64 -1
|
||||
// CHECK-NEXT: invoke void @_ZN5test21AD1Ev([[A]]* [[DEL]])
|
||||
// CHECK: [[T0:%.*]] = icmp eq [[A]]* [[DEL]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
|
|
@ -205,7 +205,7 @@ namespace BoolPtrToMember {
|
|||
// CHECK-LABEL: define dereferenceable({{[0-9]+}}) i8* @_ZN15BoolPtrToMember1fERNS_1XEMS0_b
|
||||
bool &f(X &x, bool X::*member) {
|
||||
// CHECK: {{bitcast.* to i8\*}}
|
||||
// CHECK-NEXT: getelementptr inbounds i8*
|
||||
// CHECK-NEXT: getelementptr inbounds i8, i8*
|
||||
// CHECK-NEXT: ret i8*
|
||||
return x.*member;
|
||||
}
|
||||
|
|
|
@ -6,9 +6,9 @@ struct __declspec(dllexport) Derived : virtual Base {
|
|||
// CHECK-LABEL: define weak_odr dllexport x86_thiscallcc %struct.Derived* @"\01??0Derived@@QAE@ABU0@@Z"
|
||||
// CHECK: %[[this:.*]] = load %struct.Derived** {{.*}}
|
||||
// CHECK-NEXT: store %struct.Derived* %[[this]], %struct.Derived** %[[retval:.*]]
|
||||
// CHECK: %[[dest_a_gep:.*]] = getelementptr inbounds %struct.Derived* %[[this]], i32 0, i32 1
|
||||
// CHECK: %[[dest_a_gep:.*]] = getelementptr inbounds %struct.Derived, %struct.Derived* %[[this]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[src_load:.*]] = load %struct.Derived** {{.*}}
|
||||
// CHECK-NEXT: %[[src_a_gep:.*]] = getelementptr inbounds %struct.Derived* %[[src_load:.*]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[src_a_gep:.*]] = getelementptr inbounds %struct.Derived, %struct.Derived* %[[src_load:.*]], i32 0, i32 1
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %[[dest_a_gep]], i8* %[[src_a_gep]], i64 1, i32 4, i1 false)
|
||||
// CHECK-NEXT: %[[dest_this:.*]] = load %struct.Derived** %[[retval]]
|
||||
// CHECK-NEXT: ret %struct.Derived* %[[dest_this]]
|
||||
|
@ -21,9 +21,9 @@ struct __declspec(dllexport) Derived2 : virtual Base {
|
|||
// CHECK-LABEL: define weak_odr dllexport x86_thiscallcc %struct.Derived2* @"\01??0Derived2@@QAE@ABU0@@Z"
|
||||
// CHECK: %[[this:.*]] = load %struct.Derived2** {{.*}}
|
||||
// CHECK-NEXT: store %struct.Derived2* %[[this]], %struct.Derived2** %[[retval:.*]]
|
||||
// CHECK: %[[dest_a_gep:.*]] = getelementptr inbounds %struct.Derived2* %[[this]], i32 0, i32 1
|
||||
// CHECK: %[[dest_a_gep:.*]] = getelementptr inbounds %struct.Derived2, %struct.Derived2* %[[this]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[src_load:.*]] = load %struct.Derived2** {{.*}}
|
||||
// CHECK-NEXT: %[[src_a_gep:.*]] = getelementptr inbounds %struct.Derived2* %[[src_load:.*]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[src_a_gep:.*]] = getelementptr inbounds %struct.Derived2, %struct.Derived2* %[[src_load:.*]], i32 0, i32 1
|
||||
// CHECK-NEXT: %[[dest_a_bitcast:.*]] = bitcast [1 x i32]* %[[dest_a_gep]] to i8*
|
||||
// CHECK-NEXT: %[[src_a_bitcast:.*]] = bitcast [1 x i32]* %[[src_a_gep]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[dest_a_bitcast]], i8* %[[src_a_bitcast]], i32 4, i32 4, i1 false)
|
||||
|
|
|
@ -10,7 +10,7 @@ B &getB();
|
|||
// CHECK-LABEL: define dereferenceable({{[0-9]+}}) %struct.A* @_Z4getAv()
|
||||
// CHECK: call dereferenceable({{[0-9]+}}) %struct.B* @_Z4getBv()
|
||||
// CHECK-NEXT: bitcast %struct.B*
|
||||
// CHECK-NEXT: getelementptr inbounds i8*
|
||||
// CHECK-NEXT: getelementptr inbounds i8, i8*
|
||||
// CHECK-NEXT: bitcast i8* {{.*}} to %struct.A*
|
||||
// CHECK-NEXT: ret %struct.A*
|
||||
A &&getA() { return static_cast<A&&>(getB()); }
|
||||
|
|
|
@ -16,15 +16,15 @@ void test() {
|
|||
// PR10789: different platforms have different sizes for struct UnwindException.
|
||||
|
||||
// X86-64: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// X86-64-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i64 32
|
||||
// X86-64-NEXT: [[T1:%.*]] = getelementptr i8, i8* [[EXN]], i64 32
|
||||
// X86-32: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// X86-32-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i64 32
|
||||
// X86-32-NEXT: [[T1:%.*]] = getelementptr i8, i8* [[EXN]], i64 32
|
||||
// ARM-DARWIN: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// ARM-DARWIN-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i64 32
|
||||
// ARM-DARWIN-NEXT: [[T1:%.*]] = getelementptr i8, i8* [[EXN]], i64 32
|
||||
// ARM-EABI: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// ARM-EABI-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i32 88
|
||||
// ARM-EABI-NEXT: [[T1:%.*]] = getelementptr i8, i8* [[EXN]], i32 88
|
||||
// MIPS: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// MIPS-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i32 24
|
||||
// MIPS-NEXT: [[T1:%.*]] = getelementptr i8, i8* [[EXN]], i32 24
|
||||
|
||||
// X86-64: attributes [[NUW]] = { nounwind }
|
||||
// X86-32: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -475,17 +475,17 @@ namespace Elision {
|
|||
// CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[X]])
|
||||
A x;
|
||||
|
||||
// CHECK-NEXT: [[XS0:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i64 0, i64 0
|
||||
// CHECK-NEXT: [[XS0:%.*]] = getelementptr inbounds [2 x [[A]]], [2 x [[A]]]* [[XS]], i64 0, i64 0
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[XS0]])
|
||||
// CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]]* [[XS0]], i64 1
|
||||
// CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]], [[A]]* [[XS0]], i64 1
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[XS1]], [[A]]* dereferenceable({{[0-9]+}}) [[X]])
|
||||
A xs[] = { A(), x };
|
||||
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 2
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]], [2 x [[A]]]* [[XS]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 2
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[AFTER:%.*]] = phi [[A]]*
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]], [[A]]* [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[CUR]])
|
||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
@ -504,7 +504,7 @@ namespace Elision {
|
|||
// CHECK-NEXT: [[BT2:%.*]] = alloca [[B]], align 8
|
||||
|
||||
// CHECK: call void @_ZN7Elision1BC1Ev([[B]]* [[BT0]])
|
||||
// CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT0]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]], [[B]]* [[BT0]], i32 0, i32 0
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[AT0]], [[A]]* dereferenceable({{[0-9]+}}) [[AM]])
|
||||
// CHECK-NEXT: call void @_ZN7Elision5takeAENS_1AE([[A]]* [[AT0]])
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[AT0]])
|
||||
|
@ -512,13 +512,13 @@ namespace Elision {
|
|||
takeA(B().a);
|
||||
|
||||
// CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT1]])
|
||||
// CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT1]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]], [[B]]* [[BT1]], i32 0, i32 0
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[X]], [[A]]* dereferenceable({{[0-9]+}}) [[AM]])
|
||||
// CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT1]])
|
||||
A x = B().a;
|
||||
|
||||
// CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT2]])
|
||||
// CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT2]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]], [[B]]* [[BT2]], i32 0, i32 0
|
||||
// CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET:%.*]], [[A]]* dereferenceable({{[0-9]+}}) [[AM]])
|
||||
// CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT2]])
|
||||
return B().a;
|
||||
|
@ -575,12 +575,12 @@ namespace PR11365 {
|
|||
|
||||
// CHECK-LABEL: define void @_ZN7PR113653fooEv(
|
||||
void foo() {
|
||||
// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 3
|
||||
// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]], [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[BEGIN]], i64 3
|
||||
// CHECK-NEXT: br label
|
||||
|
||||
// CHECK: [[PHI:%.*]] = phi
|
||||
// CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]]* [[PHI]], i64 -1
|
||||
// CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]], [[A]]* [[PHI]], i64 -1
|
||||
// CHECK-NEXT: call void @_ZN7PR113651AD1Ev([[A]]* [[ELEM]])
|
||||
// CHECK-NEXT: icmp eq [[A]]* [[ELEM]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1
|
||||
|
|
|
@ -295,8 +295,8 @@ namespace Test12 {
|
|||
// Varargs thunk; check that both the this and covariant adjustments
|
||||
// are generated.
|
||||
// CHECK: define {{.*}} @_ZTchn8_h8_N6Test121C1fEiz
|
||||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 8
|
||||
// CHECK: getelementptr inbounds i8, i8* {{.*}}, i64 -8
|
||||
// CHECK: getelementptr inbounds i8, i8* {{.*}}, i64 8
|
||||
}
|
||||
|
||||
// PR13832
|
||||
|
@ -318,10 +318,10 @@ namespace Test13 {
|
|||
return *this;
|
||||
}
|
||||
// CHECK: define {{.*}} @_ZTcvn8_n32_v8_n24_N6Test131D4foo1Ev
|
||||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 -32
|
||||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 -24
|
||||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 8
|
||||
// CHECK: getelementptr inbounds i8, i8* {{.*}}, i64 -8
|
||||
// CHECK: getelementptr inbounds i8, i8* {{.*}}, i64 -32
|
||||
// CHECK: getelementptr inbounds i8, i8* {{.*}}, i64 -24
|
||||
// CHECK: getelementptr inbounds i8, i8* {{.*}}, i64 8
|
||||
// CHECK: ret %"struct.Test13::D"*
|
||||
}
|
||||
|
||||
|
|
|
@ -204,34 +204,34 @@ namespace test6 {
|
|||
// CHECK-LABEL: define void @_ZN5test64testEv()
|
||||
// CHECK: [[ARR:%.*]] = alloca [10 x [20 x [[A:%.*]]]],
|
||||
|
||||
// CHECK-NEXT: [[INNER:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]]* [[ARR]], i64 0, i64 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [20 x [[A]]]* [[INNER]], i64 0, i64 0
|
||||
// CHECK-NEXT: [[INNER:%.*]] = getelementptr inbounds [10 x [20 x [[A]]]], [10 x [20 x [[A]]]]* [[ARR]], i64 0, i64 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[INNER]], i64 0, i64 0
|
||||
// CHECK-NEXT: call void @_ZN5test61AC1Ei([[A]]* [[T0]], i32 5)
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [[A]]* [[T0]], i64 1
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[T0]], i64 20
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i64 1
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], [[A]]* [[T0]], i64 20
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: call void @_ZN5test61AC1Ev([[A]]* [[CUR]])
|
||||
// CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]], [[A]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]]
|
||||
// CHECK-NEXT: br i1
|
||||
|
||||
// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [20 x [[A]]]* [[INNER]], i64 1
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [20 x [[A]]]* [[INNER]], i64 10
|
||||
// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[INNER]], i64 1
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[INNER]], i64 10
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[CUR:%.*]] = phi [20 x [[A]]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
|
||||
// Inner loop.
|
||||
// CHECK-NEXT: [[IBEGIN:%.*]] = getelementptr inbounds [20 x [[A]]]* [[CUR]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[IEND:%.*]] = getelementptr inbounds [[A]]* [[IBEGIN]], i64 20
|
||||
// CHECK-NEXT: [[IBEGIN:%.*]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[CUR]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[IEND:%.*]] = getelementptr inbounds [[A]], [[A]]* [[IBEGIN]], i64 20
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[ICUR:%.*]] = phi [[A]]* [ [[IBEGIN]], {{%.*}} ], [ [[INEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: call void @_ZN5test61AC1Ev([[A]]* [[ICUR]])
|
||||
// CHECK-NEXT: [[INEXT:%.*]] = getelementptr inbounds [[A]]* [[ICUR]], i64 1
|
||||
// CHECK-NEXT: [[INEXT:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ICUR]], i64 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[INEXT]], [[IEND]]
|
||||
// CHECK-NEXT: br i1 [[T0]],
|
||||
|
||||
// CHECK: [[NEXT]] = getelementptr inbounds [20 x [[A]]]* [[CUR]], i64 1
|
||||
// CHECK: [[NEXT]] = getelementptr inbounds [20 x [[A]]], [20 x [[A]]]* [[CUR]], i64 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq [20 x [[A]]]* [[NEXT]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[T0]]
|
||||
// CHECK: ret void
|
||||
|
|
|
@ -18,7 +18,7 @@ void test(X x) {
|
|||
// X64: alloca %struct.X
|
||||
|
||||
// X64: %[[agg:[^ ]*]] = alloca %struct.X
|
||||
// X64: %[[valptr:[^ ]*]] = getelementptr %struct.X* %[[agg]], i32 0, i32 0
|
||||
// X64: %[[valptr:[^ ]*]] = getelementptr %struct.X, %struct.X* %[[agg]], i32 0, i32 0
|
||||
// X64: %[[val:[^ ]*]] = load i32* %[[valptr]]
|
||||
// X64: call void (...)* @"\01?vararg@@YAXZZ"(i32 %[[val]])
|
||||
|
||||
|
|
|
@ -13,33 +13,33 @@ D* x;
|
|||
|
||||
A* a() { return x; }
|
||||
// CHECK: @_Z1av() [[NUW:#[0-9]+]]
|
||||
// CHECK: [[VBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = getelementptr i8* {{.*}}, i64 -16
|
||||
// CHECK: [[VBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = getelementptr i8, i8* {{.*}}, i64 -16
|
||||
// CHECK: [[CASTVBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = bitcast i8* [[VBASEOFFSETPTRA]] to i32*
|
||||
// CHECK: load i32* [[CASTVBASEOFFSETPTRA]]
|
||||
// CHECK: }
|
||||
|
||||
// MSVC: @"\01?a@@YAPAUA@@XZ"() [[NUW:#[0-9]+]] {
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8* {{.*}}, i32 0
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* {{.*}}, i32 0
|
||||
// MSVC: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32**
|
||||
// MSVC: %[[vbtable:.*]] = load i32** %[[vbptr]]
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32* {{.*}}, i32 1
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32, i32* {{.*}}, i32 1
|
||||
// MSVC: %[[offset:.*]] = load i32* %[[entry]]
|
||||
// MSVC: add nsw i32 0, %[[offset]]
|
||||
// MSVC: }
|
||||
|
||||
B* b() { return x; }
|
||||
// CHECK: @_Z1bv() [[NUW]]
|
||||
// CHECK: [[VBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = getelementptr i8* {{.*}}, i64 -20
|
||||
// CHECK: [[VBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = getelementptr i8, i8* {{.*}}, i64 -20
|
||||
// CHECK: [[CASTVBASEOFFSETPTRA:%[a-zA-Z0-9\.]+]] = bitcast i8* [[VBASEOFFSETPTRA]] to i32*
|
||||
// CHECK: load i32* [[CASTVBASEOFFSETPTRA]]
|
||||
// CHECK: }
|
||||
|
||||
// Same as 'a' except we use a different vbtable offset.
|
||||
// MSVC: @"\01?b@@YAPAUB@@XZ"() [[NUW:#[0-9]+]] {
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8* {{.*}}, i32 0
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* {{.*}}, i32 0
|
||||
// MSVC: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32**
|
||||
// MSVC: %[[vbtable:.*]] = load i32** %[[vbptr]]
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32* {{.*}}, i32 2
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32, i32* {{.*}}, i32 2
|
||||
// MSVC: %[[offset:.*]] = load i32* %[[entry]]
|
||||
// MSVC: add nsw i32 0, %[[offset]]
|
||||
// MSVC: }
|
||||
|
@ -47,7 +47,7 @@ B* b() { return x; }
|
|||
|
||||
BB* c() { return x; }
|
||||
// CHECK: @_Z1cv() [[NUW]]
|
||||
// CHECK: [[VBASEOFFSETPTRC:%[a-zA-Z0-9\.]+]] = getelementptr i8* {{.*}}, i64 -24
|
||||
// CHECK: [[VBASEOFFSETPTRC:%[a-zA-Z0-9\.]+]] = getelementptr i8, i8* {{.*}}, i64 -24
|
||||
// CHECK: [[CASTVBASEOFFSETPTRC:%[a-zA-Z0-9\.]+]] = bitcast i8* [[VBASEOFFSETPTRC]] to i32*
|
||||
// CHECK: [[VBASEOFFSETC:%[a-zA-Z0-9\.]+]] = load i32* [[CASTVBASEOFFSETPTRC]]
|
||||
// CHECK: add i32 [[VBASEOFFSETC]], 8
|
||||
|
@ -55,10 +55,10 @@ BB* c() { return x; }
|
|||
|
||||
// Same as 'a' except we use a different vbtable offset.
|
||||
// MSVC: @"\01?c@@YAPAUBB@@XZ"() [[NUW:#[0-9]+]] {
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8* {{.*}}, i32 0
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* {{.*}}, i32 0
|
||||
// MSVC: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32**
|
||||
// MSVC: %[[vbtable:.*]] = load i32** %[[vbptr]]
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32* {{.*}}, i32 4
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32, i32* {{.*}}, i32 4
|
||||
// MSVC: %[[offset:.*]] = load i32* %[[entry]]
|
||||
// MSVC: add nsw i32 0, %[[offset]]
|
||||
// MSVC: }
|
||||
|
@ -74,10 +74,10 @@ BB* d() { return y; }
|
|||
// Same as 'c' except the vbptr offset is 4, changing the initial GEP and the
|
||||
// final add.
|
||||
// MSVC: @"\01?d@@YAPAUBB@@XZ"() [[NUW:#[0-9]+]] {
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8* {{.*}}, i32 4
|
||||
// MSVC: %[[vbptr_off:.*]] = getelementptr inbounds i8, i8* {{.*}}, i32 4
|
||||
// MSVC: %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i32**
|
||||
// MSVC: %[[vbtable:.*]] = load i32** %[[vbptr]]
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32* {{.*}}, i32 4
|
||||
// MSVC: %[[entry:.*]] = getelementptr inbounds i32, i32* {{.*}}, i32 4
|
||||
// MSVC: %[[offset:.*]] = load i32* %[[entry]]
|
||||
// MSVC: add nsw i32 4, %[[offset]]
|
||||
// MSVC: }
|
||||
|
|
|
@ -16,11 +16,11 @@ typedef __INTPTR_TYPE__ intptr_t;
|
|||
// CHECK: [[N_ADDR:%.+]] = alloca [[INTPTR_T]]
|
||||
// CHECK: store [[INTPTR_T]] %{{.+}}, [[INTPTR_T]]* [[N_ADDR]]
|
||||
// CHECK: [[N_VAL:%.+]] = load [[INTPTR_T]]* [[N_ADDR]]
|
||||
// CHECK: [[CAP_EXPR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE1]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[CAP_EXPR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: store [[INTPTR_T]] [[N_VAL]], [[INTPTR_T]]* [[CAP_EXPR_REF]]
|
||||
// CHECK: [[CAP_BUFFER_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: [[CAP_BUFFER_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: store [[INTPTR_T]]* %{{.+}}, [[INTPTR_T]]** [[CAP_BUFFER_ADDR]]
|
||||
// CHECK: [[CAP_N_REF:%.+]] = getelementptr inbounds [[CAP_TYPE1]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK: [[CAP_N_REF:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK: store [[INTPTR_T]]* [[N_ADDR]], [[INTPTR_T]]** [[CAP_N_REF]]
|
||||
// CHECK: call void [[G_LAMBDA:@.+]]([[CAP_TYPE1]]* [[CAP_ARG]])
|
||||
// CHECK: ret void
|
||||
|
@ -33,9 +33,9 @@ void g(intptr_t n) {
|
|||
|
||||
// CHECK: void [[G_LAMBDA]]([[CAP_TYPE1]]*
|
||||
// CHECK: [[THIS:%.+]] = load [[CAP_TYPE1]]**
|
||||
// CHECK: [[N_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]]* [[THIS]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[N_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[THIS]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[N:%.+]] = load [[INTPTR_T]]* [[N_ADDR]]
|
||||
// CHECK: [[BUFFER_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]]* [[THIS]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: [[BUFFER_ADDR:%.+]] = getelementptr inbounds [[CAP_TYPE1]], [[CAP_TYPE1]]* [[THIS]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: [[BUFFER:%.+]] = load [[INTPTR_T]]** [[BUFFER_ADDR]]
|
||||
// CHECK: call i{{.+}}* @llvm.stacksave()
|
||||
// CHECK: alloca [[INTPTR_T]], [[INTPTR_T]] [[N]]
|
||||
|
@ -84,9 +84,9 @@ int main() {
|
|||
// CHECK: [[SIZE:%.+]] = add
|
||||
// CHECK: call i{{.+}}* @llvm.stacksave()
|
||||
// CHECK: [[BUFFER_ADDR:%.+]] = alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]]
|
||||
// CHECK: [[CAP_SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[CAP_SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: store [[INTPTR_T]] [[SIZE]], [[INTPTR_T]]* [[CAP_SIZE_REF]]
|
||||
// CHECK: [[CAP_BUFFER_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: [[CAP_BUFFER_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: store [[INTPTR_T]]* [[BUFFER_ADDR]], [[INTPTR_T]]** [[CAP_BUFFER_ADDR_REF]]
|
||||
// CHECK: call void [[F_INT_LAMBDA:@.+]]([[CAP_TYPE2]]* [[CAP_ARG]])
|
||||
// CHECK: call void @llvm.stackrestore(
|
||||
|
@ -97,15 +97,15 @@ int main() {
|
|||
// CHECK: [[BUFFER2_ADDR:%.+]] = alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE1]]
|
||||
// CHECK: [[SIZE2:%.+]] = add
|
||||
// CHECK: [[BUFFER1_ADDR:%.+]] = alloca [[INTPTR_T]], [[INTPTR_T]]
|
||||
// CHECK: [[CAP_N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[CAP_N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG:%.+]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: store [[INTPTR_T]]* {{%.+}}, [[INTPTR_T]]** [[CAP_N_ADDR_REF]]
|
||||
// CHECK: [[CAP_SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: [[CAP_SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: store i{{[0-9]+}} [[SIZE2]], i{{[0-9]+}}* [[CAP_SIZE2_REF]]
|
||||
// CHECK: [[CAP_SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK: [[CAP_SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK: store i{{[0-9]+}} [[SIZE1]], i{{[0-9]+}}* [[CAP_SIZE1_REF]]
|
||||
// CHECK: [[CAP_BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 3
|
||||
// CHECK: [[CAP_BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 3
|
||||
// CHECK: store [[INTPTR_T]]* [[BUFFER1_ADDR]], [[INTPTR_T]]** [[CAP_BUFFER1_ADDR_REF]]
|
||||
// CHECK: [[CAP_BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 4
|
||||
// CHECK: [[CAP_BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[CAP_ARG]], i{{.+}} 0, i{{.+}} 4
|
||||
// CHECK: store [[INTPTR_T]]* [[BUFFER2_ADDR]], [[INTPTR_T]]** [[CAP_BUFFER2_ADDR_REF]]
|
||||
// CHECK: call void [[B_INT_LAMBDA:@.+]]([[CAP_TYPE3]]* [[CAP_ARG]])
|
||||
// CHECK: call void @llvm.stackrestore(
|
||||
|
@ -113,7 +113,7 @@ int main() {
|
|||
|
||||
// CHECK: define linkonce_odr void [[F_INT_LAMBDA]]([[CAP_TYPE2]]*
|
||||
// CHECK: [[THIS:%.+]] = load [[CAP_TYPE2]]**
|
||||
// CHECK: [[SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]]* [[THIS]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[SIZE_REF:%.+]] = getelementptr inbounds [[CAP_TYPE2]], [[CAP_TYPE2]]* [[THIS]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[SIZE:%.+]] = load [[INTPTR_T]]* [[SIZE_REF]]
|
||||
// CHECK: call i{{.+}}* @llvm.stacksave()
|
||||
// CHECK: alloca [[INTPTR_T]], [[INTPTR_T]] [[SIZE]]
|
||||
|
@ -121,49 +121,49 @@ int main() {
|
|||
// CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} void [[B_INT_LAMBDA]]([[CAP_TYPE3]]*
|
||||
// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK: [[SIZE2:%.+]] = load i{{[0-9]+}}* [[SIZE2_REF]]
|
||||
// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK: [[SIZE1:%.+]] = load i{{[0-9]+}}* [[SIZE1_REF]]
|
||||
// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR:%.+]] = load [[INTPTR_T]]** [[N_ADDR_REF]]
|
||||
// CHECK: [[N:%.+]] = load [[INTPTR_T]]* [[N_ADDR]]
|
||||
// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[BUFFER1_ADDR:%.+]] = load [[INTPTR_T]]** [[BUFFER1_ADDR_REF]]
|
||||
// CHECK: [[ELEM_OFFSET:%.+]] = mul {{.*}} i{{[0-9]+}} [[N]], [[SIZE1]]
|
||||
// CHECK: [[ELEM_ADDR:%.+]] = getelementptr inbounds [[INTPTR_T]]* [[BUFFER1_ADDR]], i{{[0-9]+}} [[ELEM_OFFSET]]
|
||||
// CHECK: [[ELEM_ADDR:%.+]] = getelementptr inbounds [[INTPTR_T]], [[INTPTR_T]]* [[BUFFER1_ADDR]], i{{[0-9]+}} [[ELEM_OFFSET]]
|
||||
// CHECK: [[SIZEOF:%.+]] = mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[SIZE1]]
|
||||
// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR:%.+]] = load [[INTPTR_T]]** [[N_ADDR_REF]]
|
||||
// CHECK: store [[INTPTR_T]] {{%.+}}, [[INTPTR_T]]* [[N_ADDR]]
|
||||
// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[CAP:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK: [[N_ADDR_ORIG:%.+]] = load [[INTPTR_T]]** [[N_ADDR_REF_ORIG]]
|
||||
// CHECK: store [[INTPTR_T]]* [[N_ADDR_ORIG]], [[INTPTR_T]]** [[N_ADDR_REF]]
|
||||
// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK: store i{{[0-9]+}} [[SIZE1]], i{{[0-9]+}}* [[SIZE1_REF]]
|
||||
// CHECK: [[BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK: [[BUFFER2_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK: [[BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK: [[BUFFER2_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK: [[BUFFER2_ADDR_ORIG:%.+]] = load [[INTPTR_T]]** [[BUFFER2_ADDR_REF_ORIG]]
|
||||
// CHECK: store [[INTPTR_T]]* [[BUFFER2_ADDR_ORIG]], [[INTPTR_T]]** [[BUFFER2_ADDR_REF]]
|
||||
// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: store i{{[0-9]+}} [[SIZE2]], i{{[0-9]+}}* [[SIZE2_REF]]
|
||||
// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK: [[BUFFER1_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[CAP]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK: [[BUFFER1_ADDR_REF_ORIG:%.+]] = getelementptr inbounds [[CAP_TYPE3]], [[CAP_TYPE3]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[BUFFER1_ADDR_ORIG:%.+]] = load [[INTPTR_T]]** [[BUFFER1_ADDR_REF_ORIG]]
|
||||
// CHECK: store [[INTPTR_T]]* [[BUFFER1_ADDR_ORIG]], [[INTPTR_T]]** [[BUFFER1_ADDR_REF]]
|
||||
// CHECK: call void [[B_INT_LAMBDA_LAMBDA:@.+]]([[CAP_TYPE4]]* [[CAP]])
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} void [[B_INT_LAMBDA_LAMBDA]]([[CAP_TYPE4]]*
|
||||
// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK: [[SIZE1_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
|
||||
// CHECK: [[SIZE1:%.+]] = load i{{[0-9]+}}* [[SIZE1_REF]]
|
||||
// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[SIZE2_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
|
||||
// CHECK: [[SIZE2:%.+]] = load i{{[0-9]+}}* [[SIZE2_REF]]
|
||||
// CHECK: [[BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK: [[BUFFER2_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
|
||||
// CHECK: [[BUFFER2_ADDR:%.+]] = load [[INTPTR_T]]** [[BUFFER2_ADDR_REF]]
|
||||
// CHECK: [[SIZEOF_BUFFER2:%.+]] = mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[SIZE1]]
|
||||
// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK: [[BUFFER1_ADDR_REF:%.+]] = getelementptr inbounds [[CAP_TYPE4]], [[CAP_TYPE4]]* [[THIS]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
|
||||
// CHECK: [[BUFFER1_ADDR:%.+]] = load [[INTPTR_T]]** [[BUFFER1_ADDR_REF]]
|
||||
// CHECK: [[MUL:%.+]] = mul {{.*}} i{{[0-9]+}} [[SIZE2]], [[SIZE1]]
|
||||
// CHECK: mul {{.*}} i{{[0-9]+}} {{[0-9]+}}, [[MUL]]
|
||||
|
|
|
@ -39,15 +39,15 @@ void test0(void *array, int n) {
|
|||
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i16** [[REF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = mul nsw i64 1, [[DIM1]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i16* [[T0]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i16* [[T2]], i64 2
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i16, i16* [[T0]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i16, i16* [[T2]], i64 2
|
||||
// CHECK-NEXT: store i16 3, i16* [[T3]]
|
||||
ref[1][2] = 3;
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i16** [[REF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = mul nsw i64 4, [[DIM1]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i16* [[T0]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i16* [[T2]], i64 5
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i16, i16* [[T0]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i16, i16* [[T2]], i64 5
|
||||
// CHECK-NEXT: [[T4:%.*]] = load i16* [[T3]]
|
||||
// CHECK-NEXT: store i16 [[T4]], i16* [[S]], align 2
|
||||
short s = ref[4][5];
|
||||
|
|
|
@ -14,7 +14,7 @@ namespace test0 {
|
|||
// CHECK-LABEL: define void @_ZN5test04testENS_1AE(
|
||||
void test(A t) {
|
||||
// CHECK: [[ARR:%.*]] = load [[A:%.*]]** @_ZN5test05arrayE, align 8
|
||||
// CHECK-NEXT: [[IDX:%.*]] = getelementptr inbounds [[A]]* [[ARR]], i64 0
|
||||
// CHECK-NEXT: [[IDX:%.*]] = getelementptr inbounds [[A]], [[A]]* [[ARR]], i64 0
|
||||
// CHECK-NEXT: [[TMP:%.*]] = call dereferenceable({{[0-9]+}}) [[A]]* @_ZNV5test01AaSERVKS0_([[A]]* [[IDX]], [[A]]* dereferenceable({{[0-9]+}}) [[T:%.*]])
|
||||
// CHECK-NEXT: ret void
|
||||
array[0] = t;
|
||||
|
|
|
@ -28,8 +28,8 @@ void test2(id x) {
|
|||
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
// CHECK-NEXT: [[PARM:%.*]] = call i8* @objc_retain(i8* {{%.*}})
|
||||
// CHECK-NEXT: store i8* [[PARM]], i8** [[X]]
|
||||
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]],
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]])
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[SLOT]],
|
||||
|
@ -48,7 +48,7 @@ void test2(id x) {
|
|||
// CHECK-NEXT: [[SRC:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8**
|
||||
// CHECK-NEXT: [[DST:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[SRC]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[SRC]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[T0]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -56,7 +56,7 @@ void test2(id x) {
|
|||
// CHECK-LABEL: define internal void @__destroy_helper_block_
|
||||
// CHECK: [[T0:%.*]] = load i8**
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[T1]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[T1]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T3:%.*]] = load i8** [[T2]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T3]])
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -111,14 +111,14 @@ void test4(void) {
|
|||
// CHECK-LABEL: define void @test4()
|
||||
// CHECK: [[VAR:%.*]] = alloca [[BYREF_T:%.*]],
|
||||
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 2
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[VAR]], i32 0, i32 2
|
||||
// 0x02000000 - has copy/dispose helpers strong
|
||||
// CHECK-NEXT: store i32 838860800, i32* [[T0]]
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @test4_source()
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]])
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[SLOT]]
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// 0x42800000 - has signature, copy/dispose helpers, as well as BLOCK_HAS_EXTENDED_LAYOUT
|
||||
// CHECK: store i32 -1040187392,
|
||||
// CHECK: [[T0:%.*]] = bitcast [[BYREF_T]]* [[VAR]] to i8*
|
||||
|
@ -131,16 +131,16 @@ void test4(void) {
|
|||
// CHECK: ret void
|
||||
|
||||
// CHECK-LABEL: define internal void @__Block_byref_object_copy_
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: load i8**
|
||||
// CHECK-NEXT: bitcast i8* {{%.*}} to [[BYREF_T]]*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: [[T2:%.*]] = load i8** [[T1]]
|
||||
// CHECK-NEXT: store i8* [[T2]], i8** [[T0]]
|
||||
// CHECK-NEXT: store i8* null, i8** [[T1]]
|
||||
|
||||
// CHECK-LABEL: define internal void @__Block_byref_object_dispose_
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[T0]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]])
|
||||
|
||||
|
@ -173,7 +173,7 @@ void test5(void) {
|
|||
// CHECK-NEXT: call void @objc_release(i8* [[T1]])
|
||||
// 0x40800000 - has signature but no copy/dispose, as well as BLOCK_HAS_EXTENDED_LAYOUT
|
||||
// CHECK: store i32 -1073741824, i32*
|
||||
// CHECK: [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[VAR]]
|
||||
// CHECK-NEXT: store i8* [[T0]], i8** [[CAPTURE]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[BLOCK_T]]* [[BLOCK]] to
|
||||
|
@ -190,15 +190,15 @@ void test6(void) {
|
|||
// CHECK-LABEL: define void @test6()
|
||||
// CHECK: [[VAR:%.*]] = alloca [[BYREF_T:%.*]],
|
||||
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 2
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[VAR]], i32 0, i32 2
|
||||
// 0x02000000 - has copy/dispose helpers weak
|
||||
// CHECK-NEXT: store i32 1107296256, i32* [[T0]]
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @test6_source()
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]])
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[SLOT]], i8* [[T1]])
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]])
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[VAR]], i32 0, i32 6
|
||||
// 0x42800000 - has signature, copy/dispose helpers, as well as BLOCK_HAS_EXTENDED_LAYOUT
|
||||
// CHECK: store i32 -1040187392,
|
||||
// CHECK: [[T0:%.*]] = bitcast [[BYREF_T]]* [[VAR]] to i8*
|
||||
|
@ -210,14 +210,14 @@ void test6(void) {
|
|||
// CHECK: ret void
|
||||
|
||||
// CHECK-LABEL: define internal void @__Block_byref_object_copy_
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: load i8**
|
||||
// CHECK-NEXT: bitcast i8* {{%.*}} to [[BYREF_T]]*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: call void @objc_moveWeak(i8** [[T0]], i8** [[T1]])
|
||||
|
||||
// CHECK-LABEL: define internal void @__Block_byref_object_dispose_
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* {{%.*}}, i32 0, i32 6
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]])
|
||||
|
||||
// CHECK-LABEL: define internal void @__test6_block_invoke
|
||||
|
@ -250,7 +250,7 @@ void test7(void) {
|
|||
// CHECK-NEXT: call void @objc_release(i8* [[T1]])
|
||||
// 0x42800000 - has signature, copy/dispose helpers, as well as BLOCK_HAS_EXTENDED_LAYOUT
|
||||
// CHECK: store i32 -1040187392,
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_loadWeakRetained(i8** [[VAR]])
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[SLOT]], i8* [[T0]])
|
||||
// CHECK: call void @test7_helper(
|
||||
|
@ -259,7 +259,7 @@ void test7(void) {
|
|||
// CHECK: ret void
|
||||
|
||||
// CHECK-LABEL: define internal void @__test7_block_invoke
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]]* {{%.*}}, i32 0, i32 5
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* {{%.*}}, i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_loadWeakRetained(i8** [[SLOT]])
|
||||
// CHECK-NEXT: call void @test7_consume(i8* [[T0]])
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]])
|
||||
|
@ -284,8 +284,8 @@ void test7(void) {
|
|||
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
// CHECK: store
|
||||
// CHECK-NEXT: store
|
||||
// CHECK: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = load [[TEST8]]** [[SELF]],
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST8]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]])
|
||||
|
@ -332,23 +332,23 @@ void test10a(void) {
|
|||
// CHECK: [[BYREF:%.*]] = alloca [[BYREF_T:%.*]],
|
||||
|
||||
// Zero-initialization before running the initializer.
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK-NEXT: store void ()* null, void ()** [[T0]], align 8
|
||||
|
||||
// Run the initializer as an assignment.
|
||||
// CHECK: [[T0:%.*]] = bitcast void ()* {{%.*}} to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainBlock(i8* [[T0]])
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to void ()*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [[BYREF_T]]* [[BYREF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[BYREF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T4:%.*]] = load [[BYREF_T]]** [[T3]]
|
||||
// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [[BYREF_T]]* [[T4]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[T4]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T6:%.*]] = load void ()** [[T5]], align 8
|
||||
// CHECK-NEXT: store void ()* {{%.*}}, void ()** [[T5]], align 8
|
||||
// CHECK-NEXT: [[T7:%.*]] = bitcast void ()* [[T6]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T7]])
|
||||
|
||||
// Destroy at end of function.
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[BYREF_T]]* [[BYREF]] to i8*
|
||||
// CHECK-NEXT: call void @_Block_object_dispose(i8* [[T0]], i32 8)
|
||||
// CHECK-NEXT: [[T1:%.*]] = load void ()** [[SLOT]]
|
||||
|
@ -365,10 +365,10 @@ void test10a(void) {
|
|||
// CHECK-LABEL: define internal void @__Block_byref_object_copy
|
||||
// CHECK: [[D0:%.*]] = load i8** {{%.*}}
|
||||
// CHECK-NEXT: [[D1:%.*]] = bitcast i8* [[D0]] to [[BYREF_T]]*
|
||||
// CHECK-NEXT: [[D2:%.*]] = getelementptr inbounds [[BYREF_T]]* [[D1]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[D2:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[D1]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[S0:%.*]] = load i8** {{%.*}}
|
||||
// CHECK-NEXT: [[S1:%.*]] = bitcast i8* [[S0]] to [[BYREF_T]]*
|
||||
// CHECK-NEXT: [[S2:%.*]] = getelementptr inbounds [[BYREF_T]]* [[S1]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[S2:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[S1]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T0:%.*]] = load void ()** [[S2]], align 8
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast void ()* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retainBlock(i8* [[T1]])
|
||||
|
@ -379,7 +379,7 @@ void test10a(void) {
|
|||
// CHECK-LABEL: define internal void @__Block_byref_object_dispose
|
||||
// CHECK: [[T0:%.*]] = load i8** {{%.*}}
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[BYREF_T]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[BYREF_T]]* [[T1]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[T1]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T3:%.*]] = load void ()** [[T2]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast void ()* [[T3]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T4]])
|
||||
|
@ -395,18 +395,18 @@ void test10b(void) {
|
|||
// CHECK: [[BYREF:%.*]] = alloca [[BYREF_T:%.*]],
|
||||
|
||||
// Zero-initialize.
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK-NEXT: store void ()* null, void ()** [[T0]], align 8
|
||||
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[BYREF]], i32 0, i32 6
|
||||
|
||||
// The assignment.
|
||||
// CHECK: [[T0:%.*]] = bitcast void ()* {{%.*}} to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainBlock(i8* [[T0]])
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to void ()*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [[BYREF_T]]* [[BYREF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[BYREF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T4:%.*]] = load [[BYREF_T]]** [[T3]]
|
||||
// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [[BYREF_T]]* [[T4]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [[BYREF_T]], [[BYREF_T]]* [[T4]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[T6:%.*]] = load void ()** [[T5]], align 8
|
||||
// CHECK-NEXT: store void ()* {{%.*}}, void ()** [[T5]], align 8
|
||||
// CHECK-NEXT: [[T7:%.*]] = bitcast void ()* [[T6]] to i8*
|
||||
|
@ -494,14 +494,14 @@ void test13(id x) {
|
|||
// CHECK-NEXT: [[CLEANUP_ACTIVE:%.*]] = alloca i1
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_retain(i8* {{%.*}})
|
||||
// CHECK-NEXT: store i8* [[T0]], i8** [[X]], align 8
|
||||
// CHECK-NEXT: [[CLEANUP_ADDR:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[CLEANUP_ADDR:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]], align 8
|
||||
// CHECK-NEXT: [[T1:%.*]] = icmp ne i8* [[T0]], null
|
||||
// CHECK-NEXT: store i1 false, i1* [[CLEANUP_ACTIVE]]
|
||||
// CHECK-NEXT: br i1 [[T1]],
|
||||
|
||||
// CHECK-NOT: br
|
||||
// CHECK: [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]], align 8
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]])
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[CAPTURE]], align 8
|
||||
|
@ -550,7 +550,7 @@ void test16() {
|
|||
// CHECK-LABEL: define void @test16(
|
||||
// CHECK: [[BLKVAR:%.*]] = alloca void ()*, align 8
|
||||
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: store void ()* null, void ()** [[BLKVAR]], align 8
|
||||
}
|
||||
|
||||
|
@ -576,10 +576,10 @@ id (^test17(id self, int which))(void) {
|
|||
// CHECK-NEXT: store i8* [[T0]], i8** [[SELF]], align
|
||||
// CHECK-NOT: objc_retain
|
||||
// CHECK-NOT: objc_release
|
||||
// CHECK: [[DESTROY:%.*]] = getelementptr inbounds [[BLOCK]]* [[B0]], i32 0, i32 5
|
||||
// CHECK: [[DESTROY:%.*]] = getelementptr inbounds [[BLOCK]], [[BLOCK]]* [[B0]], i32 0, i32 5
|
||||
// CHECK-NOT: objc_retain
|
||||
// CHECK-NOT: objc_release
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK]]* [[B0]], i32 0, i32 5
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK]], [[BLOCK]]* [[B0]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[SELF]], align
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]])
|
||||
// CHECK-NEXT: store i8* [[T2]], i8** [[T0]],
|
||||
|
@ -594,10 +594,10 @@ id (^test17(id self, int which))(void) {
|
|||
// CHECK-NEXT: br label
|
||||
// CHECK-NOT: objc_retain
|
||||
// CHECK-NOT: objc_release
|
||||
// CHECK: [[DESTROY:%.*]] = getelementptr inbounds [[BLOCK]]* [[B1]], i32 0, i32 5
|
||||
// CHECK: [[DESTROY:%.*]] = getelementptr inbounds [[BLOCK]], [[BLOCK]]* [[B1]], i32 0, i32 5
|
||||
// CHECK-NOT: objc_retain
|
||||
// CHECK-NOT: objc_release
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK]]* [[B1]], i32 0, i32 5
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[BLOCK]], [[BLOCK]]* [[B1]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[SELF]], align
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]])
|
||||
// CHECK-NEXT: store i8* [[T2]], i8** [[T0]],
|
||||
|
@ -617,8 +617,8 @@ void test18(id x) {
|
|||
// CHECK-UNOPT-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
// CHECK-UNOPT-NEXT: store i8* null, i8** [[X]]
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X]],
|
||||
// CHECK-UNOPT-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-UNOPT: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-UNOPT: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T0:%.*]] = load i8** [[X]],
|
||||
// CHECK-UNOPT-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]])
|
||||
// CHECK-UNOPT-NEXT: store i8* [[T1]], i8** [[SLOT]],
|
||||
|
@ -635,8 +635,8 @@ void test18(id x) {
|
|||
// CHECK-UNOPT-NEXT: [[SRC:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-UNOPT-NEXT: [[T0:%.*]] = load i8**
|
||||
// CHECK-UNOPT-NEXT: [[DST:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-UNOPT-NEXT: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[SRC]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T1:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[DST]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[SRC]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T1:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[DST]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T2:%.*]] = load i8** [[T0]]
|
||||
// CHECK-UNOPT-NEXT: store i8* null, i8** [[T1]]
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[T1]], i8* [[T2]]) [[NUW]]
|
||||
|
@ -645,7 +645,7 @@ void test18(id x) {
|
|||
// CHECK-UNOPT-LABEL: define internal void @__destroy_helper_block_
|
||||
// CHECK-UNOPT: [[T0:%.*]] = load i8**
|
||||
// CHECK-UNOPT-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-UNOPT-NEXT: [[T2:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[T1]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T2:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[T1]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null)
|
||||
// CHECK-UNOPT-NEXT: ret void
|
||||
}
|
||||
|
@ -663,8 +663,8 @@ void test19(void (^b)(void)) {
|
|||
// CHECK-NEXT: store void ()* [[T2]], void ()** [[B]]
|
||||
|
||||
// Block setup. We skip most of this. Note the bare retain.
|
||||
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T0:%.*]] = load void ()** [[B]],
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast void ()* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]])
|
||||
|
|
|
@ -54,14 +54,14 @@ void test0(NSArray *array) {
|
|||
// CHECK-LP64-NEXT: [[T0:%.*]] = icmp eq i64 [[SIZE]], 0
|
||||
// CHECK-LP64-NEXT: br i1 [[T0]]
|
||||
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[STATE_T]]* [[STATE]], i32 0, i32 1
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[STATE_T]], [[STATE_T]]* [[STATE]], i32 0, i32 1
|
||||
// CHECK-LP64-NEXT: [[T1:%.*]] = load i8*** [[T0]]
|
||||
// CHECK-LP64-NEXT: [[T2:%.*]] = getelementptr i8** [[T1]], i64
|
||||
// CHECK-LP64-NEXT: [[T2:%.*]] = getelementptr i8*, i8** [[T1]], i64
|
||||
// CHECK-LP64-NEXT: [[T3:%.*]] = load i8** [[T2]]
|
||||
// CHECK-LP64-NEXT: store i8* [[T3]], i8** [[X]]
|
||||
|
||||
// CHECK-LP64: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64-NEXT: [[T1:%.*]] = load i8** [[X]]
|
||||
// CHECK-LP64-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]])
|
||||
// CHECK-LP64-NEXT: store i8* [[T2]], i8** [[T0]]
|
||||
|
@ -85,7 +85,7 @@ void test0(NSArray *array) {
|
|||
// CHECK-LP64-LABEL: define internal void @__test0_block_invoke
|
||||
// CHECK-LP64: [[BLOCK:%.*]] = bitcast i8* {{%.*}} to [[BLOCK_T]]*
|
||||
// CHECK-LP64-NOT: ret
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64-NEXT: [[T2:%.*]] = load i8** [[T0]], align 8
|
||||
// CHECK-LP64-NEXT: call void @use(i8* [[T2]])
|
||||
|
||||
|
@ -102,14 +102,14 @@ void test1(NSArray *array) {
|
|||
// CHECK-LP64-NEXT: alloca [16 x i8*], align 8
|
||||
// CHECK-LP64-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
|
||||
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[STATE_T]]* [[STATE]], i32 0, i32 1
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[STATE_T]], [[STATE_T]]* [[STATE]], i32 0, i32 1
|
||||
// CHECK-LP64-NEXT: [[T1:%.*]] = load i8*** [[T0]]
|
||||
// CHECK-LP64-NEXT: [[T2:%.*]] = getelementptr i8** [[T1]], i64
|
||||
// CHECK-LP64-NEXT: [[T2:%.*]] = getelementptr i8*, i8** [[T1]], i64
|
||||
// CHECK-LP64-NEXT: [[T3:%.*]] = load i8** [[T2]]
|
||||
// CHECK-LP64-NEXT: call i8* @objc_initWeak(i8** [[X]], i8* [[T3]])
|
||||
|
||||
// CHECK-LP64: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
|
||||
// CHECK-LP64-NEXT: [[T1:%.*]] = call i8* @objc_loadWeakRetained(i8** [[X]])
|
||||
// CHECK-LP64-NEXT: call i8* @objc_initWeak(i8** [[T0]], i8* [[T1]])
|
||||
// CHECK-LP64-NEXT: call void @objc_release(i8* [[T1]])
|
||||
|
|
|
@ -43,10 +43,10 @@ void test_array(id a, id b) {
|
|||
// CHECK: call i8* @objc_retain(i8*
|
||||
|
||||
// Constructing the array
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [2 x i8*]* [[OBJECTS:%[A-Za-z0-9]+]], i32 0, i32 0
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS:%[A-Za-z0-9]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[V0:%.*]] = load i8** [[A]],
|
||||
// CHECK-NEXT: store i8* [[V0]], i8** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[V1:%.*]] = load i8** [[B]],
|
||||
// CHECK-NEXT: store i8* [[V1]], i8** [[T0]]
|
||||
|
||||
|
@ -79,16 +79,16 @@ void test_dictionary(id k1, id o1, id k2, id o2) {
|
|||
// CHECK: call i8* @objc_retain(i8*
|
||||
|
||||
// Constructing the arrays
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [2 x i8*]* [[KEYS:%[A-Za-z0-9]+]], i32 0, i32 0
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[KEYS:%[A-Za-z0-9]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[V0:%.*]] = load i8** [[K1]],
|
||||
// CHECK-NEXT: store i8* [[V0]], i8** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*]* [[OBJECTS:%[A-Za-z0-9]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS:%[A-Za-z0-9]+]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[V1:%.*]] = load i8** [[O1]],
|
||||
// CHECK-NEXT: store i8* [[V1]], i8** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*]* [[KEYS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[KEYS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[V2:%.*]] = load i8** [[K2]],
|
||||
// CHECK-NEXT: store i8* [[V2]], i8** [[T0]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[V3:%.*]] = load i8** [[O2]],
|
||||
// CHECK-NEXT: store i8* [[V3]], i8** [[T0]]
|
||||
|
||||
|
@ -124,7 +124,7 @@ void test_property(B *b) {
|
|||
// Retain parameter
|
||||
// CHECK: call i8* @objc_retain
|
||||
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [1 x i8*]* [[OBJECTS:%.*]], i32 0, i32 0
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[OBJECTS:%.*]], i32 0, i32 0
|
||||
|
||||
// Invoke 'prop'
|
||||
// CHECK: [[SEL:%.*]] = load i8** @OBJC_SELECTOR_REFERENCES
|
||||
|
|
|
@ -135,7 +135,7 @@ void test2(Test2 *x) {
|
|||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST2]]** [[X]],
|
||||
// CHECK-NEXT: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test2.ivar"
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST2]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8* [[T1]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8, i8* [[T1]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to i8**
|
||||
// CHECK-NEXT: [[T4:%.*]] = load i8** [[T3]],
|
||||
// CHECK-NEXT: store i8* null, i8** [[T3]],
|
||||
|
|
|
@ -25,7 +25,7 @@ struct S1 { Class isa; };
|
|||
// CHECK: define internal [[S1:%.*]]* @"\01-[Test1 pointer]"(
|
||||
// CHECK: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test1.pointer"
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST1:%.*]]* {{%.*}} to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to [[S1]]**
|
||||
// CHECK-NEXT: [[T3:%.*]] = load [[S1]]** [[T2]], align 8
|
||||
// CHECK-NEXT: ret [[S1]]* [[T3]]
|
||||
|
@ -60,7 +60,7 @@ static Class theGlobalClass;
|
|||
// CHECK-NEXT: [[T1:%.*]] = load [[TEST2:%.*]]**
|
||||
// CHECK-NEXT: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test2._theClass"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST2]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T4]], i8* [[T0]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -81,7 +81,7 @@ static Class theGlobalClass;
|
|||
// CHECK: [[T0:%.*]] = load [[TEST2]]**
|
||||
// CHECK-NEXT: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test2._theClass"
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST2]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8* [[T1]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8, i8* [[T1]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T3]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
void test19() {
|
||||
__block id x;
|
||||
// CHECK-UNOPT-LABEL: define internal void @__Block_byref_object_copy
|
||||
// CHECK-UNOPT: [[X:%.*]] = getelementptr inbounds [[BYREF_T:%.*]]* [[VAR:%.*]], i32 0, i32 6
|
||||
// CHECK-UNOPT: [[X2:%.*]] = getelementptr inbounds [[BYREF_T:%.*]]* [[VAR1:%.*]], i32 0, i32 6
|
||||
// CHECK-UNOPT: [[X:%.*]] = getelementptr inbounds [[BYREF_T:%.*]], [[BYREF_T:%.*]]* [[VAR:%.*]], i32 0, i32 6
|
||||
// CHECK-UNOPT: [[X2:%.*]] = getelementptr inbounds [[BYREF_T:%.*]], [[BYREF_T:%.*]]* [[VAR1:%.*]], i32 0, i32 6
|
||||
// CHECK-UNOPT-NEXT: [[SIX:%.*]] = load i8** [[X2]], align 8
|
||||
// CHECK-UNOPT-NEXT: store i8* null, i8** [[X]], align 8
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X]], i8* [[SIX]]) [[NUW:#[0-9]+]]
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
// CHECK-NEXT: [[T0:%.*]] = load [[WPT]]** [[SELF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_WeakPropertyTest.PROP"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[WPT]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: [[T5:%.*]] = call i8* @objc_loadWeakRetained(i8** [[T4]])
|
||||
// CHECK-NEXT: [[T6:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[T5]])
|
||||
|
@ -36,7 +36,7 @@
|
|||
// CHECK-NEXT: [[T0:%.*]] = load [[WPT]]** [[SELF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_WeakPropertyTest.PROP"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[WPT]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: call i8* @objc_storeWeak(i8** [[T4]], i8* [[V]])
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -49,7 +49,7 @@
|
|||
// CHECK-NEXT: [[T0:%.*]] = load [[WPT]]** [[SELF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_WeakPropertyTest.PROP"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[WPT]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T4]])
|
||||
// CHECK-NEXT: ret void
|
||||
|
|
|
@ -374,7 +374,7 @@ void test13(void) {
|
|||
extern fnty ^test13_block;
|
||||
// CHECK-NEXT: [[TMP:%.*]] = load void (i8*)** @test13_block, align
|
||||
// CHECK-NEXT: [[BLOCK:%.*]] = bitcast void (i8*)* [[TMP]] to [[BLOCKTY:%.*]]*
|
||||
// CHECK-NEXT: [[BLOCK_FN_PTR:%.*]] = getelementptr inbounds [[BLOCKTY]]* [[BLOCK]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[BLOCK_FN_PTR:%.*]] = getelementptr inbounds [[BLOCKTY]], [[BLOCKTY]]* [[BLOCK]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[BLOCK_OPAQUE:%.*]] = bitcast [[BLOCKTY]]* [[BLOCK]] to i8*
|
||||
// CHECK-NEXT: [[X_VAL:%.*]] = load i8** [[X]], align
|
||||
// CHECK-NEXT: [[X_TMP:%.*]] = call i8* @objc_retain(i8* [[X_VAL]]) [[NUW]]
|
||||
|
@ -432,14 +432,14 @@ void test13(void) {
|
|||
// Destroy y.
|
||||
// CHECK-NEXT: [[Y_OFF:%.*]] = load i64* @"OBJC_IVAR_$_Test16.y"
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST16]]* [[BASE]] to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[Y_OFF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[Y_OFF]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null) [[NUW]]
|
||||
|
||||
// Destroy z.
|
||||
// CHECK-NEXT: [[Z_OFF:%.*]] = load i64* @"OBJC_IVAR_$_Test16.z"
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST16]]* [[BASE]] to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[Z_OFF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[Z_OFF]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null) [[NUW]]
|
||||
|
||||
|
@ -470,17 +470,17 @@ void test19() {
|
|||
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i8* @test19_helper()
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[CALL]]) [[NUW]]
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [5 x i8*]* [[X]], i32 0, i64 2
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[X]], i32 0, i64 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[SLOT]]
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[SLOT]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]]
|
||||
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x i8*]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 5
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8*, i8** [[BEGIN]], i64 5
|
||||
// CHECK-NEXT: br label
|
||||
|
||||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8*, i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[CUR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[EQ:%.*]] = icmp eq i8** [[CUR]], [[BEGIN]]
|
||||
|
@ -514,12 +514,12 @@ void test20(unsigned n) {
|
|||
// CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[T0]], i8 0, i64 [[T1]], i32 8, i1 false)
|
||||
|
||||
// Destroy.
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8** [[VLA]], i64 [[DIM]]
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8*, i8** [[VLA]], i64 [[DIM]]
|
||||
// CHECK-NEXT: [[EMPTY:%.*]] = icmp eq i8** [[VLA]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[EMPTY]]
|
||||
|
||||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8*, i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[CUR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[EQ:%.*]] = icmp eq i8** [[CUR]], [[VLA]]
|
||||
|
@ -558,14 +558,14 @@ void test21(unsigned n) {
|
|||
|
||||
// Destroy.
|
||||
// CHECK-NEXT: [[T0:%.*]] = mul nuw i64 2, [[DIM]]
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [3 x i8*]* [[VLA]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[VLA]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[T1:%.*]] = mul nuw i64 [[T0]], 3
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8*, i8** [[BEGIN]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[EMPTY:%.*]] = icmp eq i8** [[BEGIN]], [[END]]
|
||||
// CHECK-NEXT: br i1 [[EMPTY]]
|
||||
|
||||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8*, i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[CUR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[EQ:%.*]] = icmp eq i8** [[CUR]], [[BEGIN]]
|
||||
|
@ -596,13 +596,13 @@ void test21(unsigned n) {
|
|||
// CHECK: [[SELF:%.*]] = load [[TEST26:%.*]]**
|
||||
// CHECK-NEXT: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test26.x"
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST26]]* [[SELF]] to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[X:%.*]] = bitcast i8* [[T1]] to [4 x i8*]*
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [4 x i8*]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 4
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8*, i8** [[BEGIN]], i64 4
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[PAST:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR]] = getelementptr inbounds i8** [[PAST]], i64 -1
|
||||
// CHECK-NEXT: [[CUR]] = getelementptr inbounds i8*, i8** [[PAST]], i64 -1
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[CUR]], i8* null)
|
||||
// CHECK-NEXT: [[ISDONE:%.*]] = icmp eq i8** [[CUR]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[ISDONE]],
|
||||
|
@ -644,7 +644,7 @@ void test21(unsigned n) {
|
|||
// CHECK: [[SELF:%.*]] = load [[TEST28:%.*]]**
|
||||
// CHECK-NEXT: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test28.prop"
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST28]]* [[SELF]] to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null)
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -791,7 +791,7 @@ char *helper;
|
|||
// CHECK-NEXT: [[T1:%.*]] = load [[TEST30]]** [[SELF]]
|
||||
// CHECK-NEXT: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_Test30.helper"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST30]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[IVAR]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[IVAR]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT#: [[T5:%.*]] = load i8** [[T4]]
|
||||
// CHECK-NEXT#: [[T6:%.*]] = call i8* @objc_retain(i8* [[T0]])
|
||||
|
@ -1213,7 +1213,7 @@ void test56_test(void) {
|
|||
// CHECK: [[T0:%.*]] = load [[TEST57:%.*]]** {{%.*}}
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_Test57.strong"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST57]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: [[T5:%.*]] = load i8** [[T4]]
|
||||
// CHECK-NEXT: ret i8* [[T5]]
|
||||
|
@ -1222,7 +1222,7 @@ void test56_test(void) {
|
|||
// CHECK: [[T0:%.*]] = load [[TEST57]]** {{%.*}}
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_Test57.weak"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST57]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: [[T5:%.*]] = call i8* @objc_loadWeakRetained(i8** [[T4]])
|
||||
// CHECK-NEXT: [[T6:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[T5]])
|
||||
|
@ -1232,7 +1232,7 @@ void test56_test(void) {
|
|||
// CHECK: [[T0:%.*]] = load [[TEST57]]** {{%.*}}
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_Test57.unsafe"
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST57]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8, i8* [[T2]], i64 [[T1]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: [[T5:%.*]] = load i8** [[T4]]
|
||||
// CHECK-NEXT: ret i8* [[T5]]
|
||||
|
|
|
@ -5,13 +5,13 @@ void MYFUNC() {
|
|||
// CHECK-LABEL: define void @MYFUNC()
|
||||
// CHECK: [[OBSERVER_SLOT:%.*]] = alloca [[OBSERVER_T:%.*]], align 8
|
||||
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[OBSERVER_T]]* [[OBSERVER_SLOT]], i32 0, i32 1
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[OBSERVER_T]], [[OBSERVER_T]]* [[OBSERVER_SLOT]], i32 0, i32 1
|
||||
// CHECK: store [[OBSERVER_T]]* [[OBSERVER_SLOT]], [[OBSERVER_T]]** [[T0]]
|
||||
|
||||
// CHECK: [[T1:%.*]] = bitcast i8* ()*
|
||||
// CHECK: [[FORWARDING:%.*]] = getelementptr inbounds [[OBSERVER_T]]* [[OBSERVER_SLOT]], i32 0, i32 1
|
||||
// CHECK: [[FORWARDING:%.*]] = getelementptr inbounds [[OBSERVER_T]], [[OBSERVER_T]]* [[OBSERVER_SLOT]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[OBSERVER_T]]** [[FORWARDING]]
|
||||
// CHECK-NEXT: [[OBSERVER:%.*]] = getelementptr inbounds [[OBSERVER_T]]* [[T0]], i32 0, i32 6
|
||||
// CHECK-NEXT: [[OBSERVER:%.*]] = getelementptr inbounds [[OBSERVER_T]], [[OBSERVER_T]]* [[T0]], i32 0, i32 6
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[OBSERVER]]
|
||||
__block id observer = ^{ return observer; };
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ void test1() {
|
|||
extern void test1_help(void (^x)(void));
|
||||
|
||||
// CHECK: [[N:%.*]] = alloca [[N_T:%.*]], align 8
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[N_T]]* [[N]], i32 0, i32 4
|
||||
// CHECK: [[T0:%.*]] = getelementptr inbounds [[N_T]], [[N_T]]* [[N]], i32 0, i32 4
|
||||
// CHECK-NEXT: store double 1.000000e+{{0?}}01, double* [[T0]], align 8
|
||||
__block double n = 10;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue