[llvm-branch-commits] [cfe-branch] r318099 - Merging r309288:

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Nov 13 14:52:27 PST 2017


Author: tstellar
Date: Mon Nov 13 14:52:27 2017
New Revision: 318099

URL: http://llvm.org/viewvc/llvm-project?rev=318099&view=rev
Log:
Merging r309288:

------------------------------------------------------------------------
r309288 | erichkeane | 2017-07-27 09:28:20 -0700 (Thu, 27 Jul 2017) | 32 lines

Fix double destruction of objects when OpenMP construct is canceled

When an omp for loop is canceled the constructed objects are being destructed
twice.

It looks like the desired code is:

{

  Obj o;
  If (cancelled) branch-through-cleanups to cancel.exit.

}
[cleanups]
cancel.exit:

__kmpc_for_static_fini
br cancel.cont (*)

cancel.cont:

__kmpc_barrier
return

The problem seems to be the branch to cancel.cont is currently also going
through the cleanups calling them again. This change just does a direct branch
instead.

Patch By: michael.p.rice at intel.com

Differential Revision: https://reviews.llvm.org/D35854

------------------------------------------------------------------------

Added:
    cfe/branches/release_50/test/OpenMP/cancel_codegen_cleanup.cpp
Modified:
    cfe/branches/release_50/lib/CodeGen/CodeGenFunction.h

Modified: cfe/branches/release_50/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/lib/CodeGen/CodeGenFunction.h?rev=318099&r1=318098&r2=318099&view=diff
==============================================================================
--- cfe/branches/release_50/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/branches/release_50/lib/CodeGen/CodeGenFunction.h Mon Nov 13 14:52:27 2017
@@ -1116,7 +1116,7 @@ private:
         auto IP = CGF.Builder.saveAndClearIP();
         CGF.EmitBlock(Stack.back().ExitBlock.getBlock());
         CodeGen(CGF);
-        CGF.EmitBranchThroughCleanup(Stack.back().ContBlock);
+        CGF.EmitBranch(Stack.back().ContBlock.getBlock());
         CGF.Builder.restoreIP(IP);
         Stack.back().HasBeenEmitted = true;
       }

Added: cfe/branches/release_50/test/OpenMP/cancel_codegen_cleanup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/test/OpenMP/cancel_codegen_cleanup.cpp?rev=318099&view=auto
==============================================================================
--- cfe/branches/release_50/test/OpenMP/cancel_codegen_cleanup.cpp (added)
+++ cfe/branches/release_50/test/OpenMP/cancel_codegen_cleanup.cpp Mon Nov 13 14:52:27 2017
@@ -0,0 +1,46 @@
+// RUN: %clang_cc1 -std=c++11 -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s
+
+//CHECK: call i32 @__kmpc_cancel
+//CHECK: br {{.*}}label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
+//CHECK: [[EXIT]]:
+//CHECK: store i32 [[EXIT_SLOT:[0-9]+]]
+//CHECK: br label %[[CLEANUP:.+]]
+//CHECK: [[CONTINUE]]:
+//CHECK: store i32 [[CONT_SLOT:[0-9]+]],
+//CHECK: br label %[[CLEANUP]]
+//CHECK: [[CLEANUP]]:
+//CHECK-NEXT: call void @_ZN3ObjD1Ev
+//CHECK: switch i32{{.*}}, label %[[UNREACHABLE:.+]] [
+//CHECK:   i32 [[CONT_SLOT]], label %[[CLEANUPCONT:.+]]
+//CHECK:   i32 [[EXIT_SLOT]], label %[[CANCELEXIT:.+]]
+//CHECK-NEXT: ]
+//CHECK: [[CLEANUPCONT]]:
+//CHECK: br label %[[CANCELCONT:.+]]
+//CHECK: [[CANCELCONT]]:
+//CHECK-NEXT: call void @__kmpc_barrier(
+//CHECK-NEXT: ret void
+//CHECK: [[UNREACHABLE]]:
+//CHECK-NEXT: unreachable
+//CHECK-NEXT: }
+
+struct Obj {
+  int a; Obj(); Obj(const Obj& r) = delete; Obj &operator=(const Obj& r);
+  ~Obj();
+};
+ 
+void foo() {
+  int i,count = 0;
+  Obj obj;
+
+  #pragma omp parallel private(i) num_threads(1)
+  {
+      #pragma omp for reduction(+:count) lastprivate(obj)
+      for (i=0; i<1000; i++) {
+            if(i==100) {
+                obj.a = 100;
+                #pragma omp cancel for
+            }
+            count++;
+        }
+    }
+}




More information about the llvm-branch-commits mailing list