|
@@ -18,11 +18,69 @@ struct S {
|
|
|
|
|
|
volatile int g __attribute__((aligned(128))) = 1212;
|
|
|
|
|
|
+struct SS {
|
|
|
+ int a;
|
|
|
+ int b : 4;
|
|
|
+ int &c;
|
|
|
+ SS(int &d) : a(0), b(0), c(d) {
|
|
|
+#pragma omp parallel private(a, b, c)
|
|
|
+#ifdef LAMBDA
|
|
|
+ [&]() {
|
|
|
+ ++this->a, --b, (this)->c /= 1;
|
|
|
+#pragma omp parallel private(a, b, c)
|
|
|
+ ++(this)->a, --b, this->c /= 1;
|
|
|
+ }();
|
|
|
+#elif defined(BLOCKS)
|
|
|
+ ^{
|
|
|
+ ++a;
|
|
|
+ --this->b;
|
|
|
+ (this)->c /= 1;
|
|
|
+#pragma omp parallel private(a, b, c)
|
|
|
+ ++(this)->a, --b, this->c /= 1;
|
|
|
+ }();
|
|
|
+#else
|
|
|
+ ++this->a, --b, c /= 1;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+template<typename T>
|
|
|
+struct SST {
|
|
|
+ T a;
|
|
|
+ SST() : a(T()) {
|
|
|
+#pragma omp parallel private(a)
|
|
|
+#ifdef LAMBDA
|
|
|
+ [&]() {
|
|
|
+ [&]() {
|
|
|
+ ++this->a;
|
|
|
+#pragma omp parallel private(a)
|
|
|
+ ++(this)->a;
|
|
|
+ }();
|
|
|
+ }();
|
|
|
+#elif defined(BLOCKS)
|
|
|
+ ^{
|
|
|
+ ^{
|
|
|
+ ++a;
|
|
|
+#pragma omp parallel private(a)
|
|
|
+ ++(this)->a;
|
|
|
+ }();
|
|
|
+ }();
|
|
|
+#else
|
|
|
+ ++(this)->a;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// CHECK: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
|
|
|
+// LAMBDA: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
|
|
|
+// BLOCKS: [[SS_TY:%.+]] = type { i{{[0-9]+}}, i8
|
|
|
// CHECK: [[S_FLOAT_TY:%.+]] = type { float }
|
|
|
// CHECK: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
|
|
|
+// CHECK: [[SST_TY:%.+]] = type { i{{[0-9]+}} }
|
|
|
template <typename T>
|
|
|
T tmain() {
|
|
|
S<T> test;
|
|
|
+ SST<T> sst;
|
|
|
T t_var __attribute__((aligned(128))) = T();
|
|
|
T vec[] __attribute__((aligned(128))) = {1, 2};
|
|
|
S<T> s_arr[] __attribute__((aligned(128))) = {1, 2};
|
|
@@ -37,9 +95,11 @@ T tmain() {
|
|
|
|
|
|
int main() {
|
|
|
static int sivar;
|
|
|
+ SS ss(sivar);
|
|
|
#ifdef LAMBDA
|
|
|
// LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212,
|
|
|
// LAMBDA-LABEL: @main
|
|
|
+ // LAMBDA: call
|
|
|
// LAMBDA: call{{.*}} void [[OUTER_LAMBDA:@.+]](
|
|
|
[&]() {
|
|
|
// LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
|
|
@@ -47,6 +107,36 @@ int main() {
|
|
|
// LAMBDA: call{{.*}} void {{.+}} @__kmpc_fork_call({{.+}}, i32 0, {{.+}}* [[OMP_REGION:@.+]] to {{.+}})
|
|
|
#pragma omp parallel private(g, sivar)
|
|
|
{
|
|
|
+ // LAMBDA: define {{.+}} @{{.+}}([[SS_TY]]* %
|
|
|
+ // LAMBDA: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
|
|
|
+ // LAMBDA: store i8
|
|
|
+ // LAMBDA: 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]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
|
|
|
+ // LAMBDA: ret
|
|
|
+
|
|
|
+ // LAMBDA: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
|
|
|
+ // LAMBDA-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %
|
|
|
+ // LAMBDA: call{{.*}} void
|
|
|
+ // LAMBDA: ret void
|
|
|
+
|
|
|
+ // LAMBDA: define internal void @{{.+}}(i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
|
|
|
+ // LAMBDA: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+ // LAMBDA: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+ // LAMBDA: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+ // LAMBDA: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
|
|
|
+ // LAMBDA: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
|
|
|
+ // LAMBDA-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
|
|
|
+ // LAMBDA-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+ // LAMBDA-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
|
|
|
+ // LAMBDA-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+ // LAMBDA-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
|
|
|
+ // LAMBDA-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
|
|
|
+ // LAMBDA-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
|
|
|
+ // LAMBDA-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
|
|
|
+ // LAMBDA-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
|
|
|
+ // LAMBDA-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
|
|
|
+ // LAMBDA-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
|
|
|
+ // LAMBDA-NEXT: ret void
|
|
|
+
|
|
|
// LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
|
|
|
// LAMBDA: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
|
|
|
// LAMBDA: [[SIVAR_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
|
|
@@ -80,6 +170,7 @@ int main() {
|
|
|
#elif defined(BLOCKS)
|
|
|
// BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212,
|
|
|
// BLOCKS-LABEL: @main
|
|
|
+ // BLOCKS: call
|
|
|
// BLOCKS: call{{.*}} void {{%.+}}(i8
|
|
|
^{
|
|
|
// BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
|
|
@@ -116,6 +207,35 @@ int main() {
|
|
|
}
|
|
|
}();
|
|
|
return 0;
|
|
|
+// BLOCKS: define {{.+}} @{{.+}}([[SS_TY]]* %
|
|
|
+// BLOCKS: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
|
|
|
+// BLOCKS: store i8
|
|
|
+// BLOCKS: 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]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
|
|
|
+// BLOCKS: ret
|
|
|
+
|
|
|
+// BLOCKS: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
|
|
|
+// BLOCKS-NOT: getelementptr {{.*}}[[SS_TY]], [[SS_TY]]* %
|
|
|
+// BLOCKS: call{{.*}} void
|
|
|
+// BLOCKS: ret void
|
|
|
+
|
|
|
+// BLOCKS: define internal void @{{.+}}(i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
|
|
|
+// BLOCKS: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// BLOCKS: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// BLOCKS: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// BLOCKS: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
|
|
|
+// BLOCKS: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
|
|
|
+// BLOCKS-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
|
|
|
+// BLOCKS-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+// BLOCKS-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
|
|
|
+// BLOCKS-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+// BLOCKS-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
|
|
|
+// BLOCKS-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
|
|
|
+// BLOCKS-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
|
|
|
+// BLOCKS-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
|
|
|
+// BLOCKS-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
|
|
|
+// BLOCKS-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
|
|
|
+// BLOCKS-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
|
|
|
+// BLOCKS-NEXT: ret void
|
|
|
#else
|
|
|
S<float> test;
|
|
|
int t_var = 0;
|
|
@@ -166,6 +286,31 @@ int main() {
|
|
|
// CHECK: call void [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
|
|
|
// CHECK: ret
|
|
|
//
|
|
|
+// CHECK: define {{.+}} @{{.+}}([[SS_TY]]* %
|
|
|
+// CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
|
|
|
+// CHECK: store i8
|
|
|
+// 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]+}}*, [[SS_TY]]*)* [[SS_MICROTASK:@.+]] to void
|
|
|
+// CHECK: ret
|
|
|
+
|
|
|
+// CHECK: define internal void [[SS_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SS_TY]]* %{{.+}})
|
|
|
+// CHECK: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// CHECK: [[B_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// CHECK: [[C_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// CHECK: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REFA:%.+]],
|
|
|
+// CHECK: store i{{[0-9]+}}* [[C_PRIV]], i{{[0-9]+}}** [[REFC:%.+]],
|
|
|
+// CHECK-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFA]],
|
|
|
+// CHECK-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+// CHECK-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
|
|
|
+// CHECK-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+// CHECK-NEXT: [[B_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[B_PRIV]],
|
|
|
+// CHECK-NEXT: [[DEC:%.+]] = add nsw i{{[0-9]+}} [[B_VAL]], -1
|
|
|
+// CHECK-NEXT: store i{{[0-9]+}} [[DEC]], i{{[0-9]+}}* [[B_PRIV]],
|
|
|
+// CHECK-NEXT: [[C_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REFC]],
|
|
|
+// CHECK-NEXT: [[C_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[C_PRIV]],
|
|
|
+// CHECK-NEXT: [[DIV:%.+]] = sdiv i{{[0-9]+}} [[C_VAL]], 1
|
|
|
+// CHECK-NEXT: store i{{[0-9]+}} [[DIV]], i{{[0-9]+}}* [[C_PRIV]],
|
|
|
+// CHECK-NEXT: ret void
|
|
|
+
|
|
|
// CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
|
|
|
// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, align 128
|
|
|
// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], align 128
|
|
@@ -184,5 +329,20 @@ int main() {
|
|
|
// 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: ret void
|
|
|
+
|
|
|
+// CHECK: define {{.+}} @{{.+}}([[SST_TY]]* %
|
|
|
+// CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* %
|
|
|
+// 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]+}}*, [[SST_TY]]*)* [[SST_MICROTASK:@.+]] to void
|
|
|
+// CHECK: ret
|
|
|
+
|
|
|
+// CHECK: define internal void [[SST_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}}, [[SST_TY]]* %{{.+}})
|
|
|
+// CHECK: [[A_PRIV:%.+]] = alloca i{{[0-9]+}},
|
|
|
+// CHECK: store i{{[0-9]+}}* [[A_PRIV]], i{{[0-9]+}}** [[REF:%.+]],
|
|
|
+// CHECK-NEXT: [[A_PRIV:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[REF]],
|
|
|
+// CHECK-NEXT: [[A_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+// CHECK-NEXT: [[INC:%.+]] = add nsw i{{[0-9]+}} [[A_VAL]], 1
|
|
|
+// CHECK-NEXT: store i{{[0-9]+}} [[INC]], i{{[0-9]+}}* [[A_PRIV]],
|
|
|
+// CHECK-NEXT: ret void
|
|
|
+
|
|
|
#endif
|
|
|
|