[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