sfantao added a comment.

Hi Alexey


================
Comment at: lib/CodeGen/CGOpenMPRuntime.cpp:3799-3806
@@ -3780,4 +3798,10 @@
   OffloadEntriesInfoManager.registerTargetRegionEntryInfo(
       DeviceID, FileID, ParentName, Line, OutlinedFn, OutlinedFnID);
 }
 
+/// \brief Emit the num_teams clause of an enclosed teams directive at the
+/// target region scope. If there is no teams directive associated with the
+/// target directive, or if there is no num_teams clause associated with the
+/// enclosed teams directive, return nullptr.
+static llvm::Value *
+emitNumTeamsClauseForTargetDirective(CodeGenFunction &CGF,
----------------
ABataev wrote:
> sfantao wrote:
> > ABataev wrote:
> > > I don't understand why global var is not captured in target region. If it 
> > > is not implemented yet, it must be implemented. If it is not captured, it 
> > > must be captured in Sema. We should not introduce some function/other 
> > > objects to find a workaround for 'not implemented' features.
> > Sorry, I was not clear in my comment. It is not that globals are not 
> > captured in target regions - they are, we already have Sema doing that. 
> > 
> > My point is that exactly because we capture globals in target regions the 
> > magic that `OMPCapturedExprDecl` introduces does not work for that specific 
> > case. So, if we have something like:
> > 
> > ```
> > int Gbl;
> > 
> > foo() {
> >   #pragma omp target
> >   #pragma omp teams num_teams(Gbl)
> >   {}
> > }
> > ```
> > when the DeclRefExpr for Gbl used in num_teams is emitted in the scope that 
> > encloses '#pragma omp target', it will crash because Gbl is not a local and 
> > is marked as refer to enclosing capture. 
> > 
> > If I got it right, a solution based on `OMPCapturedExprDecl` basically 
> > makes local declarations whose initializers are the expression we are 
> > interested in. In the cases that  `OMPCapturedExprDecl` is currently 
> > employed we don't have globals being captured and that is why it works fine.
> > 
> > It is likely I am missing something here. Let me know if you need me to 
> > provide more details.
> > 
> > Thanks!
> It should not crash, because if it is captured, we must use captured version 
> of this variable, passed in arguments to outlined function
I am afraid I may not be understanding what you want me to do. Going back to my 
example:

```
int Gbl;

foo() {
  // a) I need to emit num_teams(Gbl) here. DeclRefExpr(Gbl) emission won't 
work because it is marked "refer to enclosing capture". 
  #pragma omp target
  // b) If I emit it here, that's fine because I already have the arguments of 
the outlined function, but that is not what I need.
  #pragma omp teams num_teams(Gbl)
  {}
}
```
Can you please elaborate on how `OMPCapturedExprDecl` would help me implement 
a). Sorry for the trouble.

Thanks!


http://reviews.llvm.org/D17019



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to