Author: abataev Date: Thu Nov 2 07:25:34 2017 New Revision: 317208 URL: http://llvm.org/viewvc/llvm-project?rev=317208&view=rev Log: [OPENMP] Fix PR35156: Get correct thread id with windows exceptions.
If the thread id is requested in windows mode within funclets, we may generate incorrect function call that could lead to broken codegen. Added: cfe/trunk/test/OpenMP/openmp_win_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp cfe/trunk/test/OpenMP/critical_codegen.cpp cfe/trunk/test/OpenMP/for_codegen.cpp cfe/trunk/test/OpenMP/for_simd_codegen.cpp cfe/trunk/test/OpenMP/master_codegen.cpp cfe/trunk/test/OpenMP/parallel_for_codegen.cpp cfe/trunk/test/OpenMP/parallel_for_simd_codegen.cpp cfe/trunk/test/OpenMP/parallel_sections_codegen.cpp cfe/trunk/test/OpenMP/sections_codegen.cpp cfe/trunk/test/OpenMP/single_codegen.cpp cfe/trunk/test/OpenMP/taskgroup_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original) +++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Thu Nov 2 07:25:34 2017 @@ -1451,7 +1451,8 @@ llvm::Value *CGOpenMPRuntime::getThreadI return ThreadID; } // If exceptions are enabled, do not use parameter to avoid possible crash. - if (!CGF.getInvokeDest()) { + if (!CGF.getInvokeDest() || + CGF.Builder.GetInsertBlock() == CGF.AllocaInsertPt->getParent()) { if (auto *OMPRegionInfo = dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) { if (OMPRegionInfo->getThreadIDVariable()) { @@ -1475,12 +1476,13 @@ llvm::Value *CGOpenMPRuntime::getThreadI // function. CGBuilderTy::InsertPointGuard IPG(CGF.Builder); CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt); - ThreadID = - CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_global_thread_num), - emitUpdateLocation(CGF, Loc)); + auto *Call = CGF.Builder.CreateCall( + createRuntimeFunction(OMPRTL__kmpc_global_thread_num), + emitUpdateLocation(CGF, Loc)); + Call->setCallingConv(CGF.getRuntimeCC()); auto &Elem = OpenMPLocThreadIDMap.FindAndConstruct(CGF.CurFn); - Elem.second.ThreadID = ThreadID; - return ThreadID; + Elem.second.ThreadID = Call; + return Call; } void CGOpenMPRuntime::functionFinished(CodeGenFunction &CGF) { Modified: cfe/trunk/test/OpenMP/critical_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/critical_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/critical_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/critical_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -78,7 +78,7 @@ void critical_ref(S &s) { void parallel_critical() { #pragma omp parallel #pragma omp critical - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: call void @__kmpc_critical({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] // TERM_DEBUG: invoke void {{.*}}foo{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], Modified: cfe/trunk/test/OpenMP/for_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/for_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -355,7 +355,7 @@ int foo() {return 0;}; void parallel_for(float *a) { #pragma omp parallel #pragma omp for schedule(static, 5) - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: call void @__kmpc_for_static_init_4u({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] // TERM_DEBUG: invoke i32 {{.*}}foo{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], Modified: cfe/trunk/test/OpenMP/for_simd_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_simd_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_simd_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/for_simd_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -673,7 +673,7 @@ int bar() {return 0;}; void parallel_simd(float *a) { #pragma omp parallel #pragma omp for simd - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: invoke i32 {{.*}}bar{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], // TERM_DEBUG-NOT: __kmpc_global_thread_num Modified: cfe/trunk/test/OpenMP/master_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/master_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/master_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/master_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -49,7 +49,7 @@ int main() { void parallel_master() { #pragma omp parallel #pragma omp master - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: call i32 @__kmpc_master({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] // TERM_DEBUG: invoke void {{.*}}foo{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], Added: cfe/trunk/test/OpenMP/openmp_win_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/openmp_win_codegen.cpp?rev=317208&view=auto ============================================================================== --- cfe/trunk/test/OpenMP/openmp_win_codegen.cpp (added) +++ cfe/trunk/test/OpenMP/openmp_win_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-pc-windows-msvc18.0.0 -std=c++11 -fms-compatibility-version=18 -fms-extensions -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s +// REQUIRES: x86-registered-target +// expected-no-diagnostics + +void foo(); +void bar(); + +// CHECK-LABEL: @main +int main() { + // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%ident_t* @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*)) +#pragma omp parallel + { + try { + foo(); + } catch (int t) { +#pragma omp critical + { + bar(); + }; + } + }; + // CHECK: ret i32 0 + return 0; +} + +// CHECK: define internal void [[OUTLINED]]( +// CHECK: [[GID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* @0) +// CHECK: invoke void @{{.+}}foo +// CHECK: catchswitch within +// CHECK: catchpad within +// CHECK: call void @__kmpc_critical(%ident_t* @0, i32 [[GID]], +// CHECK: invoke void @{{.+}}bar +// CHECK: call void @__kmpc_end_critical(%ident_t* @0, i32 [[GID]], +// CHECK: catchret from +// CHECK: cleanuppad within +// CHECK: call void @__kmpc_end_critical(%ident_t* @0, i32 [[GID]], +// CHECK: cleanupret from + Modified: cfe/trunk/test/OpenMP/parallel_for_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_for_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_for_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -348,7 +348,7 @@ int foo() {return 0;}; void parallel_for(float *a, int n) { float arr[n]; #pragma omp parallel for schedule(static, 5) private(arr) - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: call void @__kmpc_for_static_init_4u({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] // TERM_DEBUG: invoke i32 {{.*}}foo{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], Modified: cfe/trunk/test/OpenMP/parallel_for_simd_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_simd_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_for_simd_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_for_simd_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -668,7 +668,7 @@ int bar() {return 0;}; // TERM_DEBUG-LABEL: parallel_simd void parallel_simd(float *a) { #pragma omp parallel for simd - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: invoke i32 {{.*}}bar{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], // TERM_DEBUG-NOT: __kmpc_global_thread_num Modified: cfe/trunk/test/OpenMP/parallel_sections_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_sections_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/parallel_sections_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_sections_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -74,7 +74,7 @@ int main() { // CHECK-LABEL: tmain // CHECK: call void {{.*}} @__kmpc_fork_call( -// CHECK: __kmpc_global_thread_num +// CHECK-NOT: __kmpc_global_thread_num // CHECK: call void @__kmpc_for_static_init_4( // CHECK: invoke void @{{.*}}foo{{.*}}() // CHECK-NEXT: unwind label %[[TERM_LPAD:.+]] Modified: cfe/trunk/test/OpenMP/sections_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/sections_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/sections_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/sections_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -84,7 +84,7 @@ int main() { // CHECK-LABEL: tmain // CHECK: call void {{.*}} @__kmpc_fork_call( -// CHECK: __kmpc_global_thread_num +// CHECK-NOT: __kmpc_global_thread_num // CHECK: call void @__kmpc_for_static_init_4( // CHECK: invoke void @{{.*}}foo{{.*}}() // CHECK-NEXT: unwind label %[[TERM_LPAD:.+]] Modified: cfe/trunk/test/OpenMP/single_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/single_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/single_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/single_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -190,7 +190,7 @@ int main() { void parallel_single() { #pragma omp parallel #pragma omp single - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: call i32 @__kmpc_single({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] // TERM_DEBUG: invoke void {{.*}}foo{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], Modified: cfe/trunk/test/OpenMP/taskgroup_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/taskgroup_codegen.cpp?rev=317208&r1=317207&r2=317208&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/taskgroup_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/taskgroup_codegen.cpp Thu Nov 2 07:25:34 2017 @@ -40,7 +40,7 @@ int main() { void parallel_taskgroup() { #pragma omp parallel #pragma omp taskgroup - // TERM_DEBUG: __kmpc_global_thread_num + // TERM_DEBUG-NOT: __kmpc_global_thread_num // TERM_DEBUG: call void @__kmpc_taskgroup({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]] // TERM_DEBUG: invoke void {{.*}}foo{{.*}}() // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]], _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits