mboehme added a comment.

In D126061#3585681 <https://reviews.llvm.org/D126061#3585681>, @nikic wrote:

> FYI this change had a measurable effect on compile-time 
> (http://llvm-compile-time-tracker.com/compare.php?from=7acc88be0312c721bc082ed9934e381d297f4707&to=8c7b64b5ae2a09027c38db969a04fc9ddd0cd6bb&stat=instructions),
>  about 0.5% regression for `O0` builds. Not sure if that's expected.

I've found the reason for this slowdown, and a fix.

In a number of places, this patch adds additional local variables of type 
`ParsedAttributes`, typically because we need to keep track of declaration and 
decl-specifier-seq attributes in two separate `ParsedAttribute` lists where 
previously we were putting them in the same list. Note that in the vast 
majority of cases, these `ParsedAttributes` lists are empty.

I would have assumed that creating an empty `ParsedAttributes`, potentially 
iterating over it, then destroying it, is cheap. However, this is not true for 
`ParsedAttributes` because it uses a `TinyPtrVector` as the underlying 
container. The same is true for the `AttributePool` that `ParsedAttributes` 
contains.

`TinyPtrVector` is amazingly memory-frugal in that it consumes only a single 
pointer worth of memory if the vector contains zero or one elements. However, 
this comes at a cost: `begin()` and `end()` on this container are relatively 
expensive. As a result, iterating over an empty `TinyPtrVector`


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D126061

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

Reply via email to