ABataev accepted this revision.
ABataev added a comment.
This revision is now accepted and ready to land.

LG



================
Comment at: clang/lib/CodeGen/CGOpenMPRuntime.cpp:9470-9471
+          MappedVarSet.insert(CI->getCapturedVar()->getCanonicalDecl());
+        else
+          MappedVarSet.insert(nullptr);
         if (CurBasePointers.empty())
----------------
jdenny wrote:
> ABataev wrote:
> > jdenny wrote:
> > > ABataev wrote:
> > > > jdenny wrote:
> > > > > ABataev wrote:
> > > > > > No need to insert `nullptr` here, it is not used later.
> > > > > Without this `nulltpr` insertion, many tests fail because of 
> > > > > duplicate map entries.  Independently of my patch, `nulltptr` is used 
> > > > > to indicate `this` capture (see the `generateInfoForCapture` 
> > > > > implementation) .
> > > > > 
> > > > > For example:
> > > > > 
> > > > > ```
> > > > > struct S {
> > > > >   int i;
> > > > >   void foo() {
> > > > >     #pragma omp target map(i)
> > > > >     i = 5;
> > > > >   }
> > > > > };
> > > > > ```
> > > > > 
> > > > > We should have:
> > > > > 
> > > > > ```
> > > > > @.offload_maptypes = private unnamed_addr constant [2 x i64] [i64 32, 
> > > > > i64 281474976710659]
> > > > > ```
> > > > > 
> > > > > Without the `nullptr` insertion, we have:
> > > > > 
> > > > > ```
> > > > > @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 32, 
> > > > > i64 281474976710659, i64 32, i64 844424930131971]
> > > > > ```
> > > > This is strange, because you don't check for `nullptr`. You only check 
> > > > for `ValueDecl`s, but not capture of `this`.
> > > I'm not sure what code you're referring to when you say "you check".
> > > 
> > > Both with and without my patch, my understanding is that `nullptr` is a 
> > > special key that means `this`.  I'm depending on that to avoid generating 
> > > map entries twice for `this`.
> > > 
> > > My understanding is based on the way `generateInfoForCapture` works.  If 
> > > `Cap->capturesThis()`, then `VD = nullptr`.  That `VD` is then used by 
> > > `C->decl_component_lists(VD)` to find entries for `this` in map clauses.
> > > 
> > > Unless I'm misreading it, the code that sets `nullptr` for `this` in decl 
> > > components is `checkMappableExpressionList` in SemaOpenMP.cpp.  The last 
> > > few lines of that function have a comment to this effect.  (That comment 
> > > would probably be more useful in a header file somewhere.)
> > `MappedVarSet` is a new variable, right? It is used only in 2 places: here, 
> > where you add elements to this set, and in `generateAllInfo` where you have 
> > a check:
> > ```
> > if (SkipVarSet.count(VD))
> >             return;
> > ```
> > I don't see other places where it is used. And I don't see places where you 
> > check for the presence of `nullptr` in this set. That's why I think you 
> > don't need to add it, if you don't check for its presence later.
> > MappedVarSet is a new variable, right?
> 
> Right.
> 
> > It is used only in 2 places: here, where you add elements to this set, and 
> > in generateAllInfo where you have a check:
> > 
> > ```
> > if (SkipVarSet.count(VD))
> >             return;
> > ```
> > I don't see other places where it is used.
> 
> That's all.
> 
> > And I don't see places where you check for the presence of nullptr in this 
> > set. That's why I think you don't need to add it, if you don't check for 
> > its presence later.
> 
> The `SkipVarSet.count(VD)` you mentioned checks for presence of any key in 
> order to avoid creating duplicate map entries.  `nullptr` is one such key.  
> It happens to indicate `this`.
> 
> For comparison, look inside `generateInfoForCapture` where the following code 
> establishes that `nullptr` is the key for `this`:
> 
> ```
>     const ValueDecl *VD = Cap->capturesThis()
>                               ? nullptr
>                               : Cap->getCapturedVar()->getCanonicalDecl();
> ```
> 
> After that, does `generateInfoForCapture` ever check for `VD == nullptr`?  I 
> don't see where it does.  But it does use `VD`, which might be `nulltpr`, as 
> a decl components key in the following code:
> 
> ```
>       for (const auto L : C->decl_component_lists(VD)) {
> ```
> 
> Likewise, my code is also using a `VD` that might be `nullptr` as a key in 
> `SkipVarSet`.  I don't have to special case `nullptr` at this point.  It's 
> just another key.
Ah, I see, I missed the previous line.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D83922/new/

https://reviews.llvm.org/D83922



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

Reply via email to