mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Treat indirect branches specially only during pre-regalloc tail duplication,
not during the later post-alloc tail duplication. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93600 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
551cdd56ce
commit
cb44b28f4d
@ -433,29 +433,29 @@ bool
|
||||
TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
SmallVector<MachineBasicBlock*, 8> &TDBBs,
|
||||
SmallVector<MachineInstr*, 16> &Copies) {
|
||||
// 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
|
||||
// of one less than the tail-merge threshold. When optimizing for size,
|
||||
// duplicate only one, because one branch instruction can be eliminated to
|
||||
// compensate for the duplication.
|
||||
unsigned MaxDuplicateCount;
|
||||
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
|
||||
// to allow undoing the effects of tail merging.
|
||||
MaxDuplicateCount = 20;
|
||||
else if (MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize))
|
||||
if (MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize))
|
||||
MaxDuplicateCount = 1;
|
||||
else
|
||||
MaxDuplicateCount = TailDuplicateSize;
|
||||
|
||||
if (PreRegAlloc) {
|
||||
// Pre-regalloc tail duplication hurts compile time and doesn't help
|
||||
// much except for indirect branches.
|
||||
if (TailBB->empty() || !TailBB->back().getDesc().isIndirectBranch())
|
||||
return false;
|
||||
// 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
|
||||
// to allow undoing the effects of tail merging and other optimizations
|
||||
// that rearrange the predecessors of the indirect branch.
|
||||
MaxDuplicateCount = 20;
|
||||
}
|
||||
|
||||
// Don't try to tail-duplicate single-block loops.
|
||||
if (TailBB->isSuccessor(TailBB))
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user