10026ed2fSErich Keane // RUN: %clang_cc1 -std=c++11 -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s 20026ed2fSErich Keane 3a8a9153aSAlexey Bataev // RUN: %clang_cc1 -std=c++11 -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 4a8a9153aSAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 5a8a9153aSAlexey Bataev 6*eaa341fbSSaiyedul Islam // RUN: %clang_cc1 -std=c++11 -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s 7*eaa341fbSSaiyedul Islam // RUN: %clang_cc1 -std=c++11 -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s 8*eaa341fbSSaiyedul Islam // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 9*eaa341fbSSaiyedul Islam 100026ed2fSErich Keane //CHECK: call i32 @__kmpc_cancel 110026ed2fSErich Keane //CHECK: br {{.*}}label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 120026ed2fSErich Keane //CHECK: [[EXIT]]: 130026ed2fSErich Keane //CHECK: store i32 [[EXIT_SLOT:[0-9]+]] 140026ed2fSErich Keane //CHECK: br label %[[CLEANUP:.+]] 150026ed2fSErich Keane //CHECK: [[CONTINUE]]: 160026ed2fSErich Keane //CHECK: store i32 [[CONT_SLOT:[0-9]+]], 170026ed2fSErich Keane //CHECK: br label %[[CLEANUP]] 180026ed2fSErich Keane //CHECK: [[CLEANUP]]: 190026ed2fSErich Keane //CHECK-NEXT: call void @_ZN3ObjD1Ev 200026ed2fSErich Keane //CHECK: switch i32{{.*}}, label %[[UNREACHABLE:.+]] [ 210026ed2fSErich Keane //CHECK: i32 [[CONT_SLOT]], label %[[CLEANUPCONT:.+]] 220026ed2fSErich Keane //CHECK: i32 [[EXIT_SLOT]], label %[[CANCELEXIT:.+]] 230026ed2fSErich Keane //CHECK-NEXT: ] 240026ed2fSErich Keane //CHECK: [[CLEANUPCONT]]: 250026ed2fSErich Keane //CHECK: br label %[[CANCELCONT:.+]] 260026ed2fSErich Keane //CHECK: [[CANCELCONT]]: 270026ed2fSErich Keane //CHECK-NEXT: call void @__kmpc_barrier( 280026ed2fSErich Keane //CHECK-NEXT: ret void 290026ed2fSErich Keane //CHECK: [[UNREACHABLE]]: 300026ed2fSErich Keane //CHECK-NEXT: unreachable 310026ed2fSErich Keane //CHECK-NEXT: } 320026ed2fSErich Keane 330026ed2fSErich Keane struct Obj { 340026ed2fSErich Keane int a; Obj(); Obj(const Obj& r) = delete; Obj &operator=(const Obj& r); 350026ed2fSErich Keane ~Obj(); 360026ed2fSErich Keane }; 370026ed2fSErich Keane foo()380026ed2fSErich Keanevoid foo() { 390026ed2fSErich Keane int i,count = 0; 400026ed2fSErich Keane Obj obj; 410026ed2fSErich Keane 420026ed2fSErich Keane #pragma omp parallel private(i) num_threads(1) 430026ed2fSErich Keane { 440026ed2fSErich Keane #pragma omp for reduction(+:count) lastprivate(obj) 450026ed2fSErich Keane for (i=0; i<1000; i++) { 460026ed2fSErich Keane if(i==100) { 470026ed2fSErich Keane obj.a = 100; 480026ed2fSErich Keane #pragma omp cancel for 490026ed2fSErich Keane } 500026ed2fSErich Keane count++; 510026ed2fSErich Keane } 520026ed2fSErich Keane } 530026ed2fSErich Keane } 54