[lld] r268056 - ELF: Add -O0 (produce output as fast as possible) mode.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 29 16:35:17 PDT 2016


Touched a single cc file and and rerun ninja check-clang with and without
-O0. The two cases were in the same ballpark.

With -O0

Testing Time: 71.21s
  Expected Passes    : 9253
  Expected Failures  : 16
  Unsupported Tests  : 18

real    2m8.528s
user    30m7.967s
sys     5m54.938s

Without -O0

Testing Time: 72.62s
  Expected Passes    : 9253
  Expected Failures  : 16
  Unsupported Tests  : 18

real    2m9.602s
user    29m53.452s
sys     5m51.387s

On Fri, Apr 29, 2016 at 3:51 PM, David Blaikie <dblaikie at gmail.com> wrote:

> Anyone want to test how fast this is to touch a single cc file, relink,
> rerun all the clang+llvm tests using this option (preferrably on an SSD)?
>
> Be interesting to know if the increased code size slows down the test
> execution enough to wash out the benefit of the improved link time (as is
> the case with a shared library build - but of course there the overhead
> (loading the shared libraries) is greater)
>
> On Fri, Apr 29, 2016 at 9:12 AM, Rui Ueyama via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: ruiu
>> Date: Fri Apr 29 11:12:29 2016
>> New Revision: 268056
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=268056&view=rev
>> Log:
>> ELF: Add -O0 (produce output as fast as possible) mode.
>>
>> This patch redefines the default optimization level as 1 and adds
>> new level 0. In the command line, it is -O0. The flag disables
>> costly but optional features so that the linker produces semantically
>> correct but larger output quickly. Currently it only disables
>> section merging.
>>
>> This flag is not intended to be used for final production linking.
>> It is intended to be used in compile-link-test cycle.
>>
>> Time to link clang with debug info is about 2x faster with the flag.
>>
>>   Head:
>>   13.24 seconds
>>   Output size: 1227189664 bytes
>>
>>   With this patch:
>>   7.41 seconds
>>   Output size: 2490281784 bytes
>>
>> Differential Revision: http://reviews.llvm.org/D19705
>>
>> Modified:
>>     lld/trunk/ELF/Driver.cpp
>>     lld/trunk/ELF/InputFiles.cpp
>>     lld/trunk/test/ELF/merge-string.s
>>
>> Modified: lld/trunk/ELF/Driver.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=268056&r1=268055&r2=268056&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/Driver.cpp (original)
>> +++ lld/trunk/ELF/Driver.cpp Fri Apr 29 11:12:29 2016
>> @@ -356,7 +356,7 @@ void LinkerDriver::readConfigs(opt::Inpu
>>    Config->SoName = getString(Args, OPT_soname);
>>    Config->Sysroot = getString(Args, OPT_sysroot);
>>
>> -  Config->Optimize = getInteger(Args, OPT_O, 0);
>> +  Config->Optimize = getInteger(Args, OPT_O, 1);
>>    Config->LtoO = getInteger(Args, OPT_lto_O, 2);
>>    if (Config->LtoO > 3)
>>      error("invalid optimization level for LTO: " + getString(Args,
>> OPT_lto_O));
>>
>> Modified: lld/trunk/ELF/InputFiles.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=268056&r1=268055&r2=268056&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/InputFiles.cpp (original)
>> +++ lld/trunk/ELF/InputFiles.cpp Fri Apr 29 11:12:29 2016
>> @@ -143,6 +143,12 @@ elf::ObjectFile<ELFT>::getShtGroupEntrie
>>
>>  template <class ELFT> static bool shouldMerge(const typename ELFT::Shdr
>> &Sec) {
>>    typedef typename ELFT::uint uintX_t;
>> +
>> +  // We don't merge sections if -O0 (default is -O1). This makes
>> sometimes
>> +  // the linker significantly faster, although the output will be bigger.
>> +  if (Config->Optimize == 0)
>> +    return false;
>> +
>>    uintX_t Flags = Sec.sh_flags;
>>    if (!(Flags & SHF_MERGE))
>>      return false;
>>
>> Modified: lld/trunk/test/ELF/merge-string.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-string.s?rev=268056&r1=268055&r2=268056&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/test/ELF/merge-string.s (original)
>> +++ lld/trunk/test/ELF/merge-string.s Fri Apr 29 11:12:29 2016
>> @@ -4,6 +4,8 @@
>>  // RUN: llvm-readobj -s -section-data -t %t.so | FileCheck %s
>>  // RUN: ld.lld -O1 %t.o -o %t.so -shared
>>  // RUN: llvm-readobj -s -section-data -t %t.so | FileCheck
>> --check-prefix=NOTAIL %s
>> +// RUN: ld.lld -O0 %t.o -o %t.so -shared
>> +// RUN: llvm-readobj -s -section-data -t %t.so | FileCheck
>> --check-prefix=NOMERGE %s
>>
>>          .section       .rodata.str1.1,"aMS", at progbits,1
>>         .asciz  "abc"
>> @@ -55,6 +57,24 @@ zed:
>>  // NOTAIL-NEXT:   0000: 61626300 626300                     |abc.bc.|
>>  // NOTAIL-NEXT: )
>>
>> +// NOMERGE:      Name:    .rodata
>> +// NOMERGE-NEXT: Type:    SHT_PROGBITS
>> +// NOMERGE-NEXT: Flags [
>> +// NOMERGE-NEXT:   SHF_ALLOC
>> +// NOMERGE-NEXT:   SHF_MERGE
>> +// NOMERGE-NEXT:   SHF_STRINGS
>> +// NOMERGE-NEXT: ]
>> +// NOMERGE-NEXT: Address:         0x1C8
>> +// NOMERGE-NEXT: Offset:  0x1C8
>> +// NOMERGE-NEXT: Size:    16
>> +// NOMERGE-NEXT: Link: 0
>> +// NOMERGE-NEXT: Info: 0
>> +// NOMERGE-NEXT: AddressAlignment: 2
>> +// NOMERGE-NEXT: EntrySize: 0
>> +// NOMERGE-NEXT: SectionData (
>> +// NOMERGE-NEXT:   0000: 61626300 61626300 62630000 14000000
>> |abc.abc.bc......|
>> +// NOMERGE-NEXT: )
>> +
>>  // CHECK:      Name: .rodata
>>  // CHECK-NEXT: Type: SHT_PROGBITS
>>  // CHECK-NEXT: Flags [
>>
>>
>> _______________________________________________
>> 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/20160429/b6fa76a9/attachment.html>


More information about the llvm-commits mailing list