rjmccall added inline comments.

================
Comment at: clang/lib/CodeGen/CGExpr.cpp:3952
+           CGM.getOpenMPRuntime().isNontemporalDecl(Field)) ||
+          (!E->isArrow() && BaseLV.isNontemporal()))
+        LV.setNontemporal(/*Value=*/true);
----------------
ABataev wrote:
> ABataev wrote:
> > rjmccall wrote:
> > > Is the `!E->isArrow()` condition necessary here?  Why not just propagate 
> > > the non-temporality of the base?
> > > 
> > > Similarly, what's the case in which the declaration is marked 
> > > non-temporal and you *don't* want to trust that?
> > That's the main question. I try to mimic the behavior we currenty have in 
> > the codegen. If the lvalue for the pointer is marked as nontemporal, only 
> > loads/stores for the pointer itself are marked as nontemporal. Operations 
> > with the memory it points to are not marked as nontemporal. I'm trying to 
> > do the same. E.g., if have something like `a.b->c` and `a` is nontemporal, 
> > then only `a.b = x;` must be marked as nontemporal, but not `a.b->c = x;`
> > Similarly, what's the case in which the declaration is marked non-temporal 
> > and you *don't* want to trust that?
> 
> There is no such case. We can mark `this->member` as nontemporal or 
> `declref`. The first check here checks if we have `this->member` marked as 
> nontemporal, the second check just propagates the flag if the base is marked 
> as nontemporal.
Okay.  Then this should just be `(BaseLV.isNontemporal() || 
CGM.getOpenMPRuntime().isNontemporalDecl(Field))`.


================
Comment at: clang/lib/CodeGen/CGOpenMPRuntime.cpp:11349
+  NontemporalDeclsSet &DS =
+      CGM.getOpenMPRuntime().NontemporalDeclsStack.emplace_back();
+  // No need to check for nontemporal clauses in non-simd directives.
----------------
ABataev wrote:
> rjmccall wrote:
> > This is effectively clearing the active non-temporal decls set.  Is that 
> > okay (even for the non-SIMD directives?), or should the current set be 
> > copied?
> Yes, it must be copied, thanks.
Okay.  I see that you're now scanning the whole list, which is probably better 
than copying, but could you leave a comment here saying that that's how it 
works?

I'd also suggest only pushing something onto the stack if you actually have any 
non-temporal clauses; it should be easy enough to remember in the RAII object 
whether you pushed.


================
Comment at: clang/lib/CodeGen/CGOpenMPRuntime.h:663
+  using NontemporalDeclsSet = llvm::SmallDenseSet<CanonicalDeclPtr<const 
Decl>>;
+  /// Stack for list of declaration in current context marked as nontemporal.
+  llvm::SmallVector<NontemporalDeclsSet, 4> NontemporalDeclsStack;
----------------
Please add to this comment that the real set is the union of all the current 
stack elements, not just the innermost set.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71708



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

Reply via email to