PR1909: Tail merging pass ran wild. It makes no sense to merge blocks in order to save a single instruction since a branch will be inserted for each BB.

llvm-svn: 47301
This commit is contained in:
Evan Cheng 2008-02-19 02:09:37 +00:00
parent 3b56f506e7
commit 3266ff9a6f
1 changed files with 12 additions and 3 deletions

View File

@ -451,7 +451,10 @@ static bool MergeCompare(const std::pair<unsigned,MachineBasicBlock*> &p,
bool BranchFolder::TryMergeBlocks(MachineBasicBlock *SuccBB, bool BranchFolder::TryMergeBlocks(MachineBasicBlock *SuccBB,
MachineBasicBlock* PredBB) { MachineBasicBlock* PredBB) {
unsigned minCommonTailLength = (SuccBB ? 1 : 2); // It doesn't make sense to save a single instruction since tail merging
// will add a jump.
// FIXME: Ask the target to provide the threshold?
unsigned minCommonTailLength = (SuccBB ? 1 : 2) + 1;
MadeChange = false; MadeChange = false;
// Sort by hash value so that blocks with identical end sequences sort // Sort by hash value so that blocks with identical end sequences sort
@ -476,9 +479,9 @@ bool BranchFolder::TryMergeBlocks(MachineBasicBlock *SuccBB,
// Look through all the pairs of blocks that have the same hash as this // Look through all the pairs of blocks that have the same hash as this
// one, and find the pair that has the largest number of instructions in // one, and find the pair that has the largest number of instructions in
// common. // common.
// Since instructions may get combined later (e.g. single stores into // Since instructions may get combined later (e.g. single stores into
// store multiple) this measure is not particularly accurate. // store multiple) this measure is not particularly accurate.
MachineBasicBlock::iterator BBI1, BBI2; MachineBasicBlock::iterator BBI1, BBI2;
unsigned FoundI = ~0U, FoundJ = ~0U; unsigned FoundI = ~0U, FoundJ = ~0U;
unsigned maxCommonTailLength = 0U; unsigned maxCommonTailLength = 0U;
@ -541,6 +544,12 @@ bool BranchFolder::TryMergeBlocks(MachineBasicBlock *SuccBB,
continue; continue;
} }
MachineBasicBlock::iterator TrialBBI1, TrialBBI2;
unsigned CommonTailLen = ComputeCommonTailLength(CurMBB, MBB2,
TrialBBI1, TrialBBI2);
if (CommonTailLen < minCommonTailLength)
continue;
// Decide whether we want to split CurMBB or MBB2. // Decide whether we want to split CurMBB or MBB2.
if (ShouldSplitFirstBlock(CurMBB, BBI1, MBB2, BBI2, PredBB)) { if (ShouldSplitFirstBlock(CurMBB, BBI1, MBB2, BBI2, PredBB)) {
CurMBB = SplitMBBAt(*CurMBB, BBI1); CurMBB = SplitMBBAt(*CurMBB, BBI1);