[LLVMdev] [RFC] Setting preserve-bc-use-list-order=true by default

Duncan P. N. Exon Smith dexonsmith at apple.com
Thu Apr 9 10:45:53 PDT 2015


Committed in r234510.

> On 2015-Apr-01, at 07:55, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
> 
> This is fine by me.
> 
> It would be nice to have an easier way to edit a .ll with order
> information, but that should not be a blocker.
> 
> On 31 March 2015 at 22:10, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>> A while back I finished up some work [1] that Chad started to preserve
>> use-list-order in bitcode [2], hidden behind an "experimental" option
>> called `-preserve-bc-use-list-order`.  I then added a similar
>> `-preserve-ll-use-list-order` option for LLVM assembly [3].
>> 
>> [1]: http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-July/074604.html
>> [2]: https://llvm.org/bugs/show_bug.cgi?id=5680
>> [3]: https://llvm.org/bugs/show_bug.cgi?id=20515
>> 
>> I'd like to move both of these options out of "experimental" mode, and
>> turn `-preserve-bc-use-list-order` on by default.  I've attached a patch
>> that does this.
>> 
>> Why?
>> ====
>> 
>> Use-list order affects the output of some LLVM passes.  A typical
>> example is a pass that walks through basic block predecessors.  The
>> use-list order is deterministic, but not preserved when serializing the
>> LLVM IR to bitcode or assembly.
>> 
>> In rare (but frustrating) cases, this makes it difficult to reproduce a
>> crash or miscompile from an intermediate result.
>> 
>> For example, consider running an LTO build and serializing between the
>> LTO optimization pipeline and the LTO codegen pipeline.  On SPEC,
>> serializing to/from bitcode will change the output executable in 33
>> benchmarks.  If you use `-preserve-bc-use-list-order`, all executables
>> match.
>> 
>> How?
>> ====
>> 
>> Have a look at `BitcodeReader::ParseUseLists()` and
>> `predictUseListOrder()` in `lib/Bitcode/Writer/ValueEnumerator.cpp`.
>> 
>> Does it degrade smoothly if IR changes?
>> =======================================
>> 
>> Yes.  If a `Value`'s use-list has changed in size (e.g., because of
>> bitcode upgrades), its use-list order record is ignored.
>> 
>> What does it cost?
>> ==================
>> 
>> Manman collected a bunch of numbers, with `-preserve-bc-use-list-order`
>> and `-preserve-ll-use-list-order` both turned on:
>> 
>>  - Time increase on LTO build time: negligible.
>>  - Filesize increase in bitcode files output by `clang -flto`:
>>      - clang: 6.8556% (sum when from 310412640 to 331693296 bytes).
>>  - Filesize increase in merged bitcode files (output of
>>    `ld -save-temps` when using `clang -flto` on Darwin).
>>      — SPEC: 5.24% to 23.4% increase in file size.
>>      — clang and related tools: 0.83% to 9.19% (details in
>>        filesize_clang.txt, attached).
>>  - Time increase of running `llvm-dis` on merged bitcode files:
>>      — 6.4% to 15% on SPEC benchmarks with running time >= 1 second.
>>      — 7.9% to 14.5% on clang with running time >= 1 second (details in
>>        dis_clang.txt, attached).
>>  - Time increase of running `llvm-as` on merged bitcode files:
>>      — 3.5% to 39% on SPEC benchmarks with running time >= 1 second.
>>      — 14.7% to 24.5% with running time >= 1 second (details in
>>        as_clang.txt, attached).
>> 
>> Does it work?
>> =============
>> 
>> Manman also ran `verify-uselistorder` (a use-list fuzzer that shuffles
>> use-lists, serializes IR, compares use-lists, rinses, repeats), on the
>> merged bitcode files above.  After I fixed a bug in assembly
>> serialization in r232200, they all come up clean.
>> 
>> Why leave -preserve-ll-use-list-order=false by default?
>> =======================================================
>> 
>> Firstly, our practise is to error on mismatches in LLVM assembly (unlike
>> bitcode where we upgrade or drop old formats).  Printing use-list
>> directives by default would make it almost impossible to update an
>> assembly file by hand without stripping out the directives.
>> 
>> Secondly, use-list order is encoded as a "shuffle", which isn't
>> human-friendly.  I'm not convinced this adds value to textual IR except
>> in rare cases where a developer actually wants to see the order, or
>> wants to try to make a change without perturbing the use-lists.
>> 
>> Nevertheless, the option works.  An LLVM developer can turn it on and
>> hack at the IR, and `llvm-as` will complain if the developer makes the
>> `uselistorder` directives inconsistent.  The developer can choose
>> whether to delete the mismatched directives or to update them.
>> 
>> 
>> 
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list