Use ArrayRecycler for MachineInstr operand lists.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 5 Jan 2013 05:00:09 +0000 (05:00 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 5 Jan 2013 05:00:09 +0000 (05:00 +0000)
commitf1d015f3429f611c423f943c75f86e6823810dc3
tree16a64afd13e03a5d1ff16ed1a582b60d11469215
parentbced5cd924e47818d67e33b3ae1550ab96fc239a
Use ArrayRecycler for MachineInstr operand lists.

Instead of an std::vector<MachineOperand>, use MachineOperand arrays
from an ArrayRecycler living in MachineFunction.

This has several advantages:

- MachineInstr now has a trivial destructor, making it possible to
  delete them in batches when destroying MachineFunction. This will be
  enabled in a later patch.

- Bypassing malloc() and free() can be faster, depending on the system
  library.

- MachineInstr objects and their operands are allocated from the same
  BumpPtrAllocator, so they will usually be next to each other in
  memory, providing better locality of reference.

- Reduce MachineInstr footprint. A std::vector is 24 bytes, the new
  operand array representation only uses 8+4+1 bytes in MachineInstr.

- Better control over operand array reallocations. In the old
  representation, the use-def chains would be reordered whenever a
  std::vector reached its capacity. The new implementation never changes
  the use-def chain order.

Note that some decisions in the code generator depend on the use-def
chain orders, so this patch may cause different assembly to be produced
in a few cases.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171598 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/MachineFunction.h
include/llvm/CodeGen/MachineInstr.h
include/llvm/CodeGen/MachineOperand.h
lib/CodeGen/MachineFunction.cpp
lib/CodeGen/MachineInstr.cpp