[llvm-branch-commits] [cfe-branch] r318233 - Merging r315464:

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Nov 14 16:07:19 PST 2017


Author: tstellar
Date: Tue Nov 14 16:07:19 2017
New Revision: 318233

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

------------------------------------------------------------------------
r315464 | abataev | 2017-10-11 08:29:40 -0700 (Wed, 11 Oct 2017) | 5 lines

[OPENMP] Fix PR34916: Crash on mixing taskloop|tasks directives.

If both taskloop and task directives are used at the same time in one
program, we may ran into the situation when the particular type for task
directive is reused for taskloop directives. Patch fixes this problem.
------------------------------------------------------------------------

Modified:
    cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.cpp
    cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.h
    cfe/branches/release_50/test/OpenMP/taskloop_codegen.cpp

Modified: cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.cpp?rev=318233&r1=318232&r2=318233&view=diff
==============================================================================
--- cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.cpp (original)
+++ cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.cpp Tue Nov 14 16:07:19 2017
@@ -4249,9 +4249,20 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFun
   // Build type kmp_routine_entry_t (if not built yet).
   emitKmpRoutineEntryT(KmpInt32Ty);
   // Build type kmp_task_t (if not built yet).
-  if (KmpTaskTQTy.isNull()) {
-    KmpTaskTQTy = C.getRecordType(createKmpTaskTRecordDecl(
-        CGM, D.getDirectiveKind(), KmpInt32Ty, KmpRoutineEntryPtrQTy));
+  if (isOpenMPTaskLoopDirective(D.getDirectiveKind())) {
+    if (SavedKmpTaskloopTQTy.isNull()) {
+      SavedKmpTaskloopTQTy = C.getRecordType(createKmpTaskTRecordDecl(
+          CGM, D.getDirectiveKind(), KmpInt32Ty, KmpRoutineEntryPtrQTy));
+    }
+    KmpTaskTQTy = SavedKmpTaskloopTQTy;
+  } else if (D.getDirectiveKind() == OMPD_task) {
+    assert(D.getDirectiveKind() == OMPD_task &&
+           "Expected taskloop or task directive");
+    if (SavedKmpTaskTQTy.isNull()) {
+      SavedKmpTaskTQTy = C.getRecordType(createKmpTaskTRecordDecl(
+          CGM, D.getDirectiveKind(), KmpInt32Ty, KmpRoutineEntryPtrQTy));
+    }
+    KmpTaskTQTy = SavedKmpTaskTQTy;
   }
   auto *KmpTaskTQTyRD = cast<RecordDecl>(KmpTaskTQTy->getAsTagDecl());
   // Build particular struct kmp_task_t for the given task.

Modified: cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.h
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.h?rev=318233&r1=318232&r2=318233&view=diff
==============================================================================
--- cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.h (original)
+++ cfe/branches/release_50/lib/CodeGen/CGOpenMPRuntime.h Tue Nov 14 16:07:19 2017
@@ -313,6 +313,10 @@ private:
   ///    deconstructors of firstprivate C++ objects */
   /// } kmp_task_t;
   QualType KmpTaskTQTy;
+  /// Saved kmp_task_t for task directive.
+  QualType SavedKmpTaskTQTy;
+  /// Saved kmp_task_t for taskloop-based directive.
+  QualType SavedKmpTaskloopTQTy;
   /// \brief Type typedef struct kmp_depend_info {
   ///    kmp_intptr_t               base_addr;
   ///    size_t                     len;

Modified: cfe/branches/release_50/test/OpenMP/taskloop_codegen.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_50/test/OpenMP/taskloop_codegen.cpp?rev=318233&r1=318232&r2=318233&view=diff
==============================================================================
--- cfe/branches/release_50/test/OpenMP/taskloop_codegen.cpp (original)
+++ cfe/branches/release_50/test/OpenMP/taskloop_codegen.cpp Tue Nov 14 16:07:19 2017
@@ -8,6 +8,10 @@
 // CHECK-LABEL: @main
 int main(int argc, char **argv) {
 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* [[DEFLOC:@.+]])
+// CHECK: call i8* @__kmpc_omp_task_alloc(%ident_t* [[DEFLOC]], i32 [[GTID]],
+// CHECK: call i32 @__kmpc_omp_task(%ident_t* [[DEFLOC]], i32 [[GTID]],
+#pragma omp task
+  ;
 // CHECK: call void @__kmpc_taskgroup(%ident_t* [[DEFLOC]], i32 [[GTID]])
 // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%ident_t* [[DEFLOC]], i32 [[GTID]], i32 33, i64 80, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK1:@.+]] to i32 (i32, i8*)*))
 // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]*




More information about the llvm-branch-commits mailing list