15 #define DEBUG_TYPE "tailduplication"
37 STATISTIC(NumTails ,
"Number of tails duplicated");
38 STATISTIC(NumTailDups ,
"Number of tail duplicated blocks");
39 STATISTIC(NumInstrDups ,
"Additional instructions due to tail duplication");
40 STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
41 STATISTIC(NumAddedPHIs ,
"Number of phis added");
46 cl::desc(
"Maximum instructions to consider tail duplicating"),
51 cl::desc(
"Verify sanity of PHI instructions during taildup"),
78 explicit TailDuplicatePass() :
84 void AddSSAUpdateEntry(
unsigned OrigReg,
unsigned NewReg,
131 TII = MF.getTarget().getInstrInfo();
133 MRI = &MF.getRegInfo();
134 MMI = getAnalysisIfAvailable<MachineModuleInfo>();
135 PreRegAlloc =
MRI->isSSA();
137 if (
MRI->tracksLiveness() && TRI->trackLivenessAfterRegAlloc(MF))
140 bool MadeChange =
false;
141 while (TailDuplicateBlocks(MF))
153 while (MI != MBB->
end()) {
157 PE = Preds.end(); PI != PE; ++PI) {
160 for (
unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
162 if (PHIBB == PredBB) {
169 dbgs() <<
" missing input from predecessor BB#"
175 for (
unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
177 if (CheckExtra && !Preds.count(PHIBB)) {
178 dbgs() <<
"Warning: malformed PHI in BB#" << MBB->
getNumber()
180 dbgs() <<
" extra input from predecessor BB#"
206 if (!TailDuplicate(MBB, IsSimple, MF, TDBBs, Copies))
219 UpdateSuccessorsPHIs(MBB, isDead, TDBBs, Succs);
223 NumInstrDups -= MBB->
size();
224 RemoveDeadBlock(MBB);
229 if (!SSAUpdateVRs.empty()) {
230 for (
unsigned i = 0, e = SSAUpdateVRs.size(); i != e; ++i) {
231 unsigned VReg = SSAUpdateVRs[i];
232 SSAUpdate.Initialize(VReg);
240 SSAUpdate.AddAvailableValue(DefBB, VReg);
245 SSAUpdateVals.find(VReg);
246 for (
unsigned j = 0, ee = LI->second.
size(); j != ee; ++j) {
248 unsigned SrcReg = LI->second[j].second;
249 SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
254 while (UI !=
MRI->use_end()) {
268 SSAUpdate.RewriteUse(UseMO);
272 SSAUpdateVRs.clear();
273 SSAUpdateVals.clear();
278 for (
unsigned i = 0, e = Copies.
size(); i != e; ++i) {
284 if (
MRI->hasOneNonDBGUse(Src) &&
287 MRI->replaceRegWith(Dst, Src);
293 NumAddedPHIs += NewPHIs.
size();
302 bool MadeChange =
false;
305 DEBUG(
dbgs() <<
"\n*** Before tail-duplicating\n");
315 bool IsSimple = isSimpleBB(MBB);
317 if (!shouldTailDuplicate(MF, IsSimple, *MBB))
320 MadeChange |= TailDuplicateAndUpdate(MBB, IsSimple, MF);
332 UE = MRI->
use_end(); UI != UE; ++UI) {
362 UsedByPhi->
insert(SrcReg);
369 void TailDuplicatePass::AddSSAUpdateEntry(
unsigned OrigReg,
unsigned NewReg,
372 if (LI != SSAUpdateVals.
end())
373 LI->second.push_back(std::make_pair(BB, NewReg));
376 Vals.push_back(std::make_pair(BB, NewReg));
377 SSAUpdateVals.
insert(std::make_pair(OrigReg, Vals));
378 SSAUpdateVRs.push_back(OrigReg);
385 void TailDuplicatePass::ProcessPHI(
392 assert(SrcOpIdx &&
"Unable to find matching PHI source?");
395 LocalVRMap.
insert(std::make_pair(DefReg, SrcReg));
399 unsigned NewDef =
MRI->createVirtualRegister(RC);
400 Copies.
push_back(std::make_pair(NewDef, SrcReg));
402 AddSSAUpdateEntry(DefReg, NewDef, PredBB);
416 void TailDuplicatePass::DuplicateInstruction(
MachineInstr *MI,
432 unsigned NewReg =
MRI->createVirtualRegister(RC);
434 LocalVRMap.
insert(std::make_pair(Reg, NewReg));
436 AddSSAUpdateEntry(Reg, NewReg, PredBB);
439 if (VI != LocalVRMap.
end()) {
456 SE = Succs.
end(); SI != SE; ++SI) {
464 for (
unsigned i = 1, e = II->getNumOperands(); i != e; i += 2) {
466 if (MO.
getMBB() == FromBB) {
474 unsigned Reg = MO0.
getReg();
479 for (
unsigned i = II->getNumOperands()-2; i != Idx; i -= 2) {
481 if (MO.
getMBB() == FromBB) {
482 II->RemoveOperand(i+1);
483 II->RemoveOperand(i);
493 if (LI != SSAUpdateVals.
end()) {
495 for (
unsigned j = 0, ee = LI->second.
size(); j != ee; ++j) {
504 unsigned SrcReg = LI->second[j].second;
506 II->getOperand(Idx).setReg(SrcReg);
507 II->getOperand(Idx+1).setMBB(SrcBB);
510 MIB.addReg(SrcReg).addMBB(SrcBB);
515 for (
unsigned j = 0, ee = TDBBs.
size(); j != ee; ++j) {
518 II->getOperand(Idx).setReg(Reg);
519 II->getOperand(Idx+1).setMBB(SrcBB);
522 MIB.addReg(Reg).addMBB(SrcBB);
527 II->RemoveOperand(Idx+1);
528 II->RemoveOperand(Idx);
550 unsigned MaxDuplicateCount;
554 MaxDuplicateCount = 1;
564 bool HasIndirectbr =
false;
568 if (HasIndirectbr && PreRegAlloc)
569 MaxDuplicateCount = 20;
573 unsigned InstrCount = 0;
576 if (
I->isNotDuplicable())
582 if (PreRegAlloc &&
I->isReturn())
588 if (PreRegAlloc &&
I->isCall())
591 if (!
I->isPHI() && !
I->isDebugValue())
594 if (InstrCount > MaxDuplicateCount)
598 if (HasIndirectbr && PreRegAlloc)
607 return canCompletelyDuplicateBB(TailBB);
619 while (I != E && I->isDebugValue())
623 return I->isUnconditionalBranch();
630 SE = A.
succ_end(); SI != SE; ++SI) {
642 PE = BB.
pred_end(); PI != PE; ++PI) {
653 if (!PredCond.
empty())
668 bool Changed =
false;
670 PE = Preds.end(); PI != PE; ++PI) {
685 DEBUG(
dbgs() <<
"\nTail-duplicating into PredBB: " << *PredBB
686 <<
"From simple Succ: " << *TailBB);
692 if (PredCond.
empty())
702 if (PredFBB == TailBB)
704 if (PredTBB == TailBB)
708 if (PredTBB == PredFBB) {
714 if (PredFBB == NextBB)
716 if (PredTBB == NextBB && PredFBB == NULL)
725 unsigned NumSuccessors = PredBB->
succ_size();
726 assert(NumSuccessors <= 1);
727 if (NumSuccessors == 0 || *PredBB->
succ_begin() != NewTarget)
749 return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi, Copies);
754 bool Changed =
false;
758 PE = Preds.end(); PI != PE; ++PI) {
761 assert(TailBB != PredBB &&
762 "Single-block loop should have been rejected earlier!");
771 if (!PredCond.
empty())
777 DEBUG(
dbgs() <<
"\nTail-duplicating into PredBB: " << *PredBB
778 <<
"From Succ: " << *TailBB);
787 RS->enterBasicBlock(PredBB);
788 if (!PredBB->
empty())
790 BitVector RegsLiveAtExit(TRI->getNumRegs());
791 RS->getRegsUsed(RegsLiveAtExit,
false);
794 if (!RegsLiveAtExit[*I])
814 ProcessPHI(MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi,
true);
818 DuplicateInstruction(MI, TailBB, PredBB, MF, LocalVRMap, UsedByPhi);
822 for (
unsigned i = 0, e = CopyInfos.
size(); i != e; ++i) {
825 CopyInfos[i].first).addReg(CopyInfos[i].second));
831 NumInstrDups += TailBB->
size() - 1;
836 "TailDuplicate called on block with multiple successors!");
857 DEBUG(
dbgs() <<
"\nMerging into block: " << *PrevBB
858 <<
"From MBB: " << *TailBB);
864 while (I != TailBB->
end() && I->isPHI()) {
868 ProcessPHI(MI, TailBB, PrevBB, LocalVRMap, CopyInfos, UsedByPhi,
true);
874 while (I != TailBB->
end()) {
878 assert(!MI->
isBundle() &&
"Not expecting bundles before regalloc!");
879 DuplicateInstruction(MI, TailBB, PrevBB, MF, LocalVRMap, UsedByPhi);
883 for (
unsigned i = 0, e = CopyInfos.
size(); i != e; ++i) {
887 .addReg(CopyInfos[i].second));
924 PE = Preds.end(); PI != PE; ++PI) {
926 if (std::find(TDBBs.
begin(), TDBBs.
end(), PredBB) != TDBBs.
end())
937 while (I != TailBB->
end() && I->isPHI()) {
941 ProcessPHI(MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi,
false);
944 for (
unsigned i = 0, e = CopyInfos.
size(); i != e; ++i) {
947 CopyInfos[i].first).addReg(CopyInfos[i].second));
957 assert(MBB->
pred_empty() &&
"MBB must be dead!");
958 DEBUG(
dbgs() <<
"\nRemoving MBB: " << *MBB);
unsigned succ_size() const
void push_back(const T &Elt)
const MachineFunction * getParent() const
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
static cl::opt< bool > TailDupVerify("tail-dup-verify", cl::desc("Verify sanity of PHI instructions during taildup"), cl::init(false), cl::Hidden)
instr_iterator instr_begin()
instr_iterator instr_end()
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
MachineBasicBlock * getMBB() const
std::vector< unsigned >::const_iterator livein_iterator
iterator getFirstTerminator()
static bool isVirtualRegister(unsigned Reg)
void addLiveIn(unsigned Reg)
const Function * getFunction() const
static unsigned getPHISrcRegOpIdx(MachineInstr *MI, MachineBasicBlock *SrcBB)
Instructions::iterator instr_iterator
iterator end()
Get an iterator to the end of the SetVector.
LoopInfoBase< BlockT, LoopT > * LI
livein_iterator livein_begin() const
static use_iterator use_end()
const HexagonInstrInfo * TII
#define llvm_unreachable(msg)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
std::vector< MachineBasicBlock * >::iterator succ_iterator
ID
LLVM Calling Convention Representation.
unsigned getNumOperands() const
void RemoveOperand(unsigned i)
void transferSuccessors(MachineBasicBlock *fromMBB)
bool count(PtrType Ptr) const
count - Return true if the specified pointer is in the set.
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
STATISTIC(NumTails,"Number of tails duplicated")
iterator begin()
Get an iterator to the beginning of the SetVector.
bool livein_empty() const
std::vector< MachineBasicBlock * >::iterator pred_iterator
static bool bothUsedInPHI(const MachineBasicBlock &A, SmallPtrSet< MachineBasicBlock *, 8 > SuccsB)
const MachineBasicBlock * getParent() const
bool isDebugValue() const
bundle_iterator< MachineInstr, instr_iterator > iterator
initializer< Ty > init(const Ty &Val)
static void getRegsUsedByPHIs(const MachineBasicBlock &BB, DenseSet< unsigned > *UsedByPhi)
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value. See class MCOperandInfo.
livein_iterator livein_end() const
const MachineOperand & getOperand(unsigned i) const
static cl::opt< unsigned > TailDupLimit("tail-dup-limit", cl::init(~0U), cl::Hidden)
bool isIndirectBranch(QueryType Type=AnyInBundle) const
ItTy next(ItTy it, Dist n)
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
const MachineBasicBlock * getLandingPadSuccessor() const
static bool isDefLiveOut(unsigned Reg, MachineBasicBlock *BB, const MachineRegisterInfo *MRI)
static cl::opt< unsigned > TailDuplicateSize("tail-dup-size", cl::desc("Maximum instructions to consider tail duplicating"), cl::init(2), cl::Hidden)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
succ_iterator succ_begin()
void removeSuccessor(MachineBasicBlock *succ)
MachineOperand & getOperand() const
pred_iterator pred_begin()
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
bool count(const ValueT &V) const
A SetVector that performs no allocations if smaller than a certain size.
std::pair< iterator, bool > insert(const ValueT &V)
std::vector< std::pair< MachineBasicBlock *, unsigned > > AvailableValsTy
bool isSuccessor(const MachineBasicBlock *MBB) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
AttributeSet getAttributes() const
Return the attribute list for this Function.
bundle_iterator< const MachineInstr, const_instr_iterator > const_iterator
bool hasAddressTaken() const
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
use_iterator use_begin(unsigned RegNo) const
void setReg(unsigned Reg)
INITIALIZE_PASS(TailDuplicatePass,"tailduplication","Tail Duplication", false, false) bool TailDuplicatePass
static void VerifyPHIs(MachineFunction &MF, bool CheckExtra)
instr_iterator insert(instr_iterator I, MachineInstr *M)
unsigned getReg() const
getReg - Returns the register number.
virtual const HexagonRegisterInfo & getRegisterInfo() const
std::vector< MachineBasicBlock * >::const_iterator const_succ_iterator
BasicBlockListType::iterator iterator
ItTy prior(ItTy it, Dist n)
const MCRegisterInfo & MRI
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
iterator find(const KeyT &Val)
void addSuccessor(MachineBasicBlock *succ, uint32_t weight=0)
unsigned pred_size() const