serge-sans-paille marked an inline comment as done.
serge-sans-paille added inline comments.


================
Comment at: llvm/include/llvm/IR/Attributes.h:79
+  bool operator<(AttributeKey const &other) const {
+    return strcmp(value_, other.value_) < 0;
+  }
----------------
JonChesterfield wrote:
> Could order by size first here, then strncmp on equal sizes
I tend to agree, but that would change how attributes are pretty-printed, so 
I'd rather keep that for another review.


================
Comment at: llvm/lib/IR/AttributeImpl.h:214
 
-  DenseMap<StringRef, Attribute> StringAttrs;
+  std::unordered_map<AttributeKey, Attribute> StringAttrs;
 
----------------
MaskRay wrote:
> std::unordered_map is inefficient. Why is this change?
Because in the specific case of `AttrBuilder`, `std::unordered_map` is actually 
more efficient. `AttrBuilder` usually only handles a few elements, I even tried 
an implementation based on a sorted array and it was better than other 
alternatives in my benchmarks. But that's for another PR.


================
Comment at: llvm/lib/IR/Attributes.cpp:125
   FoldingSetNodeID ID;
-  ID.AddString(Kind);
+  ID.AddString(Kind.value());
   if (!Val.empty()) ID.AddString(Val);
----------------
mehdi_amini wrote:
> Carrying over my comment from the original revision: it seem that you're ever 
> only using the StringRef from the Kind in this function.
> If so changing the API to use an AttributeKey seems pessimizing to me?
`Kind` is actually also used as a parameter of `StringAttributeImpl` which has 
been updated to store an AttributeKey, so that would just move the AttributeKey 
creation from the caller to the internal implementation.
And I'd rather have an homogeneous API alongside all string Attribute creation.


================
Comment at: llvm/lib/IR/Attributes.cpp:862
+  auto Where = StringAttrs.find(Kind);
+  return Where != StringAttrs.end() ? Where->second : Attribute();
 }
----------------
MaskRay wrote:
> `lookup`
Not for `std::unordered_map` :-/


================
Comment at: llvm/lib/IR/Attributes.cpp:2054
+  auto &AttributeKeys = pImpl->AttributeKeys;
+  auto Where = AttributeKeys.find(s);
+  if (Where == AttributeKeys.end()) {
----------------
MaskRay wrote:
> If you change `AttributeKeys` to `DenseMap<CachedHashStringRef, ...>`, you 
> can construct a `CachedHashStringRef` and avoid a hash computation in 
> `AttributeKey Key(s);`
I was looking for something along these lines, thanks!


================
Comment at: llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp:1531
 static StringRef getDeoptLowering(CallBase *Call) {
-  const char *DeoptLowering = "deopt-lowering";
+  const char DeoptLowering[] = "deopt-lowering";
   if (Call->hasFnAttr(DeoptLowering)) {
----------------
MaskRay wrote:
> This can be committed separately.
Actually it cannot, because the `AttributeKey` constructor accepts a `char 
const (&) [N]` in order to get a compile-time size, and `const char*` doesn 
match this signature.


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

https://reviews.llvm.org/D114394

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

Reply via email to