mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
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
This commit is contained in:
@ -78,6 +78,7 @@ MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
|
||||
MachineFunction::~MachineFunction() {
|
||||
BasicBlocks.clear();
|
||||
InstructionRecycler.clear(Allocator);
|
||||
OperandRecycler.clear(Allocator);
|
||||
BasicBlockRecycler.clear(Allocator);
|
||||
if (RegInfo) {
|
||||
RegInfo->~MachineRegisterInfo();
|
||||
@ -177,6 +178,12 @@ MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
|
||||
///
|
||||
void
|
||||
MachineFunction::DeleteMachineInstr(MachineInstr *MI) {
|
||||
// Strip it for parts. The operand array and the MI object itself are
|
||||
// independently recyclable.
|
||||
if (MI->Operands)
|
||||
deallocateOperandArray(MI->CapOperands, MI->Operands);
|
||||
MI->Operands = 0;
|
||||
MI->NumOperands = 0;
|
||||
MI->~MachineInstr();
|
||||
InstructionRecycler.Deallocate(Allocator, MI);
|
||||
}
|
||||
|
Reference in New Issue
Block a user