168 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s4 5// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s6// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s8// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}9// expected-no-diagnostics10 11 12#ifndef HEADER13#define HEADER14 15#define N 1016int foo();17int bar();18int k;19// CHECK-LABEL: @main20int main(int argc, char **argv) {21 foo();22// CHECK: @{{.+}}foo23// CHECK: call void @__kmpc_for_static_init_4(24// CHECK-NOT: @k25// CHECK: call void @__kmpc_for_static_fini(26// CHECK-NOT: @k27#pragma omp for private(k)28 for (k = 0; k < argc; k++)29 ;30 foo();31// CHECK: @{{.+}}foo32// CHECK: call void @__kmpc_for_static_init_8(33// CHECK-NOT: @k34// CHECK: call void @__kmpc_for_static_fini(35// CHECK: store i32 %{{.+}}, ptr @k36#pragma omp for lastprivate(k) collapse(2)37 for (int i = 0; i < 2; ++i)38 for (k = 0; k < argc; k++)39 ;40 foo();41// CHECK: @{{.+}}foo42// CHECK-NOT: @k{{.+}}!llvm.access.group43// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group44// CHECK-NOT: @k{{.+}}!llvm.access.group45// CHECK: sdiv i3246// CHECK: store i32 %{{.+}}, ptr @k,47#pragma omp simd linear(k : 2)48 for (k = 0; k < argc; k++)49 bar();50// CHECK: @{{.+}}foo51// CHECK-NOT: @k{{.+}}!llvm.access.group52// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group53// CHECK-NOT: @k{{.+}}!llvm.access.group54// CHECK: sdiv i3255// CHECK: store i32 %{{.+}}, ptr @k,56 foo();57#pragma omp simd lastprivate(k) collapse(2)58 for (int i = 0; i < 2; ++i)59 for (k = 0; k < argc; k++)60 bar() ;61 foo();62// CHECK: @{{.+}}foo63// CHECK-NOT: @k{{.+}}!llvm.access.group64// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group65// CHECK-NOT: @k{{.+}}!llvm.access.group66// CHECK: sdiv i3267// CHECK: store i32 %{{.+}}, ptr @k,68#pragma omp simd69 for (k = 0; k < argc; k++)70 bar();71 foo();72// CHECK: @{{.+}}foo73// CHECK-NOT: @k{{.+}}!llvm.access.group74// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group75// CHECK-NOT: @k{{.+}}!llvm.access.group76// CHECK: sdiv i3277// CHECK: store i32 %{{.+}}, ptr @k,78#pragma omp simd collapse(2)79 for (int i = 0; i < 2; ++i)80 for (k = 0; k < argc; k++)81 bar();82// CHECK: @{{.+}}foo83 foo();84 return 0;85}86 87struct S {88 int k;89 S(int argc) {90 foo();91// CHECK: @{{.+}}foo92// CHECK: call void @__kmpc_for_static_init_4(93// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 094// CHECK: call void @__kmpc_for_static_fini(95// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 096#pragma omp for private(k)97 for (k = 0; k < argc; k++)98 ;99 foo();100// CHECK: @{{.+}}foo101// CHECK: call void @__kmpc_for_static_init_8(102// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0103// CHECK: call void @__kmpc_for_static_fini(104#pragma omp for lastprivate(k) collapse(2)105 for (int i = 0; i < 2; ++i)106 for (k = 0; k < argc; k++)107 ;108 foo();109// CHECK: @{{.+}}foo110// CHECK: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0111// CHECK: br i1112// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0113// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group114// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0115// CHECK: add nsw i32 %{{.+}}, 1116// CHECK: br label {{.+}}, !llvm.loop117// CHECK: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0118#pragma omp simd linear(k : 2)119 for (k = 0; k < argc; k++)120 bar();121 foo();122// CHECK: @{{.+}}foo123// CHECK: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0124// CHECK: br i1125// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0126// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group127// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0128// CHECK: add nsw i64 %{{.+}}, 1129// CHECK: br label {{.+}}, !llvm.loop130// CHECK: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0131#pragma omp simd lastprivate(k) collapse(2)132 for (int i = 0; i < 2; ++i)133 for (k = 0; k < argc; k++)134 bar();135 foo();136// CHECK: @{{.+}}foo137// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0138// CHECK: br i1139// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0140// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group141// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0142// CHECK: add nsw i32 %{{.+}}, 1143// CHECK: br label {{.+}}, !llvm.loop144// CHECK: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0145#pragma omp simd146 for (k = 0; k < argc; k++)147 bar();148 foo();149// CHECK: @{{.+}}foo150// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0151// CHECK: br i1152// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0153// CHECK: i32 @{{.+}}bar{{.+}}!llvm.access.group154// CHECK-NOT: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0155// CHECK: add nsw i64 %{{.+}}, 1156// CHECK: br label {{.+}}, !llvm.loop157// CHECK: getelementptr inbounds nuw %struct.S, ptr %{{.+}}, i32 0, i32 0158#pragma omp simd collapse(2)159 for (int i = 0; i < 2; ++i)160 for (k = 0; k < argc; k++)161 bar();162// CHECK: @{{.+}}foo163 foo();164 }165} s(N);166 167#endif // HEADER168