ABataev marked 3 inline comments as done.
ABataev added inline comments.

================
Comment at: clang/include/clang/Basic/OpenMPKinds.h:43
+/// Struct to store the context selectors info.
+template <typename T, typename VectorType = llvm::ArrayRef<T>>
+struct OpenMPCtxSelectorData {
----------------
jdoerfert wrote:
> ABataev wrote:
> > jdoerfert wrote:
> > > ABataev wrote:
> > > > jdoerfert wrote:
> > > > > I feel uneasy about using an ArrayRef for storage as it can easily 
> > > > > lead to UB when the underlying values go out of scope.
> > > > This structure is used in 2 ways: 1. Store the data befoere creating 
> > > > the attribute (which will store all the data). 2. Generalize data later 
> > > > atthe codegen phase without allocating new memory (the data is alredy 
> > > > stored in the attribute and don't need to allocate it several times).
> > > That might all be true but it does not address my comments. I argue that 
> > > this is easy to be misused not that it will not work right now. For me 
> > > this is a potentially misused performance improvement, a combination we 
> > > should not introduce.
> > > 
> > > You could, for example, remove the ArrayRef default parameter and make it 
> > > explicit at the instantiation sites. Though, I'd actually prefer owning 
> > > the data here, e.g., in a SmallVector.
> > I can remove the default parameter, sure. But hen the attribute created 
> > already, we don't need to create a new container, we can use ArrayRefs 
> > which may point to the memory allocated for the attribute without danger of 
> > undefied behavior.
> My point is that there is always "danger of UB" if you point to memory 
> allocated somewhere else. At the end of the day, this is just a container but 
> one that may or may not own the underlying memory. If it does, people can use 
> it as they use any other container. If it does not, people may still sue it 
> as they use any other container but changes to the lifetime of the underlying 
> memory will potentially cause UB down the line.
> 
> There is little incentive to open up potential error sources only to optimize 
> for performance of something that is very likely not even visible in a 
> profile. I mean, we will not see the impact of am additional memcpy of 
> `sizeof(unsigned) * #ContextSelectors` bytes, or anything similar.
It is not about the performance rather than to reduce mem usage. We may have a 
lot of context selectors, very complex, associated woth the same function. And 
I don't think it is a bad idea to reuse the previously allocated memory rather 
than allocate a new one and increase the memory pressure for the compiler


================
Comment at: clang/include/clang/Basic/OpenMPKinds.h:56
+                                 OpenMPContextSelectorKind Ctx, const U &Names)
+      : CtxSet(CtxSet), Ctx(Ctx), Names(Names.begin(), Names.end()) {}
+};
----------------
jdoerfert wrote:
> ABataev wrote:
> > ABataev wrote:
> > > jdoerfert wrote:
> > > > ABataev wrote:
> > > > > jdoerfert wrote:
> > > > > > Why do you need a second template version here?
> > > > > To construct the object when the container Names cannot be created 
> > > > > dieectly using the first constructor (SmallVector and UniqueVector 
> > > > > are not quite compatible in this sence, for example)
> > > > That can be addressed by changing the first constructor. Why is it an 
> > > > xvalue there and why is the container not const?
> > > In short, to avoid some extra memory allocation/deallocation. I can make 
> > > the container const, ok.
> > Tried to make it `const`, it breaks a lot of code and almost impossible to 
> > fix
> ```
>   explicit OpenMPCtxSelectorData(OpenMPContextSelectorSetKind CtxSet,
>                                  OpenMPContextSelectorKind Ctx,
>                                  const VectorType &Names)
>       : CtxSet(CtxSet), Ctx(Ctx), Names(Names) {}
> ```
> 
> Is what I meant. It should also remove the need for the second constructor.
We may have a different comtainer type there, like `UniqurVector`, or 
itertor_range, for example, or something else, not completely compatible with 
the `VectorType` itself.


================
Comment at: clang/include/clang/Basic/OpenMPKinds.h:57
+      : CtxSet(CtxSet), Ctx(Ctx), Names(Names.begin(), Names.end()) {}
+};
+
----------------
jdoerfert wrote:
> ABataev wrote:
> > jdoerfert wrote:
> > > ABataev wrote:
> > > > jdoerfert wrote:
> > > > > It seems we always associate a scope with this class (even if the 
> > > > > type of the scope varies), right? If so we can add it into this class 
> > > > > to simplify the interfaces and tie them together in a nicer way.
> > > > What scope are you ralking about?
> > > "scope" was me thinking about the above issues while I was writing this 
> > > comment about the "score":
> > > 
> > > It seems we always associate a score with this class (even if the type of 
> > > the score varies), right? If so we can add it into this class to simplify 
> > > the interfaces and tie them together in a nicer way.
> > Ah, I see. We store scores in the different representations in different 
> > places. In parsing/sema the score is represented as ExprResult, while in 
> > codegen it is represented as llvm::APSInt. It means that we need to 
> > introduce another one template parameter for the score. Are you ok with the 
> > third template param for the type of the score?
> Yes, please. That ties the score directly to the name.
Ok, will do.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D69952



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

Reply via email to