[PATCH] D17170: [OPENMP] Codegen for distribute directive
Carlo Bertolli via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 16 12:58:37 PST 2016
carlo.bertolli marked an inline comment as done.
carlo.bertolli added a comment.
I have addressed some of the comments and restructured the code as requested.
Let me know about further comments.
Thanks for making this a better patch!
================
Comment at: lib/CodeGen/CGOpenMPRuntime.h:669-692
@@ -668,1 +668,26 @@
+ /// \brief Schedule types for 'omp for' loops (these enumerators are taken from
+ /// the enum sched_type in kmp.h).
+ enum OpenMPSchedType {
+ /// \brief Lower bound for default (unordered) versions.
+ OMP_sch_lower = 32,
+ OMP_sch_static_chunked = 33,
+ OMP_sch_static = 34,
+ OMP_sch_dynamic_chunked = 35,
+ OMP_sch_guided_chunked = 36,
+ OMP_sch_runtime = 37,
+ OMP_sch_auto = 38,
+ /// \brief Lower bound for 'ordered' versions.
+ OMP_ord_lower = 64,
+ OMP_ord_static_chunked = 65,
+ OMP_ord_static = 66,
+ OMP_ord_dynamic_chunked = 67,
+ OMP_ord_guided_chunked = 68,
+ OMP_ord_runtime = 69,
+ OMP_ord_auto = 70,
+ /// \brief dist_schedule types
+ OMP_dist_sch_static_chunked = 91,
+ OMP_dist_sch_static = 92,
+ OMP_sch_default = OMP_sch_static,
+ };
+
----------------
Fixed - now everything related to the openmp library is encapsulated back into the CGOpenMPRuntime.cpp file.
================
Comment at: lib/CodeGen/CGOpenMPRuntime.h:717-725
@@ -682,2 +716,11 @@
+ /// \brief Check if the specified \a DistScheduleKind is static non-chunked.
+ /// This kind of distribute directive is emitted without outer loop.
+ /// \param ScheduleKind DistSchedule kind specified in the 'dist_schedule'
+ /// clause.
+ /// \param Chunked True if chunk is specified in the clause.
+ ///
+ virtual bool isDistStaticNonchunked(OpenMPDistScheduleClauseKind ScheduleKind,
+ bool Chunked) const;
+
virtual void emitForDispatchInit(CodeGenFunction &CGF, SourceLocation Loc,
----------------
No difference: deleted the latter.
================
Comment at: lib/CodeGen/CGStmtOpenMP.cpp:1540-1541
@@ +1539,4 @@
+ const bool IVSigned = IVExpr->getType()->hasSignedIntegerRepresentation();
+
+ RT.emitDistributeStaticInit(*this, S.getLocStart(), ScheduleKind,
+ IVSize, IVSigned, IL, LB, UB, ST, Chunk);
----------------
If this is about missing comments for booleans - done.
Otherwise, please be specific about the bad formatting I did.
================
Comment at: lib/CodeGen/CGStmtOpenMP.cpp:2185-2216
@@ -2147,2 +2184,34 @@
}
+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;
+ }
+ }
+ if (!C->getHelperChunkSize() || !OuterRegion) {
+ Chunk = CGF.EmitScalarExpr(Ch);
+ Chunk = CGF.EmitScalarConversion(Chunk, Ch->getType(),
+ S.getIterationVariable()->getType(),
+ S.getLocStart());
+ }
+ }
+ }
+ return std::make_pair(Chunk, ScheduleKind);
+}
+
----------------
I will wait until a new patch related to this is submitted - if it has not already.
================
Comment at: lib/CodeGen/CodeGenFunction.h:2405
@@ -2397,2 +2404,3 @@
OpenMPDirectiveKind EmitSections(const OMPExecutableDirective &S);
+ void EmitOMPDistributeLoop(const OMPDistributeDirective &S);
----------------
Made EmitOMPDistributeLoop public. What else needs to be public?
Repository:
rL LLVM
http://reviews.llvm.org/D17170
More information about the cfe-commits
mailing list