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

Arpith Jacob via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 17 08:20:33 PST 2017

arpith-jacob 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,
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.


More information about the cfe-commits mailing list