mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +00:00
Change pre-regalloc tail duplication to only duplicate indirect branch blocks.
The pre-regalloc pass caused some regressions in both compile time and performance of the generated code, and it did not improve performance, except for indirect branches. I also moved the check for single-block loops to speed up the common case when running the taildup pass before reg allocation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93505 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
283ba2fbb4
commit
bfdcf3bd49
@ -253,7 +253,7 @@ bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
|
||||
SSAUpdateVals.clear();
|
||||
}
|
||||
|
||||
// Eliminate some of the copies inserted tail duplication to maintain
|
||||
// Eliminate some of the copies inserted by tail duplication to maintain
|
||||
// SSA form.
|
||||
for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
|
||||
MachineInstr *Copy = Copies[i];
|
||||
@ -437,8 +437,11 @@ bool
|
||||
TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
SmallVector<MachineBasicBlock*, 8> &TDBBs,
|
||||
SmallVector<MachineInstr*, 16> &Copies) {
|
||||
// Don't try to tail-duplicate single-block loops.
|
||||
if (TailBB->isSuccessor(TailBB))
|
||||
// Pre-regalloc tail duplication hurts compile time and doesn't help
|
||||
// much except for indirect branches.
|
||||
bool hasIndirectBranch = (!TailBB->empty() &&
|
||||
TailBB->back().getDesc().isIndirectBranch());
|
||||
if (PreRegAlloc && !hasIndirectBranch)
|
||||
return false;
|
||||
|
||||
// Set the limit on the number of instructions to duplicate, with a default
|
||||
@ -446,7 +449,7 @@ TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
// duplicate only one, because one branch instruction can be eliminated to
|
||||
// compensate for the duplication.
|
||||
unsigned MaxDuplicateCount;
|
||||
if (!TailBB->empty() && TailBB->back().getDesc().isIndirectBranch())
|
||||
if (hasIndirectBranch)
|
||||
// If the target has hardware branch prediction that can handle indirect
|
||||
// branches, duplicating them can often make them predictable when there
|
||||
// are common paths through the code. The limit needs to be high enough
|
||||
@ -457,6 +460,10 @@ TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
else
|
||||
MaxDuplicateCount = TailDuplicateSize;
|
||||
|
||||
// Don't try to tail-duplicate single-block loops.
|
||||
if (TailBB->isSuccessor(TailBB))
|
||||
return false;
|
||||
|
||||
// Check the instructions in the block to determine whether tail-duplication
|
||||
// is invalid or unlikely to be profitable.
|
||||
unsigned InstrCount = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user