kazutakahirata wrote: @kuhar I understand that you are working on improving the performance of `llvm::append_range`.
I did some experiment with this PR: - I taught `llvm::append_range` to: - automatically call `Container::reserve` if the given range is a pointer or `std::random_access_iterator_tag`, and - crash on capacity changes after calling `Container::insert`. - I built a debug version of compiler (for clean stack traces). - I used the debug version of the compiler to build an optimized version of clang while manually adding `reserve` to fix crashes. One noteworthy point is that I only needed to add a dozen or so calls to `reserve`. Some ranges are of sets like `SmallPtrSet`, so `size()` is immediately available. We might even upstream those calls. Others require linear walk, so we shouldn't upstream those. I'm wondering if porting those `reserve()` calls on `SmallPtrSet` and such to your patch (https://github.com/llvm/llvm-project/pull/136365) might improve the performance. Also, I am wondering if your patch needs to deal with pointer ranges like `char *`, which I assume doesn't have an iterator category. Note that `ArrayRef` uses pointers as iterator types. We could detect the presence of `size()` on ranges and use that as a hint when given ranges are neither pointer nor `std::random_access_iterator_tag`. Alternatively, we could manually add calls to `reserve()` just before `append_range` where ranges come with `size()`, which we could detect with some temporary template meta-programming hacks to `append_range`. https://github.com/llvm/llvm-project/pull/136543 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits