forked from OSchip/llvm-project
Move most of the pre BB code to TailDuplicateAndUpdate. Change the
HasIndirectbr variable to be just that. No functionality change. llvm-svn: 134371
This commit is contained in:
parent
79dc4e7709
commit
f9f012ea88
|
@ -102,9 +102,15 @@ namespace {
|
|||
SmallVector<MachineBasicBlock*, 8> &TDBBs,
|
||||
const DenseSet<unsigned> &RegsUsedByPhi,
|
||||
SmallVector<MachineInstr*, 16> &Copies);
|
||||
bool TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
bool TailDuplicate(MachineBasicBlock *TailBB,
|
||||
bool IsSimple,
|
||||
MachineFunction &MF,
|
||||
SmallVector<MachineBasicBlock*, 8> &TDBBs,
|
||||
SmallVector<MachineInstr*, 16> &Copies);
|
||||
bool TailDuplicateAndUpdate(MachineBasicBlock *MBB,
|
||||
bool IsSimple,
|
||||
MachineFunction &MF);
|
||||
|
||||
void RemoveDeadBlock(MachineBasicBlock *MBB);
|
||||
};
|
||||
|
||||
|
@ -175,37 +181,25 @@ static void VerifyPHIs(MachineFunction &MF, bool CheckExtra) {
|
|||
}
|
||||
}
|
||||
|
||||
/// TailDuplicateBlocks - Look for small blocks that are unconditionally
|
||||
/// branched to and do not fall through. Tail-duplicate their instructions
|
||||
/// into their predecessors to eliminate (dynamic) branches.
|
||||
bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
|
||||
bool MadeChange = false;
|
||||
|
||||
if (PreRegAlloc && TailDupVerify) {
|
||||
DEBUG(dbgs() << "\n*** Before tail-duplicating\n");
|
||||
VerifyPHIs(MF, true);
|
||||
}
|
||||
|
||||
SmallVector<MachineInstr*, 8> NewPHIs;
|
||||
MachineSSAUpdater SSAUpdate(MF, &NewPHIs);
|
||||
|
||||
for (MachineFunction::iterator I = ++MF.begin(), E = MF.end(); I != E; ) {
|
||||
MachineBasicBlock *MBB = I++;
|
||||
|
||||
if (NumTails == TailDupLimit)
|
||||
break;
|
||||
|
||||
/// TailDuplicateAndUpdate - Tail duplicate the block and cleanup.
|
||||
bool
|
||||
TailDuplicatePass::TailDuplicateAndUpdate(MachineBasicBlock *MBB,
|
||||
bool IsSimple,
|
||||
MachineFunction &MF) {
|
||||
// Save the successors list.
|
||||
SmallSetVector<MachineBasicBlock*, 8> Succs(MBB->succ_begin(),
|
||||
MBB->succ_end());
|
||||
|
||||
SmallVector<MachineBasicBlock*, 8> TDBBs;
|
||||
SmallVector<MachineInstr*, 16> Copies;
|
||||
if (!TailDuplicate(MBB, MF, TDBBs, Copies))
|
||||
continue;
|
||||
if (!TailDuplicate(MBB, IsSimple, MF, TDBBs, Copies))
|
||||
return false;
|
||||
|
||||
++NumTails;
|
||||
|
||||
SmallVector<MachineInstr*, 8> NewPHIs;
|
||||
MachineSSAUpdater SSAUpdate(MF, &NewPHIs);
|
||||
|
||||
// TailBB's immediate successors are now successors of those predecessors
|
||||
// which duplicated TailBB. Add the predecessors as sources to the PHI
|
||||
// instructions.
|
||||
|
@ -222,7 +216,6 @@ bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
|
|||
|
||||
// Update SSA form.
|
||||
if (!SSAUpdateVRs.empty()) {
|
||||
NewPHIs.clear();
|
||||
for (unsigned i = 0, e = SSAUpdateVRs.size(); i != e; ++i) {
|
||||
unsigned VReg = SSAUpdateVRs[i];
|
||||
SSAUpdate.Initialize(VReg);
|
||||
|
@ -285,14 +278,39 @@ bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
|
|||
}
|
||||
}
|
||||
|
||||
if (PreRegAlloc && TailDupVerify)
|
||||
VerifyPHIs(MF, false);
|
||||
MadeChange = true;
|
||||
|
||||
if (NewPHIs.size())
|
||||
NumAddedPHIs += NewPHIs.size();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// TailDuplicateBlocks - Look for small blocks that are unconditionally
|
||||
/// branched to and do not fall through. Tail-duplicate their instructions
|
||||
/// into their predecessors to eliminate (dynamic) branches.
|
||||
bool TailDuplicatePass::TailDuplicateBlocks(MachineFunction &MF) {
|
||||
bool MadeChange = false;
|
||||
|
||||
if (PreRegAlloc && TailDupVerify) {
|
||||
DEBUG(dbgs() << "\n*** Before tail-duplicating\n");
|
||||
VerifyPHIs(MF, true);
|
||||
}
|
||||
|
||||
for (MachineFunction::iterator I = ++MF.begin(), E = MF.end(); I != E; ) {
|
||||
MachineBasicBlock *MBB = I++;
|
||||
|
||||
if (NumTails == TailDupLimit)
|
||||
break;
|
||||
|
||||
bool IsSimple = isSimpleBB(MBB);
|
||||
|
||||
if (!shouldTailDuplicate(MF, IsSimple, *MBB))
|
||||
continue;
|
||||
|
||||
MadeChange |= TailDuplicateAndUpdate(MBB, IsSimple, MF);
|
||||
}
|
||||
|
||||
if (PreRegAlloc && TailDupVerify)
|
||||
VerifyPHIs(MF, false);
|
||||
|
||||
return MadeChange;
|
||||
}
|
||||
|
@ -532,14 +550,12 @@ TailDuplicatePass::shouldTailDuplicate(const MachineFunction &MF,
|
|||
// to allow undoing the effects of tail merging and other optimizations
|
||||
// that rearrange the predecessors of the indirect branch.
|
||||
|
||||
bool hasIndirectBR = false;
|
||||
if (PreRegAlloc && !TailBB.empty()) {
|
||||
const MCInstrDesc &MCID = TailBB.back().getDesc();
|
||||
if (MCID.isIndirectBranch()) {
|
||||
bool HasIndirectbr = false;
|
||||
if (!TailBB.empty())
|
||||
HasIndirectbr = TailBB.back().getDesc().isIndirectBranch();
|
||||
|
||||
if (HasIndirectbr && PreRegAlloc)
|
||||
MaxDuplicateCount = 20;
|
||||
hasIndirectBR = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check the instructions in the block to determine whether tail-duplication
|
||||
// is invalid or unlikely to be profitable.
|
||||
|
@ -569,7 +585,7 @@ TailDuplicatePass::shouldTailDuplicate(const MachineFunction &MF,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (hasIndirectBR)
|
||||
if (HasIndirectbr && PreRegAlloc)
|
||||
return true;
|
||||
|
||||
if (IsSimple)
|
||||
|
@ -711,14 +727,11 @@ TailDuplicatePass::duplicateSimpleBB(MachineBasicBlock *TailBB,
|
|||
/// TailDuplicate - If it is profitable, duplicate TailBB's contents in each
|
||||
/// of its predecessors.
|
||||
bool
|
||||
TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB, MachineFunction &MF,
|
||||
TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB,
|
||||
bool IsSimple,
|
||||
MachineFunction &MF,
|
||||
SmallVector<MachineBasicBlock*, 8> &TDBBs,
|
||||
SmallVector<MachineInstr*, 16> &Copies) {
|
||||
bool IsSimple = isSimpleBB(TailBB);
|
||||
|
||||
if (!shouldTailDuplicate(MF, IsSimple, *TailBB))
|
||||
return false;
|
||||
|
||||
DEBUG(dbgs() << "\n*** Tail-duplicating BB#" << TailBB->getNumber() << '\n');
|
||||
|
||||
DenseSet<unsigned> UsedByPhi;
|
||||
|
|
Loading…
Reference in New Issue