Changeset View
Changeset View
Standalone View
Standalone View
test/OpenMP/parallel_private_codegen.cpp
Show All 32 Lines | #pragma omp parallel private(t_var, vec, s_arr, var) | ||||
{ | { | ||||
vec[0] = t_var; | vec[0] = t_var; | ||||
s_arr[0] = var; | s_arr[0] = var; | ||||
} | } | ||||
return T(); | return T(); | ||||
} | } | ||||
int main() { | int main() { | ||||
static int sivar; | |||||
#ifdef LAMBDA | #ifdef LAMBDA | ||||
// LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212, | // LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212, | ||||
// LAMBDA-LABEL: @main | // LAMBDA-LABEL: @main | ||||
// LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]]( | // LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]]( | ||||
[&]() { | [&]() { | ||||
// LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]]( | // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]]( | ||||
// LAMBDA-NOT: = getelementptr inbounds %{{.+}}, | // LAMBDA-NOT: = getelementptr inbounds %{{.+}}, | ||||
// LAMBDA: [[ARG:%.+]] = bitcast %{{.+}}* %{{.+}} to i8* | // LAMBDA: [[ARG:%.+]] = bitcast %{{.+}}* %{{.+}} to i8* | ||||
// LAMBDA: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8* [[ARG]]) | // LAMBDA: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8* [[ARG]]) | ||||
#pragma omp parallel private(g) | #pragma omp parallel private(g, sivar) | ||||
{ | { | ||||
// LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, %{{.+}}* [[ARG:%.+]]) | // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, %{{.+}}* [[ARG:%.+]]) | ||||
// LAMBDA: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, | // LAMBDA: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, | ||||
// LAMBDA: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, | |||||
// LAMBDA: store %{{.+}}* [[ARG]], %{{.+}}** [[ARG_REF:%.+]], | // LAMBDA: store %{{.+}}* [[ARG]], %{{.+}}** [[ARG_REF:%.+]], | ||||
g = 1; | g = 1; | ||||
sivar = 2; | |||||
// LAMBDA: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], | // LAMBDA: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], | ||||
// LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]], | |||||
// LAMBDA: [[G_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 | // LAMBDA: [[G_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 | ||||
// LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]] | // LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]] | ||||
// LAMBDA: [[SIVAR_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 | |||||
// LAMBDA: store i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]], i{{[0-9]+}}** [[SIVAR_PRIVATE_ADDR_REF]] | |||||
// LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]]) | // LAMBDA: call{{.*}} void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]]) | ||||
[&]() { | [&]() { | ||||
// LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]]) | // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]]) | ||||
// LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]], | // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]], | ||||
g = 2; | g = 2; | ||||
sivar = 4; | |||||
// LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]] | // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]] | ||||
// LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 | // LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 | ||||
// LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]] | // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]] | ||||
// LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]] | // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]] | ||||
// LAMBDA: [[SIVAR_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 | |||||
// LAMBDA: [[SIVAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_PTR_REF]] | |||||
// LAMBDA: store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIVAR_REF]] | |||||
}(); | }(); | ||||
} | } | ||||
}(); | }(); | ||||
return 0; | return 0; | ||||
#elif defined(BLOCKS) | #elif defined(BLOCKS) | ||||
// BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212, | // BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212, | ||||
// BLOCKS-LABEL: @main | // BLOCKS-LABEL: @main | ||||
// BLOCKS: call{{.*}} void {{%.+}}(i8 | // BLOCKS: call{{.*}} void {{%.+}}(i8 | ||||
^{ | ^{ | ||||
// BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8* | // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8* | ||||
// BLOCKS-NOT: = getelementptr inbounds %{{.+}}, | // BLOCKS-NOT: = getelementptr inbounds %{{.+}}, | ||||
// BLOCKS: [[ARG:%.+]] = bitcast %{{.+}}* %{{.+}} to i8* | // BLOCKS: [[ARG:%.+]] = bitcast %{{.+}}* %{{.+}} to i8* | ||||
// BLOCKS: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8* [[ARG]]) | // BLOCKS: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i8* [[ARG]]) | ||||
#pragma omp parallel private(g) | #pragma omp parallel private(g, sivar) | ||||
{ | { | ||||
// BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, %{{.+}}* [[ARG:%.+]]) | // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* %{{.+}}, i32* %{{.+}}, %{{.+}}* [[ARG:%.+]]) | ||||
// BLOCKS: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, | // BLOCKS: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, | ||||
// BLOCKS: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}}, | |||||
// BLOCKS: store %{{.+}}* [[ARG]], %{{.+}}** [[ARG_REF:%.+]], | // BLOCKS: store %{{.+}}* [[ARG]], %{{.+}}** [[ARG_REF:%.+]], | ||||
g = 1; | g = 1; | ||||
sivar = 20; | |||||
// BLOCKS: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], | // BLOCKS: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], | ||||
// BLOCKS: store i{{[0-9]+}} 20, i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]], | |||||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}} | // BLOCKS-NOT: [[G]]{{[[^:word:]]}} | ||||
// BLOCKS: i{{[0-9]+}}* [[G_PRIVATE_ADDR]] | // BLOCKS: i{{[0-9]+}}* [[G_PRIVATE_ADDR]] | ||||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}} | // BLOCKS-NOT: [[G]]{{[[^:word:]]}} | ||||
// BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}} | |||||
// BLOCKS: i{{[0-9]+}}* [[SIVAR_PRIVATE_ADDR]] | |||||
// BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}} | |||||
// BLOCKS: call{{.*}} void {{%.+}}(i8 | // BLOCKS: call{{.*}} void {{%.+}}(i8 | ||||
^{ | ^{ | ||||
// BLOCKS: define {{.+}} void {{@.+}}(i8* | // BLOCKS: define {{.+}} void {{@.+}}(i8* | ||||
g = 2; | g = 2; | ||||
sivar = 40; | |||||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}} | // BLOCKS-NOT: [[G]]{{[[^:word:]]}} | ||||
// BLOCKS: store i{{[0-9]+}} 2, i{{[0-9]+}}* | // BLOCKS: store i{{[0-9]+}} 2, i{{[0-9]+}}* | ||||
// BLOCKS-NOT: [[G]]{{[[^:word:]]}} | // BLOCKS-NOT: [[G]]{{[[^:word:]]}} | ||||
// BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}} | |||||
// BLOCKS: store i{{[0-9]+}} 40, i{{[0-9]+}}* | |||||
// BLOCKS-NOT: [[SIVAR]]{{[[^:word:]]}} | |||||
// BLOCKS: ret | // BLOCKS: ret | ||||
}(); | }(); | ||||
} | } | ||||
}(); | }(); | ||||
return 0; | return 0; | ||||
#else | #else | ||||
S<float> test; | S<float> test; | ||||
int t_var = 0; | int t_var = 0; | ||||
int vec[] = {1, 2}; | int vec[] = {1, 2}; | ||||
S<float> s_arr[] = {1, 2}; | S<float> s_arr[] = {1, 2}; | ||||
S<float> var(3); | S<float> var(3); | ||||
#pragma omp parallel private(t_var, vec, s_arr, var) | #pragma omp parallel private(t_var, vec, s_arr, var, sivar) | ||||
{ | { | ||||
vec[0] = t_var; | vec[0] = t_var; | ||||
s_arr[0] = var; | s_arr[0] = var; | ||||
sivar = 3; | |||||
} | } | ||||
return tmain<int>(); | return tmain<int>(); | ||||
#endif | #endif | ||||
} | } | ||||
// CHECK: define i{{[0-9]+}} @main() | // CHECK: define i{{[0-9]+}} @main() | ||||
// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]], | // CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]], | ||||
// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]]) | // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]]) | ||||
// CHECK: %{{.+}} = bitcast [[CAP_MAIN_TY]]* | // CHECK: %{{.+}} = bitcast [[CAP_MAIN_TY]]* | ||||
// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[CAP_MAIN_TY]]*)* [[MAIN_MICROTASK:@.+]] to void | // CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[CAP_MAIN_TY]]*)* [[MAIN_MICROTASK:@.+]] to void | ||||
// CHECK: = call i{{.+}} [[TMAIN_INT:@.+]]() | // CHECK: = call i{{.+}} [[TMAIN_INT:@.+]]() | ||||
// CHECK: call void [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]* | // CHECK: call void [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]* | ||||
// CHECK: ret | // CHECK: ret | ||||
// | // | ||||
// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_MAIN_TY]]* %{{.+}}) | // CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_MAIN_TY]]* %{{.+}}) | ||||
// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, | // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, | ||||
// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], | // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], | ||||
// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]], | // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]], | ||||
// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]], | // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]], | ||||
// CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, | |||||
// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]] | // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]] | ||||
// CHECK-NOT: [[T_VAR_PRIV]] | // CHECK-NOT: [[T_VAR_PRIV]] | ||||
// CHECK-NOT: [[VEC_PRIV]] | // CHECK-NOT: [[VEC_PRIV]] | ||||
// CHECK: {{.+}}: | // CHECK: {{.+}}: | ||||
// CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_FLOAT_TY]]* | // CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_FLOAT_TY]]* | ||||
// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[S_ARR_PRIV_ITEM]]) | // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[S_ARR_PRIV_ITEM]]) | ||||
// CHECK-NOT: [[T_VAR_PRIV]] | // CHECK-NOT: [[T_VAR_PRIV]] | ||||
// CHECK-NOT: [[VEC_PRIV]] | // CHECK-NOT: [[VEC_PRIV]] | ||||
Show All 12 Lines | |||||
// CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_TMAIN_TY]]* %{{.+}}) | // CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_TMAIN_TY]]* %{{.+}}) | ||||
// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, | // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, | ||||
// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], | // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], | ||||
// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], | // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], | ||||
// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], | // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], | ||||
// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]] | // CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]] | ||||
// CHECK-NOT: [[T_VAR_PRIV]] | // CHECK-NOT: [[T_VAR_PRIV]] | ||||
// CHECK-NOT: [[VEC_PRIV]] | // CHECK-NOT: [[VEC_PRIV]] | ||||
// CHECK-NOT: [[SIVAR_PRIV]] | |||||
// CHECK: {{.+}}: | // CHECK: {{.+}}: | ||||
// CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_INT_TY]]* | // CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_INT_TY]]* | ||||
// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[S_ARR_PRIV_ITEM]]) | // CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[S_ARR_PRIV_ITEM]]) | ||||
// CHECK-NOT: [[T_VAR_PRIV]] | // CHECK-NOT: [[T_VAR_PRIV]] | ||||
// CHECK-NOT: [[VEC_PRIV]] | // CHECK-NOT: [[VEC_PRIV]] | ||||
// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[VAR_PRIV]]) | // CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[VAR_PRIV]]) | ||||
// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]]) | // CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]]) | ||||
// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* | // CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* | ||||
// CHECK: ret void | // CHECK: ret void | ||||
#endif | #endif | ||||