Bitcode: Serialize (and recover) use-list order
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 28 Jul 2014 21:19:41 +0000 (21:19 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Mon, 28 Jul 2014 21:19:41 +0000 (21:19 +0000)
commit1f66c856b54e32e6590d1333fc8a60d56979edb8
tree768875d352946ca33ca6773c03aada1ebb4f3c24
parentf59b735a80004aa951e6f5e250231eb4b6fb18c8
Bitcode: Serialize (and recover) use-list order

Predict and serialize use-list order in bitcode.  This makes the option
`-preserve-bc-use-list-order` work *most* of the time, but this is still
experimental.

  - Builds a full value-table up front in the writer, sets up a list of
    use-list orders to write out, and discards the table.  This is a
    simpler first step than determining the order from the various
    overlapping IDs of values on-the-fly.

  - The shuffles stored in the use-list order list have an unnecessarily
    large memory footprint.

  - `blockaddress` expressions cause functions to be materialized
    out-of-order.  For now I've ignored this problem, so use-list orders
    will be wrong for constants used by functions that have block
    addresses taken.  There are a couple of ways to fix this, but I
    don't have a concrete plan yet.

  - When materializing functions lazily, the use-lists for constants
    will not be correct.  This use case is out of scope: what should the
    use-list order be, if it's incomplete?

This is part of PR5680.

llvm-svn: 214125
llvm/include/llvm/Bitcode/LLVMBitCodes.h
llvm/include/llvm/IR/UseListOrder.h
llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/lib/Bitcode/Reader/BitcodeReader.h
llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
llvm/lib/Bitcode/Writer/ValueEnumerator.h
llvm/test/Bitcode/use-list-order.ll
llvm/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp