mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
Implement depth_first and inverse_depth_first range factory functions.
Also updated as many loops as I could find using df_begin/idf_begin - strangely I found no uses of idf_begin. Is that just used out of tree? Also a few places couldn't use df_begin because either they used the member functions of the depth first iterators or had specific ordering constraints (I added a comment in the latter case). Based on a patch by Jim Grosbach. (Jim - you just had iterator_range<T> where you needed iterator_range<idf_iterator<T>>) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206016 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ae64ab542a
commit
77cf856e56
@ -33,6 +33,7 @@
|
||||
#ifndef LLVM_ADT_DEPTHFIRSTITERATOR_H
|
||||
#define LLVM_ADT_DEPTHFIRSTITERATOR_H
|
||||
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/ADT/GraphTraits.h"
|
||||
#include "llvm/ADT/PointerIntPair.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
@ -207,6 +208,12 @@ df_iterator<T> df_end(const T& G) {
|
||||
return df_iterator<T>::end(G);
|
||||
}
|
||||
|
||||
// Provide an accessor method to use them in range-based patterns.
|
||||
template <class T>
|
||||
iterator_range<df_iterator<T>> depth_first(const T& G) {
|
||||
return iterator_range<df_iterator<T>>(df_begin(G), df_end(G));
|
||||
}
|
||||
|
||||
// Provide global definitions of external depth first iterators...
|
||||
template <class T, class SetTy = std::set<typename GraphTraits<T>::NodeType*> >
|
||||
struct df_ext_iterator : public df_iterator<T, SetTy, true> {
|
||||
@ -244,6 +251,12 @@ idf_iterator<T> idf_end(const T& G){
|
||||
return idf_iterator<T>::end(Inverse<T>(G));
|
||||
}
|
||||
|
||||
// Provide an accessor method to use them in range-based patterns.
|
||||
template <class T>
|
||||
iterator_range<idf_iterator<T>> inverse_depth_first(const T& G) {
|
||||
return iterator_range<idf_iterator<T>>(idf_begin(G), idf_end(G));
|
||||
}
|
||||
|
||||
// Provide global definitions of external inverse depth first iterators...
|
||||
template <class T, class SetTy = std::set<typename GraphTraits<T>::NodeType*> >
|
||||
struct idf_ext_iterator : public idf_iterator<T, SetTy, true> {
|
||||
|
@ -270,11 +270,10 @@ void LoopBase<BlockT, LoopT>::verifyLoop() const {
|
||||
// though it is permitted if the predecessor is not itself actually
|
||||
// reachable.
|
||||
BlockT *EntryBB = BB->getParent()->begin();
|
||||
for (df_iterator<BlockT *> NI = df_begin(EntryBB),
|
||||
NE = df_end(EntryBB); NI != NE; ++NI)
|
||||
for (unsigned i = 0, e = OutsideLoopPreds.size(); i != e; ++i)
|
||||
assert(*NI != OutsideLoopPreds[i] &&
|
||||
"Loop has multiple entry points!");
|
||||
for (BlockT *CB : depth_first(EntryBB))
|
||||
for (unsigned i = 0, e = OutsideLoopPreds.size(); i != e; ++i)
|
||||
assert(CB != OutsideLoopPreds[i] &&
|
||||
"Loop has multiple entry points!");
|
||||
}
|
||||
assert(HasInsideLoopPreds && "Loop block has no in-loop predecessors!");
|
||||
assert(HasInsideLoopSuccs && "Loop block has no in-loop successors!");
|
||||
|
@ -193,12 +193,11 @@ void StackColoring::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
}
|
||||
|
||||
void StackColoring::dump() const {
|
||||
for (df_iterator<MachineFunction*> FI = df_begin(MF), FE = df_end(MF);
|
||||
FI != FE; ++FI) {
|
||||
DEBUG(dbgs()<<"Inspecting block #"<<BasicBlocks.lookup(*FI)<<
|
||||
" ["<<FI->getName()<<"]\n");
|
||||
for (MachineBasicBlock *MBB : depth_first(MF)) {
|
||||
DEBUG(dbgs() << "Inspecting block #" << BasicBlocks.lookup(MBB) << " ["
|
||||
<< MBB->getName() << "]\n");
|
||||
|
||||
LivenessMap::const_iterator BI = BlockLiveness.find(*FI);
|
||||
LivenessMap::const_iterator BI = BlockLiveness.find(MBB);
|
||||
assert(BI != BlockLiveness.end() && "Block not found");
|
||||
const BlockLifetimeInfo &BlockInfo = BI->second;
|
||||
|
||||
@ -231,20 +230,19 @@ unsigned StackColoring::collectMarkers(unsigned NumSlot) {
|
||||
// NOTE: We use the a reverse-post-order iteration to ensure that we obtain a
|
||||
// deterministic numbering, and because we'll need a post-order iteration
|
||||
// later for solving the liveness dataflow problem.
|
||||
for (df_iterator<MachineFunction*> FI = df_begin(MF), FE = df_end(MF);
|
||||
FI != FE; ++FI) {
|
||||
for (MachineBasicBlock *MBB : depth_first(MF)) {
|
||||
|
||||
// Assign a serial number to this basic block.
|
||||
BasicBlocks[*FI] = BasicBlockNumbering.size();
|
||||
BasicBlockNumbering.push_back(*FI);
|
||||
BasicBlocks[MBB] = BasicBlockNumbering.size();
|
||||
BasicBlockNumbering.push_back(MBB);
|
||||
|
||||
// Keep a reference to avoid repeated lookups.
|
||||
BlockLifetimeInfo &BlockInfo = BlockLiveness[*FI];
|
||||
BlockLifetimeInfo &BlockInfo = BlockLiveness[MBB];
|
||||
|
||||
BlockInfo.Begin.resize(NumSlot);
|
||||
BlockInfo.End.resize(NumSlot);
|
||||
|
||||
for (MachineInstr &MI : **FI) {
|
||||
for (MachineInstr &MI : *MBB) {
|
||||
if (MI.getOpcode() != TargetOpcode::LIFETIME_START &&
|
||||
MI.getOpcode() != TargetOpcode::LIFETIME_END)
|
||||
continue;
|
||||
|
@ -908,7 +908,7 @@ bool ARM64ConditionalCompares::runOnMachineFunction(MachineFunction &MF) {
|
||||
// Note that updateDomTree() modifies the children of the DomTree node
|
||||
// currently being visited. The df_iterator supports that; it doesn't look at
|
||||
// child_begin() / child_end() until after a node has been visited.
|
||||
for (auto *I : make_range(df_begin(DomTree), df_end(DomTree)))
|
||||
for (auto *I : depth_first(DomTree))
|
||||
if (tryConvert(I->getBlock()))
|
||||
Changed = true;
|
||||
|
||||
|
@ -1075,13 +1075,11 @@ int AMDGPUCFGStructurizer::ifPatternMatch(MachineBasicBlock *MBB) {
|
||||
|
||||
int AMDGPUCFGStructurizer::loopendPatternMatch() {
|
||||
std::vector<MachineLoop *> NestedLoops;
|
||||
for (MachineLoopInfo::iterator It = MLI->begin(), E = MLI->end();
|
||||
It != E; ++It) {
|
||||
df_iterator<MachineLoop *> LpIt = df_begin(*It),
|
||||
LpE = df_end(*It);
|
||||
for (; LpIt != LpE; ++LpIt)
|
||||
NestedLoops.push_back(*LpIt);
|
||||
}
|
||||
for (MachineLoopInfo::iterator It = MLI->begin(), E = MLI->end(); It != E;
|
||||
++It)
|
||||
for (MachineLoop *ML : depth_first(*It))
|
||||
NestedLoops.push_back(ML);
|
||||
|
||||
if (NestedLoops.size() == 0)
|
||||
return 0;
|
||||
|
||||
|
@ -443,11 +443,9 @@ struct FunctionStackPoisoner : public InstVisitor<FunctionStackPoisoner> {
|
||||
bool runOnFunction() {
|
||||
if (!ClStack) return false;
|
||||
// Collect alloca, ret, lifetime instructions etc.
|
||||
for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
|
||||
DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
|
||||
BasicBlock *BB = *DI;
|
||||
for (BasicBlock *BB : depth_first(&F.getEntryBlock()))
|
||||
visit(*BB);
|
||||
}
|
||||
|
||||
if (AllocaVec.empty()) return false;
|
||||
|
||||
initializeCallbacks(*F.getParent());
|
||||
|
@ -680,9 +680,8 @@ bool DataFlowSanitizer::runOnModule(Module &M) {
|
||||
|
||||
// DFSanVisitor may create new basic blocks, which confuses df_iterator.
|
||||
// Build a copy of the list before iterating over it.
|
||||
llvm::SmallVector<BasicBlock *, 4> BBList;
|
||||
std::copy(df_begin(&(*i)->getEntryBlock()), df_end(&(*i)->getEntryBlock()),
|
||||
std::back_inserter(BBList));
|
||||
llvm::SmallVector<BasicBlock *, 4> BBList(
|
||||
depth_first(&(*i)->getEntryBlock()));
|
||||
|
||||
for (llvm::SmallVector<BasicBlock *, 4>::iterator i = BBList.begin(),
|
||||
e = BBList.end();
|
||||
|
@ -662,11 +662,9 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
// Iterate all BBs in depth-first order and create shadow instructions
|
||||
// for all instructions (where applicable).
|
||||
// For PHI nodes we create dummy shadow PHIs which will be finalized later.
|
||||
for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
|
||||
DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
|
||||
BasicBlock *BB = *DI;
|
||||
for (BasicBlock *BB : depth_first(&F.getEntryBlock()))
|
||||
visit(*BB);
|
||||
}
|
||||
|
||||
|
||||
// Finalize PHI nodes.
|
||||
for (size_t i = 0, n = ShadowPHINodes.size(); i < n; i++) {
|
||||
|
@ -2421,10 +2421,7 @@ bool GVN::processBlock(BasicBlock *BB) {
|
||||
bool GVN::performPRE(Function &F) {
|
||||
bool Changed = false;
|
||||
SmallVector<std::pair<Value*, BasicBlock*>, 8> predMap;
|
||||
for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
|
||||
DE = df_end(&F.getEntryBlock()); DI != DE; ++DI) {
|
||||
BasicBlock *CurrentBlock = *DI;
|
||||
|
||||
for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
|
||||
// Nothing to PRE in the entry block.
|
||||
if (CurrentBlock == &F.getEntryBlock()) continue;
|
||||
|
||||
@ -2637,9 +2634,8 @@ bool GVN::iterateOnFunction(Function &F) {
|
||||
//
|
||||
std::vector<BasicBlock *> BBVect;
|
||||
BBVect.reserve(256);
|
||||
for (df_iterator<DomTreeNode*> DI = df_begin(DT->getRootNode()),
|
||||
DE = df_end(DT->getRootNode()); DI != DE; ++DI)
|
||||
BBVect.push_back(DI->getBlock());
|
||||
for (DomTreeNode *x : depth_first(DT->getRootNode()))
|
||||
BBVect.push_back(x->getBlock());
|
||||
|
||||
for (std::vector<BasicBlock *>::iterator I = BBVect.begin(), E = BBVect.end();
|
||||
I != E; I++)
|
||||
|
@ -55,9 +55,10 @@ namespace {
|
||||
bool Changed = false;
|
||||
|
||||
do {
|
||||
for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
|
||||
DE = df_end(&F.getEntryBlock()); DI != DE; ++DI)
|
||||
for (BasicBlock::iterator BI = DI->begin(), BE = DI->end(); BI != BE;) {
|
||||
for (BasicBlock *BB : depth_first(&F.getEntryBlock()))
|
||||
// Here be subtlety: the iterator must be incremented before the loop
|
||||
// body (not sure why), so a range-for loop won't work here.
|
||||
for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
|
||||
Instruction *I = BI++;
|
||||
// The first time through the loop ToSimplify is empty and we try to
|
||||
// simplify all instructions. On later iterations ToSimplify is not
|
||||
|
Loading…
x
Reference in New Issue
Block a user