[PATCH] D28753: [OpenMP] Codegen support for 'target parallel' on the host.

Alexey Bataev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 17 09:17:25 PST 2017

ABataev added inline comments.

Comment at: lib/CodeGen/CGOpenMPRuntime.h:543
   virtual llvm::Value *emitParallelOrTeamsOutlinedFunction(
-      const OMPExecutableDirective &D, const VarDecl *ThreadIDVar,
-      OpenMPDirectiveKind InnermostKind, const RegionCodeGenTy &CodeGen);
+      const OMPExecutableDirective &D, const CapturedStmt *CS,
+      const VarDecl *ThreadIDVar, OpenMPDirectiveKind InnermostKind,
arpith-jacob wrote:
> ABataev wrote:
> > I don't think you need to pass a new `CS` parameter here, you can use `InnermostKind` param as an arg to `getCapturedStmt()` function
> Hi Alexey, this is tricky.
> emitParallelOrTeamsOutlinedFunction() is called from emitCommonOMPParallelDirective(...InnermostKind...).  Here is how that function is called for 'parallel for'.
> ```
> void CodeGenFunction::EmitOMPParallelForDirective(
>     const OMPParallelForDirective &S) {
>   ...
>   emitCommonOMPParallelDirective(*this, S, /*InnermostKind=*/OMPD_for, CodeGen);
> }
> ```
> You'll notice that InnermostKind is OMPD_for.  OMPD_for does not have a CapturedStmt, only the OMPD_parallel part.  So we cannot use the InnermostKind variable.
> Here is an alternative solution:
> I will split emitParallelOrTeamsOutlinedFunction() to emitParallelOutlinedFunction() and emitTeamsOutlinedFunction().  I can then use getCapturedStmt(OMPD_parallel) and getCapturedStmt(OMPD_teams) respectively and I don't have to pass the CS parameter.
> I also think this makes sense because apart from the host, teams and parallel codegen are very different and so they should be in different routines.
> Let me know if you disagree.
Arpith, I'm ok with your idea


More information about the cfe-commits mailing list