[lld] r246869 - COFF: Use section content checksum for ICF.
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 16 16:08:32 PDT 2015
On Wed, Sep 16, 2015 at 3:46 PM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> This optimization seems very effective. I picked up a program
> mksnapshot.exe from Chromium and measure the time LLD spends on ICF. The
> program contains 27645 COMDAT sections, of which 4501 sections are
> redundant. The output size after ICF is 9MB.
>
> Without this patch, LLD takes 93 ms to scan and group all COMDAT sections.
> The number of hash collisions that had to be resolved by compare section
> contents was 1335211.
>
> With this patch, LLD takes only 33 ms to do the same thing. There was *no*
> false hash collision (but we still had to compare contents for positive
> case because the section hash value is just a CRC32 and not a cryptographic
> one).
>
> So this is working as we hoped, and that's probably important because ICF
> is on by default.
>
\o/
Got any comparative numbers with link.exe? (specifically I was curious
about your recent fixes to ICF which mention smaller binary size than
link.exe & I was wondering if you had any ideas what the difference was
there - but also just tracking the exact comdat functions and deduplication
& see if we get exactly the same answers as link.exe?)
>
> On Fri, Sep 4, 2015 at 1:45 PM, Rui Ueyama via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: ruiu
>> Date: Fri Sep 4 15:45:50 2015
>> New Revision: 246869
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=246869&view=rev
>> Log:
>> COFF: Use section content checksum for ICF.
>>
>> Previously, we calculated our own hash values for section contents.
>> Of coruse that's slow because we had to access all bytes in sections.
>> Fortunately, COFF objects usually contain hash values for COMDAT
>> sections. We can use that to speed up Identical COMDAT Folding.
>>
>> Modified:
>> lld/trunk/COFF/Chunks.h
>> lld/trunk/COFF/ICF.cpp
>> lld/trunk/COFF/InputFiles.cpp
>>
>> Modified: lld/trunk/COFF/Chunks.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Chunks.h?rev=246869&r1=246868&r2=246869&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/COFF/Chunks.h (original)
>> +++ lld/trunk/COFF/Chunks.h Fri Sep 4 15:45:50 2015
>> @@ -183,6 +183,10 @@ public:
>> // and this chunk is considrered as dead.
>> SectionChunk *Ptr;
>>
>> + // The CRC of the contents as described in the COFF spec 4.5.5.
>> + // Auxiliary Format 5: Section Definitions. Used for ICF.
>> + uint32_t Checksum = 0;
>> +
>> private:
>> ArrayRef<uint8_t> getContents() const;
>>
>>
>> Modified: lld/trunk/COFF/ICF.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/ICF.cpp?rev=246869&r1=246868&r2=246869&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/COFF/ICF.cpp (original)
>> +++ lld/trunk/COFF/ICF.cpp Fri Sep 4 15:45:50 2015
>> @@ -44,7 +44,7 @@ uint64_t SectionChunk::getHash() const {
>> NumRelocs,
>> uint32_t(Header->SizeOfRawData),
>> std::distance(Relocs.end(), Relocs.begin()),
>> - hash_combine_range(A.data(), A.data() + A.size()));
>> + Checksum);
>> }
>>
>> // Returns true if this and a given chunk are identical COMDAT sections.
>> @@ -58,6 +58,8 @@ bool SectionChunk::equals(const SectionC
>> return false;
>> if (NumRelocs != X->NumRelocs)
>> return false;
>> + if (Checksum != X->Checksum)
>> + return false;
>>
>> // Compare data
>> if (getContents() != X->getContents())
>>
>> Modified: lld/trunk/COFF/InputFiles.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=246869&r1=246868&r2=246869&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/COFF/InputFiles.cpp (original)
>> +++ lld/trunk/COFF/InputFiles.cpp Fri Sep 4 15:45:50 2015
>> @@ -225,13 +225,14 @@ Defined *ObjectFile::createDefined(COFFS
>> if (!SC)
>> return nullptr;
>>
>> - // Handle associative sections
>> + // Handle section definitions
>> if (IsFirst && AuxP) {
>> auto *Aux = reinterpret_cast<const coff_aux_section_definition
>> *>(AuxP);
>> if (Aux->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE)
>> if (auto *ParentSC = cast_or_null<SectionChunk>(
>> SparseChunks[Aux->getNumber(Sym.isBigObj())]))
>> ParentSC->addAssociative(SC);
>> + SC->Checksum = Aux->CheckSum;
>> }
>>
>> auto *B = new (Alloc) DefinedRegular(this, Sym, SC);
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
> _______________________________________________
> 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/20150916/2eca24c5/attachment.html>
More information about the llvm-commits
mailing list