mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-13 07:00:59 +00:00
Reduce indentation by early detection of 'continue'. No functionality change.
llvm-svn: 157348
This commit is contained in:
parent
bf7155d836
commit
9235b4e8b1
@ -819,10 +819,8 @@ bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
|
||||
}
|
||||
|
||||
bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
|
||||
|
||||
if (!EnableTailMerge) return false;
|
||||
|
||||
bool MadeChange = false;
|
||||
if (!EnableTailMerge) return MadeChange;
|
||||
|
||||
// First find blocks with no successors.
|
||||
MergePotentials.clear();
|
||||
@ -839,6 +837,7 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
|
||||
if (MergePotentials.size() == TailMergeThreshold)
|
||||
for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
|
||||
TriedMerging.insert(MergePotentials[i].getBlock());
|
||||
|
||||
// See if we can do any tail merging on those.
|
||||
if (MergePotentials.size() >= 2)
|
||||
MadeChange |= TryTailMergeBlocks(NULL, NULL);
|
||||
@ -864,88 +863,97 @@ bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
|
||||
|
||||
for (MachineFunction::iterator I = llvm::next(MF.begin()), E = MF.end();
|
||||
I != E; ++I) {
|
||||
if (I->pred_size() >= 2) {
|
||||
SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
|
||||
MachineBasicBlock *IBB = I;
|
||||
MachineBasicBlock *PredBB = prior(I);
|
||||
MergePotentials.clear();
|
||||
for (MachineBasicBlock::pred_iterator P = I->pred_begin(),
|
||||
E2 = I->pred_end();
|
||||
P != E2 && MergePotentials.size() < TailMergeThreshold; ++P) {
|
||||
MachineBasicBlock *PBB = *P;
|
||||
if (TriedMerging.count(PBB))
|
||||
continue;
|
||||
// Skip blocks that loop to themselves, can't tail merge these.
|
||||
if (PBB == IBB)
|
||||
continue;
|
||||
// Visit each predecessor only once.
|
||||
if (!UniquePreds.insert(PBB))
|
||||
continue;
|
||||
// Skip blocks which may jump to a landing pad. Can't tail merge these.
|
||||
if (PBB->getLandingPadSuccessor())
|
||||
continue;
|
||||
MachineBasicBlock *TBB = 0, *FBB = 0;
|
||||
SmallVector<MachineOperand, 4> Cond;
|
||||
if (!TII->AnalyzeBranch(*PBB, TBB, FBB, Cond, true)) {
|
||||
// Failing case: IBB is the target of a cbr, and
|
||||
// we cannot reverse the branch.
|
||||
SmallVector<MachineOperand, 4> NewCond(Cond);
|
||||
if (!Cond.empty() && TBB == IBB) {
|
||||
if (TII->ReverseBranchCondition(NewCond))
|
||||
continue;
|
||||
// This is the QBB case described above
|
||||
if (!FBB)
|
||||
FBB = llvm::next(MachineFunction::iterator(PBB));
|
||||
}
|
||||
// Failing case: the only way IBB can be reached from PBB is via
|
||||
// exception handling. Happens for landing pads. Would be nice
|
||||
// to have a bit in the edge so we didn't have to do all this.
|
||||
if (IBB->isLandingPad()) {
|
||||
MachineFunction::iterator IP = PBB; IP++;
|
||||
MachineBasicBlock *PredNextBB = NULL;
|
||||
if (IP != MF.end())
|
||||
PredNextBB = IP;
|
||||
if (TBB == NULL) {
|
||||
if (IBB != PredNextBB) // fallthrough
|
||||
continue;
|
||||
} else if (FBB) {
|
||||
if (TBB != IBB && FBB != IBB) // cbr then ubr
|
||||
continue;
|
||||
} else if (Cond.empty()) {
|
||||
if (TBB != IBB) // ubr
|
||||
continue;
|
||||
} else {
|
||||
if (TBB != IBB && IBB != PredNextBB) // cbr
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Remove the unconditional branch at the end, if any.
|
||||
if (TBB && (Cond.empty() || FBB)) {
|
||||
DebugLoc dl; // FIXME: this is nowhere
|
||||
TII->RemoveBranch(*PBB);
|
||||
if (!Cond.empty())
|
||||
// reinsert conditional branch only, for now
|
||||
TII->InsertBranch(*PBB, (TBB == IBB) ? FBB : TBB, 0, NewCond, dl);
|
||||
}
|
||||
MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(PBB), *P));
|
||||
if (I->pred_size() >= 2) continue;
|
||||
SmallPtrSet<MachineBasicBlock *, 8> UniquePreds;
|
||||
MachineBasicBlock *IBB = I;
|
||||
MachineBasicBlock *PredBB = prior(I);
|
||||
MergePotentials.clear();
|
||||
for (MachineBasicBlock::pred_iterator P = I->pred_begin(),
|
||||
E2 = I->pred_end();
|
||||
P != E2 && MergePotentials.size() < TailMergeThreshold; ++P) {
|
||||
MachineBasicBlock *PBB = *P;
|
||||
if (TriedMerging.count(PBB))
|
||||
continue;
|
||||
|
||||
// Skip blocks that loop to themselves, can't tail merge these.
|
||||
if (PBB == IBB)
|
||||
continue;
|
||||
|
||||
// Visit each predecessor only once.
|
||||
if (!UniquePreds.insert(PBB))
|
||||
continue;
|
||||
|
||||
// Skip blocks which may jump to a landing pad. Can't tail merge these.
|
||||
if (PBB->getLandingPadSuccessor())
|
||||
continue;
|
||||
|
||||
MachineBasicBlock *TBB = 0, *FBB = 0;
|
||||
SmallVector<MachineOperand, 4> Cond;
|
||||
if (!TII->AnalyzeBranch(*PBB, TBB, FBB, Cond, true)) {
|
||||
// Failing case: IBB is the target of a cbr, and we cannot reverse the
|
||||
// branch.
|
||||
SmallVector<MachineOperand, 4> NewCond(Cond);
|
||||
if (!Cond.empty() && TBB == IBB) {
|
||||
if (TII->ReverseBranchCondition(NewCond))
|
||||
continue;
|
||||
// This is the QBB case described above
|
||||
if (!FBB)
|
||||
FBB = llvm::next(MachineFunction::iterator(PBB));
|
||||
}
|
||||
|
||||
// Failing case: the only way IBB can be reached from PBB is via
|
||||
// exception handling. Happens for landing pads. Would be nice to have
|
||||
// a bit in the edge so we didn't have to do all this.
|
||||
if (IBB->isLandingPad()) {
|
||||
MachineFunction::iterator IP = PBB; IP++;
|
||||
MachineBasicBlock *PredNextBB = NULL;
|
||||
if (IP != MF.end())
|
||||
PredNextBB = IP;
|
||||
if (TBB == NULL) {
|
||||
if (IBB != PredNextBB) // fallthrough
|
||||
continue;
|
||||
} else if (FBB) {
|
||||
if (TBB != IBB && FBB != IBB) // cbr then ubr
|
||||
continue;
|
||||
} else if (Cond.empty()) {
|
||||
if (TBB != IBB) // ubr
|
||||
continue;
|
||||
} else {
|
||||
if (TBB != IBB && IBB != PredNextBB) // cbr
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the unconditional branch at the end, if any.
|
||||
if (TBB && (Cond.empty() || FBB)) {
|
||||
DebugLoc dl; // FIXME: this is nowhere
|
||||
TII->RemoveBranch(*PBB);
|
||||
if (!Cond.empty())
|
||||
// reinsert conditional branch only, for now
|
||||
TII->InsertBranch(*PBB, (TBB == IBB) ? FBB : TBB, 0, NewCond, dl);
|
||||
}
|
||||
|
||||
MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(PBB), *P));
|
||||
}
|
||||
// If this is a large problem, avoid visiting the same basic blocks
|
||||
// multiple times.
|
||||
if (MergePotentials.size() == TailMergeThreshold)
|
||||
for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
|
||||
TriedMerging.insert(MergePotentials[i].getBlock());
|
||||
if (MergePotentials.size() >= 2)
|
||||
MadeChange |= TryTailMergeBlocks(IBB, PredBB);
|
||||
// Reinsert an unconditional branch if needed.
|
||||
// The 1 below can occur as a result of removing blocks in
|
||||
// TryTailMergeBlocks.
|
||||
PredBB = prior(I); // this may have been changed in TryTailMergeBlocks
|
||||
if (MergePotentials.size() == 1 &&
|
||||
MergePotentials.begin()->getBlock() != PredBB)
|
||||
FixTail(MergePotentials.begin()->getBlock(), IBB, TII);
|
||||
}
|
||||
|
||||
// If this is a large problem, avoid visiting the same basic blocks multiple
|
||||
// times.
|
||||
if (MergePotentials.size() == TailMergeThreshold)
|
||||
for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
|
||||
TriedMerging.insert(MergePotentials[i].getBlock());
|
||||
|
||||
if (MergePotentials.size() >= 2)
|
||||
MadeChange |= TryTailMergeBlocks(IBB, PredBB);
|
||||
|
||||
// Reinsert an unconditional branch if needed. The 1 below can occur as a
|
||||
// result of removing blocks in TryTailMergeBlocks.
|
||||
PredBB = prior(I); // this may have been changed in TryTailMergeBlocks
|
||||
if (MergePotentials.size() == 1 &&
|
||||
MergePotentials.begin()->getBlock() != PredBB)
|
||||
FixTail(MergePotentials.begin()->getBlock(), IBB, TII);
|
||||
}
|
||||
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user