forked from OSchip/llvm-project
Standardize {pred,succ,use,user}_empty()
The functions {pred,succ,use,user}_{begin,end} exist, but many users have to check *_begin() with *_end() by hand to determine if the BasicBlock or User is empty. Fix this with a standard *_empty(), demonstrating a few usecases. llvm-svn: 225760
This commit is contained in:
parent
26a3924a4f
commit
40c3e03e27
|
@ -93,6 +93,9 @@ inline pred_iterator pred_end(BasicBlock *BB) { return pred_iterator(BB, true);}
|
|||
inline const_pred_iterator pred_end(const BasicBlock *BB) {
|
||||
return const_pred_iterator(BB, true);
|
||||
}
|
||||
inline bool pred_empty(const BasicBlock *BB) {
|
||||
return pred_begin(BB) == pred_end(BB);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -257,6 +260,9 @@ inline succ_iterator succ_end(BasicBlock *BB) {
|
|||
inline succ_const_iterator succ_end(const BasicBlock *BB) {
|
||||
return succ_const_iterator(BB->getTerminator(), true);
|
||||
}
|
||||
inline bool succ_empty(const BasicBlock *BB) {
|
||||
return succ_begin(BB) == succ_end(BB);
|
||||
}
|
||||
|
||||
template <typename T, typename U> struct isPodLike<SuccIterator<T, U> > {
|
||||
static const bool value = isPodLike<T>::value;
|
||||
|
|
|
@ -286,6 +286,8 @@ public:
|
|||
return iterator_range<const_use_iterator>(use_begin(), use_end());
|
||||
}
|
||||
|
||||
bool user_empty() const { return UseList == nullptr; }
|
||||
|
||||
typedef user_iterator_impl<User> user_iterator;
|
||||
typedef user_iterator_impl<const User> const_user_iterator;
|
||||
user_iterator user_begin() { return user_iterator(UseList); }
|
||||
|
|
|
@ -27,7 +27,7 @@ using namespace llvm;
|
|||
void llvm::FindFunctionBackedges(const Function &F,
|
||||
SmallVectorImpl<std::pair<const BasicBlock*,const BasicBlock*> > &Result) {
|
||||
const BasicBlock *BB = &F.getEntryBlock();
|
||||
if (succ_begin(BB) == succ_end(BB))
|
||||
if (succ_empty(BB))
|
||||
return;
|
||||
|
||||
SmallPtrSet<const BasicBlock*, 8> Visited;
|
||||
|
|
|
@ -1128,7 +1128,7 @@ void Verifier::visitFunction(const Function &F) {
|
|||
|
||||
// Check the entry node
|
||||
const BasicBlock *Entry = &F.getEntryBlock();
|
||||
Assert1(pred_begin(Entry) == pred_end(Entry),
|
||||
Assert1(pred_empty(Entry),
|
||||
"Entry block to function must not have predecessors!", Entry);
|
||||
|
||||
// The address of the entry block cannot be taken, unless it is dead.
|
||||
|
|
|
@ -200,7 +200,7 @@ bool PruneEH::SimplifyFunction(Function *F) {
|
|||
BB->getInstList().pop_back();
|
||||
|
||||
// If the unwind block is now dead, nuke it.
|
||||
if (pred_begin(UnwindBlock) == pred_end(UnwindBlock))
|
||||
if (pred_empty(UnwindBlock))
|
||||
DeleteBasicBlock(UnwindBlock); // Delete the new BB.
|
||||
|
||||
++NumRemoved;
|
||||
|
@ -234,7 +234,7 @@ bool PruneEH::SimplifyFunction(Function *F) {
|
|||
/// updating the callgraph to reflect any now-obsolete edges due to calls that
|
||||
/// exist in the BB.
|
||||
void PruneEH::DeleteBasicBlock(BasicBlock *BB) {
|
||||
assert(pred_begin(BB) == pred_end(BB) && "BB is not dead!");
|
||||
assert(pred_empty(BB) && "BB is not dead!");
|
||||
CallGraph &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph();
|
||||
|
||||
CallGraphNode *CGN = CG[BB->getParent()];
|
||||
|
|
|
@ -188,7 +188,7 @@ bool JumpThreading::runOnFunction(Function &F) {
|
|||
|
||||
// If the block is trivially dead, zap it. This eliminates the successor
|
||||
// edges which simplifies the CFG.
|
||||
if (pred_begin(BB) == pred_end(BB) &&
|
||||
if (pred_empty(BB) &&
|
||||
BB != &BB->getParent()->getEntryBlock()) {
|
||||
DEBUG(dbgs() << " JT: Deleting dead block '" << BB->getName()
|
||||
<< "' with terminator: " << *BB->getTerminator() << '\n');
|
||||
|
@ -662,7 +662,7 @@ static bool hasAddressTakenAndUsed(BasicBlock *BB) {
|
|||
bool JumpThreading::ProcessBlock(BasicBlock *BB) {
|
||||
// If the block is trivially dead, just return and let the caller nuke it.
|
||||
// This simplifies other transformations.
|
||||
if (pred_begin(BB) == pred_end(BB) &&
|
||||
if (pred_empty(BB) &&
|
||||
BB != &BB->getParent()->getEntryBlock())
|
||||
return false;
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ bool RegToMem::runOnFunction(Function &F) {
|
|||
|
||||
// Insert all new allocas into entry block.
|
||||
BasicBlock *BBEntry = &F.getEntryBlock();
|
||||
assert(pred_begin(BBEntry) == pred_end(BBEntry) &&
|
||||
assert(pred_empty(BBEntry) &&
|
||||
"Entry block to function must not have predecessors!");
|
||||
|
||||
// Find first non-alloca instruction and create insertion point. This is
|
||||
|
|
|
@ -3020,7 +3020,7 @@ bool SimplifyCFGOpt::SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) {
|
|||
}
|
||||
|
||||
// If we eliminated all predecessors of the block, delete the block now.
|
||||
if (pred_begin(BB) == pred_end(BB))
|
||||
if (pred_empty(BB))
|
||||
// We know there are no successors, so just nuke the block.
|
||||
BB->eraseFromParent();
|
||||
|
||||
|
@ -3193,7 +3193,7 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) {
|
|||
}
|
||||
|
||||
// If this block is now dead, remove it.
|
||||
if (pred_begin(BB) == pred_end(BB) &&
|
||||
if (pred_empty(BB) &&
|
||||
BB != &BB->getParent()->getEntryBlock()) {
|
||||
// We know there are no successors, so just nuke the block.
|
||||
BB->eraseFromParent();
|
||||
|
@ -4587,7 +4587,7 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
|||
|
||||
// Remove basic blocks that have no predecessors (except the entry block)...
|
||||
// or that just have themself as a predecessor. These are unreachable.
|
||||
if ((pred_begin(BB) == pred_end(BB) &&
|
||||
if ((pred_emtpy(BB) &&
|
||||
BB != &BB->getParent()->getEntryBlock()) ||
|
||||
BB->getSinglePredecessor() == BB) {
|
||||
DEBUG(dbgs() << "Removing BB: \n" << *BB);
|
||||
|
|
Loading…
Reference in New Issue