mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-02 16:56:39 +00:00
[codegen] Add generic functions to skip debug values.
Summary: This commits moves skipDebugInstructionsForward and skipDebugInstructionsBackward from lib/CodeGen/IfConversion.cpp to include/llvm/CodeGen/MachineBasicBlock.h and updates some codgen files to use them. This refactoring was suggested in https://reviews.llvm.org/D27688 and I thought it's best to do the refactoring in a separate review, but I could also put both changes in a single review if that's preferred. Also, the names for the functions aren't the snappiest and I would be happy to rename them if anybody has suggestions. Reviewers: eli.friedman, iteratee, aprantl, MatzeB Subscribers: MatzeB, llvm-commits Differential Revision: https://reviews.llvm.org/D27782 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c82e7ec9e2
commit
f295c8c72c
@ -806,6 +806,28 @@ public:
|
||||
MachineBasicBlock::iterator getInitial() { return I; }
|
||||
};
|
||||
|
||||
/// Increment \p It until it points to a non-debug instruction or to \p End
|
||||
/// and return the resulting iterator. This function should only be used
|
||||
/// MachineBasicBlock::{iterator, const_iterator, instr_iterator,
|
||||
/// const_instr_iterator} and the respective reverse iterators.
|
||||
template<typename IterT>
|
||||
inline IterT skipDebugInstructionsForward(IterT It, IterT End) {
|
||||
while (It != End && It->isDebugValue())
|
||||
It++;
|
||||
return It;
|
||||
}
|
||||
|
||||
/// Decrement \p It until it points to a non-debug instruction or to \p Begin
|
||||
/// and return the resulting iterator. This function should only be used
|
||||
/// MachineBasicBlock::{iterator, const_iterator, instr_iterator,
|
||||
/// const_instr_iterator} and the respective reverse iterators.
|
||||
template<class IterT>
|
||||
inline IterT skipDebugInstructionsBackward(IterT It, IterT Begin) {
|
||||
while (It != Begin && It->isDebugValue())
|
||||
It--;
|
||||
return It;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
@ -1733,10 +1733,8 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
|
||||
|
||||
// The terminator is probably a conditional branch, try not to separate the
|
||||
// branch from condition setting instruction.
|
||||
MachineBasicBlock::iterator PI = Loc;
|
||||
--PI;
|
||||
while (PI != MBB->begin() && PI->isDebugValue())
|
||||
--PI;
|
||||
MachineBasicBlock::iterator PI =
|
||||
skipDebugInstructionsBackward(std::prev(Loc), MBB->begin());
|
||||
|
||||
bool IsDef = false;
|
||||
for (const MachineOperand &MO : PI->operands()) {
|
||||
@ -1830,18 +1828,11 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) {
|
||||
MachineBasicBlock::iterator FIE = FBB->end();
|
||||
while (TIB != TIE && FIB != FIE) {
|
||||
// Skip dbg_value instructions. These do not count.
|
||||
if (TIB->isDebugValue()) {
|
||||
while (TIB != TIE && TIB->isDebugValue())
|
||||
++TIB;
|
||||
if (TIB == TIE)
|
||||
break;
|
||||
}
|
||||
if (FIB->isDebugValue()) {
|
||||
while (FIB != FIE && FIB->isDebugValue())
|
||||
++FIB;
|
||||
if (FIB == FIE)
|
||||
break;
|
||||
}
|
||||
TIB = skipDebugInstructionsForward(TIB, TIE);
|
||||
FIB = skipDebugInstructionsForward(FIB, FIE);
|
||||
if (TIB == TIE || FIB == FIE)
|
||||
break;
|
||||
|
||||
if (!TIB->isIdenticalTo(*FIB, MachineInstr::CheckKillDead))
|
||||
break;
|
||||
|
||||
|
@ -588,18 +588,6 @@ bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
|
||||
return TExit && TExit == FalseBBI.BB;
|
||||
}
|
||||
|
||||
/// Increment \p It until it points to a non-debug instruction or to \p End.
|
||||
/// @param It Iterator to increment
|
||||
/// @param End Iterator that points to end. Will be compared to It
|
||||
/// @returns true if It == End, false otherwise.
|
||||
static inline bool skipDebugInstructionsForward(
|
||||
MachineBasicBlock::iterator &It,
|
||||
MachineBasicBlock::iterator &End) {
|
||||
while (It != End && It->isDebugValue())
|
||||
It++;
|
||||
return It == End;
|
||||
}
|
||||
|
||||
/// Shrink the provided inclusive range by one instruction.
|
||||
/// If the range was one instruction (\p It == \p Begin), It is not modified,
|
||||
/// but \p Empty is set to true.
|
||||
@ -613,21 +601,6 @@ static inline void shrinkInclusiveRange(
|
||||
It--;
|
||||
}
|
||||
|
||||
/// Decrement \p It until it points to a non-debug instruction or the range is
|
||||
/// empty.
|
||||
/// @param It Iterator to decrement.
|
||||
/// @param Begin Iterator that points to beginning. Will be compared to It
|
||||
/// @param Empty Set to true if the resulting range is Empty
|
||||
/// @returns the value of Empty as a convenience.
|
||||
static inline bool skipDebugInstructionsBackward(
|
||||
MachineBasicBlock::iterator &Begin,
|
||||
MachineBasicBlock::iterator &It,
|
||||
bool &Empty) {
|
||||
while (!Empty && It->isDebugValue())
|
||||
shrinkInclusiveRange(Begin, It, Empty);
|
||||
return Empty;
|
||||
}
|
||||
|
||||
/// Count duplicated instructions and move the iterators to show where they
|
||||
/// are.
|
||||
/// @param TIB True Iterator Begin
|
||||
@ -659,9 +632,11 @@ bool IfConverter::CountDuplicatedInstructions(
|
||||
|
||||
while (TIB != TIE && FIB != FIE) {
|
||||
// Skip dbg_value instructions. These do not count.
|
||||
if(skipDebugInstructionsForward(TIB, TIE))
|
||||
TIB = skipDebugInstructionsForward(TIB, TIE);
|
||||
if(TIB == TIE)
|
||||
break;
|
||||
if(skipDebugInstructionsForward(FIB, FIE))
|
||||
FIB = skipDebugInstructionsForward(FIB, FIE);
|
||||
if(FIB == FIE)
|
||||
break;
|
||||
if (!TIB->isIdenticalTo(*FIB))
|
||||
break;
|
||||
@ -718,9 +693,11 @@ bool IfConverter::CountDuplicatedInstructions(
|
||||
// Count duplicate instructions at the ends of the blocks.
|
||||
while (!TEmpty && !FEmpty) {
|
||||
// Skip dbg_value instructions. These do not count.
|
||||
if (skipDebugInstructionsBackward(TIB, TIE, TEmpty))
|
||||
break;
|
||||
if (skipDebugInstructionsBackward(FIB, FIE, FEmpty))
|
||||
TIE = skipDebugInstructionsBackward(TIE, TIB);
|
||||
FIE = skipDebugInstructionsBackward(FIE, FIB);
|
||||
TEmpty = TIE == TIB && TIE->isDebugValue();
|
||||
FEmpty = FIE == FIB && FIE->isDebugValue();
|
||||
if (TEmpty || FEmpty)
|
||||
break;
|
||||
if (!TIE->isIdenticalTo(*FIE))
|
||||
break;
|
||||
@ -770,8 +747,11 @@ static void verifySameBranchInstructions(
|
||||
MachineBasicBlock::iterator E2 = std::prev(MBB2->end());
|
||||
bool Empty1 = false, Empty2 = false;
|
||||
while (!Empty1 && !Empty2) {
|
||||
skipDebugInstructionsBackward(B1, E1, Empty1);
|
||||
skipDebugInstructionsBackward(B2, E2, Empty2);
|
||||
E1 = skipDebugInstructionsBackward(E1, B1);
|
||||
E2 = skipDebugInstructionsBackward(E2, B2);
|
||||
Empty1 = E1 == B1 && E1->isDebugValue();
|
||||
Empty2 = E2 == B2 && E2->isDebugValue();
|
||||
|
||||
if (Empty1 && Empty2)
|
||||
break;
|
||||
|
||||
|
@ -191,10 +191,7 @@ MachineBasicBlock::instr_iterator MachineBasicBlock::getFirstInstrTerminator() {
|
||||
|
||||
MachineBasicBlock::iterator MachineBasicBlock::getFirstNonDebugInstr() {
|
||||
// Skip over begin-of-block dbg_value instructions.
|
||||
iterator I = begin(), E = end();
|
||||
while (I != E && I->isDebugValue())
|
||||
++I;
|
||||
return I;
|
||||
return skipDebugInstructionsForward(begin(), end());
|
||||
}
|
||||
|
||||
MachineBasicBlock::iterator MachineBasicBlock::getLastNonDebugInstr() {
|
||||
@ -1140,17 +1137,11 @@ bool MachineBasicBlock::CorrectExtraCFGEdges(MachineBasicBlock *DestA,
|
||||
/// instructions. Return UnknownLoc if there is none.
|
||||
DebugLoc
|
||||
MachineBasicBlock::findDebugLoc(instr_iterator MBBI) {
|
||||
DebugLoc DL;
|
||||
instr_iterator E = instr_end();
|
||||
if (MBBI == E)
|
||||
return DL;
|
||||
|
||||
// Skip debug declarations, we don't want a DebugLoc from them.
|
||||
while (MBBI != E && MBBI->isDebugValue())
|
||||
MBBI++;
|
||||
if (MBBI != E)
|
||||
DL = MBBI->getDebugLoc();
|
||||
return DL;
|
||||
MBBI = skipDebugInstructionsForward(MBBI, instr_end());
|
||||
if (MBBI != instr_end())
|
||||
return MBBI->getDebugLoc();
|
||||
return {};
|
||||
}
|
||||
|
||||
/// Return probability of the edge from this block to MBB.
|
||||
|
@ -177,8 +177,7 @@ MachineCSE::isPhysDefTriviallyDead(unsigned Reg,
|
||||
unsigned LookAheadLeft = LookAheadLimit;
|
||||
while (LookAheadLeft) {
|
||||
// Skip over dbg_value's.
|
||||
while (I != E && I->isDebugValue())
|
||||
++I;
|
||||
I = skipDebugInstructionsForward(I, E);
|
||||
|
||||
if (I == E)
|
||||
// Reached end of block, register is obviously dead.
|
||||
|
@ -266,9 +266,8 @@ bool RegPressureTracker::isBottomClosed() const {
|
||||
|
||||
|
||||
SlotIndex RegPressureTracker::getCurrSlot() const {
|
||||
MachineBasicBlock::const_iterator IdxPos = CurrPos;
|
||||
while (IdxPos != MBB->end() && IdxPos->isDebugValue())
|
||||
++IdxPos;
|
||||
MachineBasicBlock::const_iterator IdxPos =
|
||||
skipDebugInstructionsForward(CurrPos, MBB->end());
|
||||
if (IdxPos == MBB->end())
|
||||
return LIS->getMBBEndIdx(MBB);
|
||||
return LIS->getInstructionIndex(*IdxPos).getRegSlot();
|
||||
@ -817,9 +816,7 @@ void RegPressureTracker::recedeSkipDebugValues() {
|
||||
static_cast<RegionPressure&>(P).openTop(CurrPos);
|
||||
|
||||
// Find the previous instruction.
|
||||
do
|
||||
--CurrPos;
|
||||
while (CurrPos != MBB->begin() && CurrPos->isDebugValue());
|
||||
CurrPos = skipDebugInstructionsBackward(std::prev(CurrPos), MBB->begin());
|
||||
|
||||
SlotIndex SlotIdx;
|
||||
if (RequireIntervals)
|
||||
@ -895,9 +892,7 @@ void RegPressureTracker::advance(const RegisterOperands &RegOpers) {
|
||||
bumpDeadDefs(RegOpers.DeadDefs);
|
||||
|
||||
// Find the next instruction.
|
||||
do
|
||||
++CurrPos;
|
||||
while (CurrPos != MBB->end() && CurrPos->isDebugValue());
|
||||
CurrPos = skipDebugInstructionsForward(std::next(CurrPos), MBB->end());
|
||||
}
|
||||
|
||||
void RegPressureTracker::advance() {
|
||||
|
Loading…
Reference in New Issue
Block a user