diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2015-03-03 00:49:28 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2015-03-03 00:49:28 +0000 |
commit | da2dbf21a9b3602f7a0f871dec15f03d273bc07b (patch) | |
tree | a95911ea036806e76b808fbca5c77d73499f3aa3 /llvm/lib/Analysis/ModuleDebugInfoPrinter.cpp | |
parent | 72029c6f2fdc73ca9a323052d97d3a65609a6651 (diff) | |
download | llvm-da2dbf21a9b3602f7a0f871dec15f03d273bc07b.zip llvm-da2dbf21a9b3602f7a0f871dec15f03d273bc07b.tar.gz llvm-da2dbf21a9b3602f7a0f871dec15f03d273bc07b.tar.bz2 |
LowerBitSets: Use byte arrays instead of bit sets to represent in-memory bit sets.
By loading from indexed offsets into a byte array and applying a mask, a
program can test bits from the bit set with a relatively short instruction
sequence. For example, suppose we have 15 bit sets to lay out:
A (16 bits), B (15 bits), C (14 bits), D (13 bits), E (12 bits),
F (11 bits), G (10 bits), H (9 bits), I (7 bits), J (6 bits), K (5 bits),
L (4 bits), M (3 bits), N (2 bits), O (1 bit)
These bits can be laid out in a 16-byte array like this:
Byte Offset
0123456789ABCDEF
Bit
7 HHHHHHHHHIIIIIII
6 GGGGGGGGGGJJJJJJ
5 FFFFFFFFFFFKKKKK
4 EEEEEEEEEEEELLLL
3 DDDDDDDDDDDDDMMM
2 CCCCCCCCCCCCCCNN
1 BBBBBBBBBBBBBBBO
0 AAAAAAAAAAAAAAAA
For example, to test bit X of A, we evaluate ((bits[X] & 1) != 0), or to
test bit X of I, we evaluate ((bits[9 + X] & 0x80) != 0). This can be done
in 1-2 machine instructions on x86, or 4-6 instructions on ARM.
This uses the LPT multiprocessor scheduling algorithm to lay out the bits
efficiently.
Saves ~450KB of instructions in a recent build of Chromium.
Differential Revision: http://reviews.llvm.org/D7954
llvm-svn: 231043
Diffstat (limited to 'llvm/lib/Analysis/ModuleDebugInfoPrinter.cpp')
0 files changed, 0 insertions, 0 deletions