[llvm] r225760 - Standardize {pred,succ,use,user}_empty()

David Blaikie dblaikie at gmail.com
Mon Jan 12 20:07:39 PST 2015


I'd sort of rather have a simple "empty(range)" function that could be
applied to any range (equality between iterators should be constant time -
it seems unlikely it's ever going to be substantially more expensive to
test range.begin() == range.end() than some custom empty implementation for
any given sequence) & have more range accessors anywhere they're not
already available.

Not sure what other people think.

- David

On Mon, Jan 12, 2015 at 7:46 PM, Ramkumar Ramachandra <artagnon at gmail.com>
wrote:

> Author: artagnon
> Date: Mon Jan 12 21:46:47 2015
> New Revision: 225760
>
> URL: http://llvm.org/viewvc/llvm-project?rev=225760&view=rev
> Log:
> 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.
>
> Modified:
>     llvm/trunk/include/llvm/IR/CFG.h
>     llvm/trunk/include/llvm/IR/Value.h
>     llvm/trunk/lib/Analysis/CFG.cpp
>     llvm/trunk/lib/IR/Verifier.cpp
>     llvm/trunk/lib/Transforms/IPO/PruneEH.cpp
>     llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>     llvm/trunk/lib/Transforms/Scalar/Reg2Mem.cpp
>     llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>
> Modified: llvm/trunk/include/llvm/IR/CFG.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/CFG.h?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/CFG.h (original)
> +++ llvm/trunk/include/llvm/IR/CFG.h Mon Jan 12 21:46:47 2015
> @@ -93,6 +93,9 @@ inline pred_iterator pred_end(BasicBlock
>  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
>  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;
>
> Modified: llvm/trunk/include/llvm/IR/Value.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Value.h?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Value.h (original)
> +++ llvm/trunk/include/llvm/IR/Value.h Mon Jan 12 21:46:47 2015
> @@ -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);
> }
>
> Modified: llvm/trunk/lib/Analysis/CFG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CFG.cpp?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/CFG.cpp (original)
> +++ llvm/trunk/lib/Analysis/CFG.cpp Mon Jan 12 21:46:47 2015
> @@ -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;
>
> Modified: llvm/trunk/lib/IR/Verifier.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Verifier.cpp (original)
> +++ llvm/trunk/lib/IR/Verifier.cpp Mon Jan 12 21:46:47 2015
> @@ -1128,7 +1128,7 @@ void Verifier::visitFunction(const Funct
>
>      // 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.
>
> Modified: llvm/trunk/lib/Transforms/IPO/PruneEH.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PruneEH.cpp?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/PruneEH.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/PruneEH.cpp Mon Jan 12 21:46:47 2015
> @@ -200,7 +200,7 @@ bool PruneEH::SimplifyFunction(Function
>          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
>  /// 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()];
>
> Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Mon Jan 12 21:46:47
> 2015
> @@ -188,7 +188,7 @@ bool JumpThreading::runOnFunction(Functi
>
>        // 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(Basic
>  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;
>
>
> Modified: llvm/trunk/lib/Transforms/Scalar/Reg2Mem.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reg2Mem.cpp?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/Reg2Mem.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/Reg2Mem.cpp Mon Jan 12 21:46:47 2015
> @@ -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
>
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=225760&r1=225759&r2=225760&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Mon Jan 12 21:46:47
> 2015
> @@ -3020,7 +3020,7 @@ bool SimplifyCFGOpt::SimplifyReturn(Retu
>      }
>
>      // 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
>    }
>
>    // 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);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150112/38d29cb9/attachment.html>


More information about the llvm-commits mailing list