sfantao added a comment.

Hi Alexey,

I am afraid I don't understand  what you are trying to accomplish with this. I 
was unable to compile your patch as is, I think what you intended is something 
like this:

  // If we are mapping a field of 'this' we attempt to generate a
  // OMPCapturedExprDecl for it. The logic above, already ensures that if we
  // map a member expression its base is 'this'.
  Expr *VarsExpr = RE->IgnoreParens();
  if (isa<MemberExpr>(BE)) {
    DeclRefExpr *Ref;
    VarsExpr = Ref = buildCapture(*this, D, BE, /*WithInit=*/true);
    if (!IsOpenMPCapturedDecl(D))
      ExprCaptures.push_back(Ref->getDecl());
  }

However, I am not sure how this helps in this case. The map clause will have 
expressions that refer to the dummy declaration, but the region captured 
arguments are unchanged, so we still get 'this' and the content of the map 
clause has to relate to that.

Say we have some user code like this:

  struct S {
    int A;
    foo() { ++ A; }
    bar() {
      #pragma target map(A)
      {
        ++A;
        foo()
      }
  }

The kernel argument is going to be `this` regardless the map clause. The map 
clause only makes sure that a section of `this` is copied and not everything, 
so I rather not separate the field from the rest (for the same reason we do not 
separate the array declaration from a subscript or section). `this` still has 
to be passed to foo().

Is it your goal to pass arguments to the outlined region individually? I don't 
think your code was trying to do that, am I wrong? Even if we manage to change 
the captures so that fields are passed individually, `this` would have to be 
rematerialized inside `bar()`.

Am I missing something?

Thanks!
Samuel


http://reviews.llvm.org/D16749



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

Reply via email to