[PATCH] D17170: [OPENMP] Codegen for distribute directive

Alexey Bataev via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 16 21:29:31 PST 2016


ABataev added a comment.

Carlo, thanks for the patch! Please update the code to trunk HEAD


================
Comment at: lib/CodeGen/CGOpenMPRuntime.h:677
@@ -676,1 +676,3 @@
 
+  virtual bool isStaticNonchunked(OpenMPDistScheduleClauseKind ScheduleKind,
+                                  bool Chunked) const;
----------------
Add comment for the function

================
Comment at: lib/CodeGen/CGOpenMPRuntime.h:686-694
@@ -682,13 +685,11 @@
 
   virtual void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
                                    OpenMPScheduleClauseKind SchedKind,
                                    unsigned IVSize, bool IVSigned,
                                    bool Ordered, llvm::Value *UB,
                                    llvm::Value *Chunk = nullptr);
 
-  /// \brief Call the appropriate runtime routine to initialize it before start
-  /// of loop.
-  ///
-  /// Depending on the loop schedule, it is nesessary to call some runtime
-  /// routine before start of the OpenMP loop to get the loop upper / lower
-  /// bounds \a LB and \a UB and stride \a ST.
+  union OMPGenericSchedule {
+    OpenMPScheduleClauseKind forSchedule;
+    OpenMPDistScheduleClauseKind distributeSchedule;
+  };
----------------
I don't like union also. I think we can avoid using this

================
Comment at: lib/CodeGen/CGOpenMPRuntime.h:718
@@ -715,2 +717,3 @@
+                                 bool isForSchedule,
                                  unsigned IVSize, bool IVSigned, bool Ordered,
                                  Address IL, Address LB,
----------------
Add separate function, but outline the body for these 2 functions into a static function

================
Comment at: lib/CodeGen/CGStmtOpenMP.cpp:1540-1541
@@ +1539,4 @@
+
+  const Expr *IVExpr = S.getIterationVariable();
+  const unsigned IVSize = getContext().getTypeSize(IVExpr->getType());
+  const bool IVSigned = IVExpr->getType()->hasSignedIntegerRepresentation();
----------------
There was a problem with indentation, seems to me it is fixed

================
Comment at: lib/CodeGen/CGStmtOpenMP.cpp:2185-2216
@@ -2135,14 +2184,34 @@
   };
   CGM.getOpenMPRuntime().emitTaskgroupRegion(*this, CodeGen, S.getLocStart());
 }
 
 void CodeGenFunction::EmitOMPFlushDirective(const OMPFlushDirective &S) {
   CGM.getOpenMPRuntime().emitFlush(*this, [&]() -> ArrayRef<const Expr *> {
     if (const auto *FlushClause = S.getSingleClause<OMPFlushClause>()) {
       return llvm::makeArrayRef(FlushClause->varlist_begin(),
                                 FlushClause->varlist_end());
     }
     return llvm::None;
   }(), S.getLocStart());
 }
 
+static std::pair<llvm::Value * /*Chunk*/, OpenMPDistScheduleClauseKind>
+emitDistScheduleClause(CodeGenFunction &CGF, const OMPDistributeDirective &S,
+                   bool OuterRegion) {
+  // Detect the distribute schedule kind and chunk.
+  auto ScheduleKind = OMPC_DIST_SCHEDULE_unknown;
+  llvm::Value *Chunk = nullptr;
+  if (const auto *C = S.getSingleClause<OMPDistScheduleClause>()) {
+    ScheduleKind = C->getDistScheduleKind();
+    if (const auto *Ch = C->getChunkSize()) {
+      if (auto *ImpRef = cast_or_null<DeclRefExpr>(C->getHelperChunkSize())) {
+        if (OuterRegion) {
+          const VarDecl *ImpVar = cast<VarDecl>(ImpRef->getDecl());
+          CGF.EmitVarDecl(*ImpVar);
+          CGF.EmitStoreThroughLValue(
+              CGF.EmitAnyExpr(Ch),
+              CGF.MakeAddrLValue(CGF.GetAddrOfLocalVar(ImpVar),
+                                 ImpVar->getType()));
+        } else {
+          Ch = ImpRef;
+        }
----------------
I reworked it already, check the code in trunk

================
Comment at: lib/CodeGen/CGStmtOpenMP.cpp:2914
@@ -2713,4 +2913,3 @@
   if (NT || TL) {
-    NumTeamsVal = (NT) ? CGF.EmitScalarExpr(NT->getNumTeams(),
-        /* IgnoreResultAssign = */ true) :
+    NumTeamsVal = (NT) ? CGF.EmitScalarExpr(NT->getNumTeams(), true) :
         NumTeamsVal = CGF.Builder.getInt32(0);
----------------
Comment for 'true' arg? 


Repository:
  rL LLVM

http://reviews.llvm.org/D17170





More information about the cfe-commits mailing list