r317227 - [OPENMP] Fix PR35152: Do not use getInvokeDest() function for EH checks.

Alexey Bataev via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 2 11:55:05 PDT 2017


Author: abataev
Date: Thu Nov  2 11:55:05 2017
New Revision: 317227

URL: http://llvm.org/viewvc/llvm-project?rev=317227&view=rev
Log:
[OPENMP] Fix PR35152: Do not use getInvokeDest() function for EH checks.

The compiler may crash under some conditions if the getInvokeDest() is
used, but later it is not used. Fixed this problem in OpenMP.

Modified:
    cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp
    cfe/trunk/test/OpenMP/openmp_win_codegen.cpp

Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=317227&r1=317226&r2=317227&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Thu Nov  2 11:55:05 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.EHStack.requiresLandingPad() || !CGF.getLangOpts().Exceptions ||
+      !CGF.getLangOpts().CXXExceptions ||
       CGF.Builder.GetInsertBlock() == CGF.AllocaInsertPt->getParent()) {
     if (auto *OMPRegionInfo =
             dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {

Modified: cfe/trunk/test/OpenMP/openmp_win_codegen.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/openmp_win_codegen.cpp?rev=317227&r1=317226&r2=317227&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/openmp_win_codegen.cpp (original)
+++ cfe/trunk/test/OpenMP/openmp_win_codegen.cpp Thu Nov  2 11:55:05 2017
@@ -1,13 +1,36 @@
-// 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
+// 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 - -O1 | FileCheck %s
 // REQUIRES: x86-registered-target
 // expected-no-diagnostics
 
 void foo();
 void bar();
 
+struct Test {
+  static void main() {
+    int failed = 0;
+    int j = 2;
+
+#pragma omp parallel
+    {
+      int local_j = 3;
+#pragma omp single copyprivate(local_j)
+      {
+        local_j = 4;
+      }
+
+      // Assure reports a data race, but value written to "j"
+      // should always be the same.
+      j = local_j;
+    }
+
+  }
+};
+
 // 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*, ...)*))
+  // CHECK: call void @{{.+}}main
+  Test::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 {
@@ -24,15 +47,15 @@ int main() {
 }
 
 // CHECK: define internal void [[OUTLINED]](
-// CHECK: [[GID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* @0)
+// 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: 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: 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: call void @__kmpc_end_critical(%ident_t* {{.*}}@0, i32 [[GID]],
 // CHECK: cleanupret from
 




More information about the cfe-commits mailing list