tianshilei1992 created this revision.
tianshilei1992 added reviewers: jdoerfert, grokos, ye-luo.
Herald added subscribers: cfe-commits, guansong, yaxunl.
Herald added a project: clang.
tianshilei1992 requested review of this revision.
Herald added a subscriber: sstefan1.

The implementation of target nowait just wraps the target region into a
task. The essential four parameters (base ptr, ptr, size, mapper) are taken as
firstprivate such that they will be copied to the private location. When there
is no user-defined mapper, the mapper variable will be nullptr. However, it will
be still copied to the corresponding place. Therefore, a memcpy will be 
generated
and the source pointer will be nullptr, causing a segmentation fault.

In this patch, it will first checks whether the mapper is a constant nullptr. If
so, the firstprivate field and corresponding copy will not be generated.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D89844

Files:
  clang/lib/CodeGen/CGStmtOpenMP.cpp


Index: clang/lib/CodeGen/CGStmtOpenMP.cpp
===================================================================
--- clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -4210,16 +4210,24 @@
         /*IndexTypeQuals=*/0);
     SVD = createImplicitFirstprivateForType(getContext(), Data, SizesType, CD,
                                             S.getBeginLoc());
-    MVD = createImplicitFirstprivateForType(
-        getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc());
     TargetScope.addPrivate(
         BPVD, [&InputInfo]() { return InputInfo.BasePointersArray; });
     TargetScope.addPrivate(PVD,
                            [&InputInfo]() { return InputInfo.PointersArray; });
     TargetScope.addPrivate(SVD,
                            [&InputInfo]() { return InputInfo.SizesArray; });
-    TargetScope.addPrivate(MVD,
-                           [&InputInfo]() { return InputInfo.MappersArray; });
+    // Mapper can be nullptr if user doesn't provide any. We will not take it
+    // into account in this case.
+    if (auto *Ptr = dyn_cast_or_null<llvm::Constant>(
+            InputInfo.MappersArray.getPointer())) {
+      if (!Ptr->isNullValue()) {
+        MVD = createImplicitFirstprivateForType(getContext(), Data,
+                                                BaseAndPointerAndMapperType, 
CD,
+                                                S.getBeginLoc());
+        TargetScope.addPrivate(
+            MVD, [&InputInfo]() { return InputInfo.MappersArray; });
+      }
+    }
   }
   (void)TargetScope.Privatize();
   // Build list of dependences.
@@ -4269,8 +4277,10 @@
           CGF.GetAddrOfLocalVar(PVD), /*Index=*/0);
       InputInfo.SizesArray = CGF.Builder.CreateConstArrayGEP(
           CGF.GetAddrOfLocalVar(SVD), /*Index=*/0);
-      InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
-          CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
+      // MVD can be nullptr if there is no user-defined mapper
+      if (MVD)
+        InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
+            CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
     }
 
     Action.Enter(CGF);


Index: clang/lib/CodeGen/CGStmtOpenMP.cpp
===================================================================
--- clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -4210,16 +4210,24 @@
         /*IndexTypeQuals=*/0);
     SVD = createImplicitFirstprivateForType(getContext(), Data, SizesType, CD,
                                             S.getBeginLoc());
-    MVD = createImplicitFirstprivateForType(
-        getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc());
     TargetScope.addPrivate(
         BPVD, [&InputInfo]() { return InputInfo.BasePointersArray; });
     TargetScope.addPrivate(PVD,
                            [&InputInfo]() { return InputInfo.PointersArray; });
     TargetScope.addPrivate(SVD,
                            [&InputInfo]() { return InputInfo.SizesArray; });
-    TargetScope.addPrivate(MVD,
-                           [&InputInfo]() { return InputInfo.MappersArray; });
+    // Mapper can be nullptr if user doesn't provide any. We will not take it
+    // into account in this case.
+    if (auto *Ptr = dyn_cast_or_null<llvm::Constant>(
+            InputInfo.MappersArray.getPointer())) {
+      if (!Ptr->isNullValue()) {
+        MVD = createImplicitFirstprivateForType(getContext(), Data,
+                                                BaseAndPointerAndMapperType, CD,
+                                                S.getBeginLoc());
+        TargetScope.addPrivate(
+            MVD, [&InputInfo]() { return InputInfo.MappersArray; });
+      }
+    }
   }
   (void)TargetScope.Privatize();
   // Build list of dependences.
@@ -4269,8 +4277,10 @@
           CGF.GetAddrOfLocalVar(PVD), /*Index=*/0);
       InputInfo.SizesArray = CGF.Builder.CreateConstArrayGEP(
           CGF.GetAddrOfLocalVar(SVD), /*Index=*/0);
-      InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
-          CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
+      // MVD can be nullptr if there is no user-defined mapper
+      if (MVD)
+        InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP(
+            CGF.GetAddrOfLocalVar(MVD), /*Index=*/0);
     }
 
     Action.Enter(CGF);
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to