[llvm] r189169 - Add a function object to compare the first or second component of a std::pair.

Benjamin Kramer benny.kra at gmail.com
Sun Aug 25 10:56:58 PDT 2013


On 25.08.2013, at 19:44, David Blaikie <dblaikie at gmail.com> wrote:

> 
> On Aug 24, 2013 5:59 AM, "Benjamin Kramer" <benny.kra at googlemail.com> wrote:
> >
> > Author: d0k
> > Date: Sat Aug 24 07:54:27 2013
> > New Revision: 189169
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=189169&view=rev
> > Log:
> > Add a function object to compare the first or second component of a std::pair.
> 
> Handy. Is (or should) this modeled after any standard library feature in c++11 (or beyond)?

I was looking for something to model it after in C++11 but couldn't find anything. I guess with lambdas the issue is less pressing as it makes writing predicates like this much nicer.

- Ben

> >
> > Replace instances of this scattered around the code base.
> >
> > Modified:
> >     llvm/trunk/include/llvm/ADT/STLExtras.h
> >     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> >     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> >     llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
> >     llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
> >
> > Modified: llvm/trunk/include/llvm/ADT/STLExtras.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=189169&r1=189168&r2=189169&view=diff
> > ==============================================================================
> > --- llvm/trunk/include/llvm/ADT/STLExtras.h (original)
> > +++ llvm/trunk/include/llvm/ADT/STLExtras.h Sat Aug 24 07:54:27 2013
> > @@ -217,6 +217,22 @@ inline tier<T1, T2> tie(T1& f, T2& s) {
> >    return tier<T1, T2>(f, s);
> >  }
> >
> > +/// \brief Function object to check whether the first component of a std::pair
> > +/// compares less than the first component of another std::pair.
> > +struct less_first {
> > +  template <typename T> bool operator()(const T &lhs, const T &rhs) const {
> > +    return lhs.first < rhs.first;
> > +  }
> > +};
> > +
> > +/// \brief Function object to check whether the second component of a std::pair
> > +/// compares less than the second component of another std::pair.
> > +struct less_second {
> > +  template <typename T> bool operator()(const T &lhs, const T &rhs) const {
> > +    return lhs.second < rhs.second;
> > +  }
> > +};
> > +
> >  //===----------------------------------------------------------------------===//
> >  //     Extra additions for arrays
> >  //===----------------------------------------------------------------------===//
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=189169&r1=189168&r2=189169&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Sat Aug 24 07:54:27 2013
> > @@ -1287,12 +1287,6 @@ void AsmPrinter::EmitLLVMUsedList(const
> >    }
> >  }
> >
> > -typedef std::pair<unsigned, Constant*> Structor;
> > -
> > -static bool priority_order(const Structor& lhs, const Structor& rhs) {
> > -  return lhs.first < rhs.first;
> > -}
> > -
> >  /// EmitXXStructorList - Emit the ctor or dtor list taking into account the init
> >  /// priority.
> >  void AsmPrinter::EmitXXStructorList(const Constant *List, bool isCtor) {
> > @@ -1309,6 +1303,7 @@ void AsmPrinter::EmitXXStructorList(cons
> >        !isa<PointerType>(ETy->getTypeAtIndex(1U))) return; // Not (int, ptr).
> >
> >    // Gather the structors in a form that's convenient for sorting by priority.
> > +  typedef std::pair<unsigned, Constant *> Structor;
> >    SmallVector<Structor, 8> Structors;
> >    for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
> >      ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i));
> > @@ -1324,7 +1319,7 @@ void AsmPrinter::EmitXXStructorList(cons
> >    // Emit the function pointers in the target-specific order
> >    const DataLayout *TD = TM.getDataLayout();
> >    unsigned Align = Log2_32(TD->getPointerPrefAlignment());
> > -  std::stable_sort(Structors.begin(), Structors.end(), priority_order);
> > +  std::stable_sort(Structors.begin(), Structors.end(), less_first());
> >    for (unsigned i = 0, e = Structors.size(); i != e; ++i) {
> >      const MCSection *OutputSection =
> >        (isCtor ?
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=189169&r1=189168&r2=189169&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Sat Aug 24 07:54:27 2013
> > @@ -108,16 +108,8 @@ DwarfPubNames("generate-dwarf-pubnames",
> >                           clEnumVal(Disable, "Disabled"), clEnumValEnd),
> >                cl::init(Default));
> >
> > -namespace {
> > -  const char *const DWARFGroupName = "DWARF Emission";
> > -  const char *const DbgTimerName = "DWARF Debug Writer";
> > -
> > -  struct CompareFirst {
> > -    template <typename T> bool operator()(const T &lhs, const T &rhs) const {
> > -      return lhs.first < rhs.first;
> > -    }
> > -  };
> > -} // end anonymous namespace
> > +static const char *const DWARFGroupName = "DWARF Emission";
> > +static const char *const DbgTimerName = "DWARF Debug Writer";
> >
> >  //===----------------------------------------------------------------------===//
> >
> > @@ -625,7 +617,7 @@ DIE *DwarfDebug::constructScopeDIE(Compi
> >                ImportedEntityMap::const_iterator> Range = std::equal_range(
> >          ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
> >          std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
> > -        CompareFirst());
> > +        less_first());
> >      if (Children.empty() && Range.first == Range.second)
> >        return NULL;
> >      ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
> > @@ -879,7 +871,7 @@ void DwarfDebug::beginModule() {
> >            DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
> >            ImportedEntities.getElement(i)));
> >      std::sort(ScopesWithImportedEntities.begin(),
> > -              ScopesWithImportedEntities.end(), CompareFirst());
> > +              ScopesWithImportedEntities.end(), less_first());
> >      DIArray GVs = CUNode.getGlobalVariables();
> >      for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
> >        CU->createGlobalVariableDIE(GVs.getElement(i));
> >
> > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp?rev=189169&r1=189168&r2=189169&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp Sat Aug 24 07:54:27 2013
> > @@ -690,15 +690,6 @@ void ScheduleDAGSDNodes::VerifyScheduled
> >  }
> >  #endif // NDEBUG
> >
> > -namespace {
> > -  struct OrderSorter {
> > -    bool operator()(const std::pair<unsigned, MachineInstr*> &A,
> > -                    const std::pair<unsigned, MachineInstr*> &B) {
> > -      return A.first < B.first;
> > -    }
> > -  };
> > -}
> > -
> >  /// ProcessSDDbgValues - Process SDDbgValues associated with this node.
> >  static void
> >  ProcessSDDbgValues(SDNode *N, SelectionDAG *DAG, InstrEmitter &Emitter,
> > @@ -857,7 +848,7 @@ EmitSchedule(MachineBasicBlock::iterator
> >
> >      // Sort the source order instructions and use the order to insert debug
> >      // values.
> > -    std::sort(Orders.begin(), Orders.end(), OrderSorter());
> > +    std::sort(Orders.begin(), Orders.end(), less_first());
> >
> >      SDDbgInfo::DbgIterator DI = DAG->DbgBegin();
> >      SDDbgInfo::DbgIterator DE = DAG->DbgEnd();
> >
> > Modified: llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp?rev=189169&r1=189168&r2=189169&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp (original)
> > +++ llvm/trunk/lib/Transforms/Utils/PromoteMemoryToRegister.cpp Sat Aug 24 07:54:27 2013
> > @@ -431,16 +431,6 @@ static bool rewriteSingleStoreAlloca(All
> >    return true;
> >  }
> >
> > -namespace {
> > -/// This is a helper predicate used to search by the first element of a pair.
> > -struct StoreIndexSearchPredicate {
> > -  bool operator()(const std::pair<unsigned, StoreInst *> &LHS,
> > -                  const std::pair<unsigned, StoreInst *> &RHS) {
> > -    return LHS.first < RHS.first;
> > -  }
> > -};
> > -}
> > -
> >  /// Many allocas are only used within a single basic block.  If this is the
> >  /// case, avoid traversing the CFG and inserting a lot of potentially useless
> >  /// PHI nodes by just performing a single linear pass over the basic block
> > @@ -473,8 +463,7 @@ static void promoteSingleBlockAlloca(All
> >
> >    // Sort the stores by their index, making it efficient to do a lookup with a
> >    // binary search.
> > -  std::sort(StoresByIndex.begin(), StoresByIndex.end(),
> > -            StoreIndexSearchPredicate());
> > +  std::sort(StoresByIndex.begin(), StoresByIndex.end(), less_first());
> >
> >    // Walk all of the loads from this alloca, replacing them with the nearest
> >    // store above them, if any.
> > @@ -489,7 +478,7 @@ static void promoteSingleBlockAlloca(All
> >      StoresByIndexTy::iterator I =
> >          std::lower_bound(StoresByIndex.begin(), StoresByIndex.end(),
> >                           std::make_pair(LoadIdx, static_cast<StoreInst *>(0)),
> > -                         StoreIndexSearchPredicate());
> > +                         less_first());
> >
> >      if (I == StoresByIndex.begin())
> >        // If there is no store before this load, the load takes the undef value.
> > @@ -849,16 +838,6 @@ void PromoteMem2Reg::ComputeLiveInBlocks
> >    }
> >  }
> >
> > -namespace {
> > -typedef std::pair<DomTreeNode *, unsigned> DomTreeNodePair;
> > -
> > -struct DomTreeNodeCompare {
> > -  bool operator()(const DomTreeNodePair &LHS, const DomTreeNodePair &RHS) {
> > -    return LHS.second < RHS.second;
> > -  }
> > -};
> > -} // end anonymous namespace
> > -
> >  /// At this point, we're committed to promoting the alloca using IDF's, and the
> >  /// standard SSA construction algorithm.  Determine which blocks need phi nodes
> >  /// and see if we can optimize out some work by avoiding insertion of dead phi
> > @@ -876,9 +855,9 @@ void PromoteMem2Reg::DetermineInsertionP
> >
> >    // Use a priority queue keyed on dominator tree level so that inserted nodes
> >    // are handled from the bottom of the dominator tree upwards.
> > -  typedef std::priority_queue<DomTreeNodePair,
> > -                              SmallVector<DomTreeNodePair, 32>,
> > -                              DomTreeNodeCompare> IDFPriorityQueue;
> > +  typedef std::pair<DomTreeNode *, unsigned> DomTreeNodePair;
> > +  typedef std::priority_queue<DomTreeNodePair, SmallVector<DomTreeNodePair, 32>,
> > +                              less_second> IDFPriorityQueue;
> >    IDFPriorityQueue PQ;
> >
> >    for (SmallPtrSet<BasicBlock *, 32>::const_iterator I = DefBlocks.begin(),
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list