[llvm] r266909 - IR: Use SmallVector instead of std::vector of TrackingMDRef

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 20 13:28:15 PDT 2016


On Wed, Apr 20, 2016 at 1:14 PM, Duncan P. N. Exon Smith via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dexonsmith
> Date: Wed Apr 20 15:14:09 2016
> New Revision: 266909
>
> URL: http://llvm.org/viewvc/llvm-project?rev=266909&view=rev
> Log:
> IR: Use SmallVector instead of std::vector of TrackingMDRef
>
> Don't use std::vector<TrackingMDRef>, since (at least in some versions
> of libc++) std::vector apparently copies values on grow operations
> instead of moving them.  Found this when I was temporarily deleting the
> copy constructor for TrackingMDRef to investigate a performance
> bottleneck.
>

Got a build log? That seems unlikely, since we have vectors of unique_ptr
in the codebase. Perhaps you used some specific operation that required a
copy?

I imagine the append you had in the previous patch? Should've been an
append with move_iterators? (& maybe that should've been 'assign' instead,
I think - in passing)


>
> Modified:
>     llvm/trunk/include/llvm/IR/DIBuilder.h
>     llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>     llvm/trunk/lib/IR/DIBuilder.cpp
>
> Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=266909&r1=266908&r2=266909&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
> +++ llvm/trunk/include/llvm/IR/DIBuilder.h Wed Apr 20 15:14:09 2016
> @@ -51,7 +51,11 @@ namespace llvm {
>      bool AllowUnresolvedNodes;
>
>      /// Each subprogram's preserved local variables.
> -    DenseMap<MDNode *, std::vector<TrackingMDNodeRef>> PreservedVariables;
> +    ///
> +    /// Do not use a std::vector.  Some versions of libc++ apparently copy
> +    /// instead of move on grow operations, and TrackingMDRef is
> expensive to
> +    /// copy.
> +    DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>>
> PreservedVariables;
>
>      DIBuilder(const DIBuilder &) = delete;
>      void operator=(const DIBuilder &) = delete;
>
> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=266909&r1=266908&r2=266909&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Wed Apr 20 15:14:09
> 2016
> @@ -107,7 +107,12 @@ class BitcodeReaderMetadataList {
>    bool AnyFwdRefs;
>    unsigned MinFwdRef;
>    unsigned MaxFwdRef;
> -  std::vector<TrackingMDRef> MetadataPtrs;
> +
> +  /// Array of metadata references.
> +  ///
> +  /// Don't use std::vector here.  Some versions of libc++ copy (instead
> of
> +  /// move) on resize, and TrackingMDRef is very expensive to copy.
> +  SmallVector<TrackingMDRef, 1> MetadataPtrs;
>
>    LLVMContext &Context;
>  public:
>
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=266909&r1=266908&r2=266909&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Wed Apr 20 15:14:09 2016
> @@ -614,7 +614,7 @@ DIGlobalVariable *DIBuilder::createTempG
>
>  static DILocalVariable *createLocalVariable(
>      LLVMContext &VMContext,
> -    DenseMap<MDNode *, std::vector<TrackingMDNodeRef>>
> &PreservedVariables,
> +    DenseMap<MDNode *, SmallVector<TrackingMDNodeRef, 1>>
> &PreservedVariables,
>      DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
>      unsigned LineNo, DIType *Ty, bool AlwaysPreserve, unsigned Flags) {
>    // FIXME: Why getNonCompileUnitScope()?
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160420/fa23c795/attachment.html>


More information about the llvm-commits mailing list