<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Mar 1, 2014 at 3:47 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Sat Mar 1 05:47:00 2014<br>
New Revision: 202588<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=202588&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=202588&view=rev</a><br>
Log:<br>
Now that we have C++11, turn simple functors into lambdas and remove a ton of boilerplate.<br>
<br>
No intended functionality change.<br>
<br>
Modified:<br>
llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp<br>
llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp<br>
llvm/trunk/lib/CodeGen/MachineSink.cpp<br>
llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
llvm/trunk/lib/CodeGen/StackColoring.cpp<br>
llvm/trunk/lib/Support/CommandLine.cpp<br>
llvm/trunk/lib/Support/Statistic.cpp<br>
llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp<br>
llvm/trunk/lib/Target/Mips/MipsDelaySlotFiller.cpp<br>
llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp<br>
llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp<br>
llvm/trunk/lib/Transforms/Scalar/GlobalMerge.cpp<br>
llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp<br>
llvm/trunk/lib/Transforms/Scalar/SROA.cpp<br>
llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp<br>
llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp<br>
llvm/trunk/utils/TableGen/CodeGenRegisters.cpp<br>
llvm/trunk/utils/TableGen/CodeGenTarget.cpp<br>
llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp Sat Mar 1 05:47:00 2014<br>
@@ -173,29 +173,19 @@ void ValueEnumerator::print(raw_ostream<br>
}<br>
}<br>
<br>
-// Optimize constant ordering.<br>
-namespace {<br>
- struct CstSortPredicate {<br>
- ValueEnumerator &VE;<br>
- explicit CstSortPredicate(ValueEnumerator &ve) : VE(ve) {}<br>
- bool operator()(const std::pair<const Value*, unsigned> &LHS,<br>
- const std::pair<const Value*, unsigned> &RHS) {<br>
- // Sort by plane.<br>
- if (LHS.first->getType() != RHS.first->getType())<br>
- return VE.getTypeID(LHS.first->getType()) <<br>
- VE.getTypeID(RHS.first->getType());<br>
- // Then by frequency.<br>
- return LHS.second > RHS.second;<br>
- }<br>
- };<br>
-}<br>
-<br>
/// OptimizeConstants - Reorder constant pool for denser encoding.<br>
void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) {<br>
if (CstStart == CstEnd || CstStart+1 == CstEnd) return;<br>
<br>
- CstSortPredicate P(*this);<br>
- std::stable_sort(Values.begin()+CstStart, Values.begin()+CstEnd, P);<br>
+ std::stable_sort(Values.begin() + CstStart, Values.begin() + CstEnd,<br>
+ [this](const std::pair<const Value *, unsigned> &LHS,<br>
+ const std::pair<const Value *, unsigned> &RHS) {<br>
+ // Sort by plane.<br>
+ if (LHS.first->getType() != RHS.first->getType())<br>
+ return getTypeID(LHS.first->getType()) < getTypeID(RHS.first->getType());<br>
+ // Then by frequency.<br>
+ return LHS.second > RHS.second;<br></blockquote><div><br></div><div>I think I mentioned this off-list (by accident, replying on my phone) & not sure if it's already been addressed, but should we implement these sort of sorts via std::tie and tuple's op<?<br>
<br>return std::tie(getTypeID(LHS.first->getType()), LHS.second) < std::tie(getTypeID(RHS.first->getType()), RHS.second);<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ });<br>
<br>
// Ensure that integer and vector of integer constants are at the start of the<br>
// constant pool. This is important so that GEP structure indices come before<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Sat Mar 1 05:47:00 2014<br>
@@ -409,23 +409,6 @@ MachineBasicBlock *MachineBlockPlacement<br>
return BestSucc;<br>
}<br>
<br>
-namespace {<br>
-/// \brief Predicate struct to detect blocks already placed.<br>
-class IsBlockPlaced {<br>
- const BlockChain &PlacedChain;<br>
- const BlockToChainMapType &BlockToChain;<br>
-<br>
-public:<br>
- IsBlockPlaced(const BlockChain &PlacedChain,<br>
- const BlockToChainMapType &BlockToChain)<br>
- : PlacedChain(PlacedChain), BlockToChain(BlockToChain) {}<br>
-<br>
- bool operator()(MachineBasicBlock *BB) const {<br>
- return BlockToChain.lookup(BB) == &PlacedChain;<br>
- }<br>
-};<br>
-}<br>
-<br>
/// \brief Select the best block from a worklist.<br>
///<br>
/// This looks through the provided worklist as a list of candidate basic<br>
@@ -444,7 +427,9 @@ MachineBasicBlock *MachineBlockPlacement<br>
// FIXME: If this shows up on profiles, it could be folded (at the cost of<br>
// some code complexity) into the loop below.<br>
WorkList.erase(std::remove_if(WorkList.begin(), WorkList.end(),<br>
- IsBlockPlaced(Chain, BlockToChain)),<br>
+ [&](MachineBasicBlock *BB) {<br>
+ return BlockToChain.lookup(BB) == &Chain;<br>
+ }),<br>
WorkList.end());<br>
<br>
MachineBasicBlock *BestBlock = 0;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MachineSink.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSink.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSink.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MachineSink.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MachineSink.cpp Sat Mar 1 05:47:00 2014<br>
@@ -98,16 +98,6 @@ namespace {<br>
bool PerformTrivialForwardCoalescing(MachineInstr *MI,<br>
MachineBasicBlock *MBB);<br>
};<br>
-<br>
- // SuccessorSorter - Sort Successors according to their loop depth.<br>
- struct SuccessorSorter {<br>
- SuccessorSorter(MachineLoopInfo *LoopInfo) : LI(LoopInfo) {}<br>
- bool operator()(const MachineBasicBlock *LHS,<br>
- const MachineBasicBlock *RHS) const {<br>
- return LI->getLoopDepth(LHS) < LI->getLoopDepth(RHS);<br>
- }<br>
- MachineLoopInfo *LI;<br>
- };<br>
} // end anonymous namespace<br>
<br>
char MachineSinking::ID = 0;<br>
@@ -553,7 +543,12 @@ MachineBasicBlock *MachineSinking::FindS<br>
// we should sink to.<br>
// We give successors with smaller loop depth higher priority.<br>
SmallVector<MachineBasicBlock*, 4> Succs(MBB->succ_begin(), MBB->succ_end());<br>
- std::stable_sort(Succs.begin(), Succs.end(), SuccessorSorter(LI));<br>
+ // Sort Successors according to their loop depth.<br>
+ std::stable_sort(<br>
+ Succs.begin(), Succs.end(),<br>
+ [this](const MachineBasicBlock *LHS, const MachineBasicBlock *RHS) {<br>
+ return LI->getLoopDepth(LHS) < LI->getLoopDepth(RHS);<br>
+ });<br>
for (SmallVectorImpl<MachineBasicBlock *>::iterator SI = Succs.begin(),<br>
E = Succs.end(); SI != E; ++SI) {<br>
MachineBasicBlock *SuccBlock = *SI;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Sat Mar 1 05:47:00 2014<br>
@@ -8197,14 +8197,6 @@ struct LoadedSlice {<br>
};<br>
}<br>
<br>
-/// \brief Sorts LoadedSlice according to their offset.<br>
-struct LoadedSliceSorter {<br>
- bool operator()(const LoadedSlice &LHS, const LoadedSlice &RHS) {<br>
- assert(LHS.Origin == RHS.Origin && "Different bases not implemented.");<br>
- return LHS.getOffsetFromBase() < RHS.getOffsetFromBase();<br>
- }<br>
-};<br>
-<br>
/// \brief Check that all bits set in \p UsedBits form a dense region, i.e.,<br>
/// \p UsedBits looks like 0..0 1..1 0..0.<br>
static bool areUsedBitsDense(const APInt &UsedBits) {<br>
@@ -8248,7 +8240,11 @@ static void adjustCostForPairing(SmallVe<br>
<br>
// Sort the slices so that elements that are likely to be next to each<br>
// other in memory are next to each other in the list.<br>
- std::sort(LoadedSlices.begin(), LoadedSlices.end(), LoadedSliceSorter());<br>
+ std::sort(LoadedSlices.begin(), LoadedSlices.end(),<br>
+ [](const LoadedSlice &LHS, const LoadedSlice &RHS) {<br>
+ assert(LHS.Origin == RHS.Origin && "Different bases not implemented.");<br>
+ return LHS.getOffsetFromBase() < RHS.getOffsetFromBase();<br>
+ });<br>
const TargetLowering &TLI = LoadedSlices[0].DAG->getTargetLoweringInfo();<br>
// First (resp. Second) is the first (resp. Second) potentially candidate<br>
// to be placed in a paired load.<br>
@@ -8852,17 +8848,6 @@ struct MemOpLink {<br>
unsigned SequenceNum;<br>
};<br>
<br>
-/// Sorts store nodes in a link according to their offset from a shared<br>
-// base ptr.<br>
-struct ConsecutiveMemoryChainSorter {<br>
- bool operator()(MemOpLink LHS, MemOpLink RHS) {<br>
- return<br>
- LHS.OffsetFromBase < RHS.OffsetFromBase ||<br>
- (LHS.OffsetFromBase == RHS.OffsetFromBase &&<br>
- LHS.SequenceNum > RHS.SequenceNum);<br>
- }<br>
-};<br>
-<br>
bool DAGCombiner::MergeConsecutiveStores(StoreSDNode* St) {<br>
EVT MemVT = St->getMemoryVT();<br>
int64_t ElementSizeBytes = MemVT.getSizeInBits()/8;<br>
@@ -8981,7 +8966,11 @@ bool DAGCombiner::MergeConsecutiveStores<br>
<br>
// Sort the memory operands according to their distance from the base pointer.<br>
std::sort(StoreNodes.begin(), StoreNodes.end(),<br>
- ConsecutiveMemoryChainSorter());<br>
+ [](MemOpLink LHS, MemOpLink RHS) {<br>
+ return LHS.OffsetFromBase < RHS.OffsetFromBase ||<br>
+ (LHS.OffsetFromBase == RHS.OffsetFromBase &&<br>
+ LHS.SequenceNum > RHS.SequenceNum);<br>
+ });<br>
<br>
// Scan the memory operations on the chain and find the first non-consecutive<br>
// store memory address.<br>
<br>
Modified: llvm/trunk/lib/CodeGen/StackColoring.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackColoring.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackColoring.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/StackColoring.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/StackColoring.cpp Sat Mar 1 05:47:00 2014<br>
@@ -125,20 +125,6 @@ class StackColoring : public MachineFunc<br>
/// once the coloring is done.<br>
SmallVector<MachineInstr*, 8> Markers;<br>
<br>
- /// SlotSizeSorter - A Sort utility for arranging stack slots according<br>
- /// to their size.<br>
- struct SlotSizeSorter {<br>
- MachineFrameInfo *MFI;<br>
- SlotSizeSorter(MachineFrameInfo *mfi) : MFI(mfi) { }<br>
- bool operator()(int LHS, int RHS) {<br>
- // We use -1 to denote a uninteresting slot. Place these slots at the end.<br>
- if (LHS == -1) return false;<br>
- if (RHS == -1) return true;<br>
- // Sort according to size.<br>
- return MFI->getObjectSize(LHS) > MFI->getObjectSize(RHS);<br>
- }<br>
-};<br>
-<br>
public:<br>
static char ID;<br>
StackColoring() : MachineFunctionPass(ID) {<br>
@@ -767,7 +753,13 @@ bool StackColoring::runOnMachineFunction<br>
// Sort the slots according to their size. Place unused slots at the end.<br>
// Use stable sort to guarantee deterministic code generation.<br>
std::stable_sort(SortedSlots.begin(), SortedSlots.end(),<br>
- SlotSizeSorter(MFI));<br>
+ [this](int LHS, int RHS) {<br>
+ // We use -1 to denote a uninteresting slot. Place these slots at the end.<br>
+ if (LHS == -1) return false;<br>
+ if (RHS == -1) return true;<br>
+ // Sort according to size.<br>
+ return MFI->getObjectSize(LHS) > MFI->getObjectSize(RHS);<br>
+ });<br>
<br>
bool Changed = true;<br>
while (Changed) {<br>
<br>
Modified: llvm/trunk/lib/Support/CommandLine.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/CommandLine.cpp (original)<br>
+++ llvm/trunk/lib/Support/CommandLine.cpp Sat Mar 1 05:47:00 2014<br>
@@ -125,20 +125,12 @@ static ManagedStatic<OptionCatSet> Regis<br>
// Initialise the general option category.<br>
OptionCategory llvm::cl::GeneralCategory("General options");<br>
<br>
-struct HasName {<br>
- HasName(StringRef Name) : Name(Name) {}<br>
- bool operator()(const OptionCategory *Category) const {<br>
- return Name == Category->getName();<br>
- }<br>
- StringRef Name;<br>
-};<br>
-<br>
-void OptionCategory::registerCategory()<br>
-{<br>
+void OptionCategory::registerCategory() {<br>
assert(std::count_if(RegisteredOptionCategories->begin(),<br>
RegisteredOptionCategories->end(),<br>
- HasName(getName())) == 0 &&<br>
- "Duplicate option categories");<br>
+ [this](const OptionCategory *Category) {<br>
+ return getName() == Category->getName();<br>
+ }) == 0 && "Duplicate option categories");<br>
<br>
RegisteredOptionCategories->insert(this);<br>
}<br>
<br>
Modified: llvm/trunk/lib/Support/Statistic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Statistic.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Statistic.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/Statistic.cpp (original)<br>
+++ llvm/trunk/lib/Support/Statistic.cpp Sat Mar 1 05:47:00 2014<br>
@@ -84,20 +84,6 @@ void Statistic::RegisterStatistic() {<br>
}<br>
}<br>
<br>
-namespace {<br>
-<br>
-struct NameCompare {<br>
- bool operator()(const Statistic *LHS, const Statistic *RHS) const {<br>
- int Cmp = std::strcmp(LHS->getName(), RHS->getName());<br>
- if (Cmp != 0) return Cmp < 0;<br>
-<br>
- // Secondary key is the description.<br>
- return std::strcmp(LHS->getDesc(), RHS->getDesc()) < 0;<br>
- }<br>
-};<br>
-<br>
-}<br>
-<br>
// Print information when destroyed, iff command line option is specified.<br>
StatisticInfo::~StatisticInfo() {<br>
llvm::PrintStatistics();<br>
@@ -124,7 +110,14 @@ void llvm::PrintStatistics(raw_ostream &<br>
}<br>
<br>
// Sort the fields by name.<br>
- std::stable_sort(Stats.Stats.begin(), Stats.Stats.end(), NameCompare());<br>
+ std::stable_sort(Stats.Stats.begin(), Stats.Stats.end(),<br>
+ [](const Statistic *LHS, const Statistic *RHS) {<br>
+ if (int Cmp = std::strcmp(LHS->getName(), RHS->getName()))<br>
+ return Cmp < 0;<br>
+<br>
+ // Secondary key is the description.<br>
+ return std::strcmp(LHS->getDesc(), RHS->getDesc()) < 0;<br>
+ });<br>
<br>
// Print out the statistics header...<br>
OS << "===" << std::string(73, '-') << "===\n"<br>
<br>
Modified: llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp (original)<br>
+++ llvm/trunk/lib/Target/ARM/ARMLoadStoreOptimizer.cpp Sat Mar 1 05:47:00 2014<br>
@@ -1724,17 +1724,6 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWor<br>
return true;<br>
}<br>
<br>
-namespace {<br>
- struct OffsetCompare {<br>
- bool operator()(const MachineInstr *LHS, const MachineInstr *RHS) const {<br>
- int LOffset = getMemoryOpOffset(LHS);<br>
- int ROffset = getMemoryOpOffset(RHS);<br>
- assert(LHS == RHS || LOffset != ROffset);<br>
- return LOffset > ROffset;<br>
- }<br>
- };<br>
-}<br>
-<br>
bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,<br>
SmallVectorImpl<MachineInstr *> &Ops,<br>
unsigned Base, bool isLd,<br>
@@ -1742,7 +1731,13 @@ bool ARMPreAllocLoadStoreOpt::Reschedule<br>
bool RetVal = false;<br>
<br>
// Sort by offset (in reverse order).<br>
- std::sort(Ops.begin(), Ops.end(), OffsetCompare());<br>
+ std::sort(Ops.begin(), Ops.end(),<br>
+ [](const MachineInstr *LHS, const MachineInstr *RHS) {<br>
+ int LOffset = getMemoryOpOffset(LHS);<br>
+ int ROffset = getMemoryOpOffset(RHS);<br>
+ assert(LHS == RHS || LOffset != ROffset);<br>
+ return LOffset > ROffset;<br>
+ });<br>
<br>
// The loads / stores of the same base are in order. Scan them from first to<br>
// last and check for the following:<br>
<br>
Modified: llvm/trunk/lib/Target/Mips/MipsDelaySlotFiller.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsDelaySlotFiller.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsDelaySlotFiller.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/Mips/MipsDelaySlotFiller.cpp (original)<br>
+++ llvm/trunk/lib/Target/Mips/MipsDelaySlotFiller.cpp Sat Mar 1 05:47:00 2014<br>
@@ -65,20 +65,6 @@ namespace {<br>
typedef MachineBasicBlock::reverse_iterator ReverseIter;<br>
typedef SmallDenseMap<MachineBasicBlock*, MachineInstr*, 2> BB2BrMap;<br>
<br>
- /// \brief A functor comparing edge weight of two blocks.<br>
- struct CmpWeight {<br>
- CmpWeight(const MachineBasicBlock &S,<br>
- const MachineBranchProbabilityInfo &P) : Src(S), Prob(P) {}<br>
-<br>
- bool operator()(const MachineBasicBlock *Dst0,<br>
- const MachineBasicBlock *Dst1) const {<br>
- return Prob.getEdgeWeight(&Src, Dst0) < Prob.getEdgeWeight(&Src, Dst1);<br>
- }<br>
-<br>
- const MachineBasicBlock &Src;<br>
- const MachineBranchProbabilityInfo &Prob;<br>
- };<br>
-<br>
class RegDefsUses {<br>
public:<br>
RegDefsUses(TargetMachine &TM);<br>
@@ -640,8 +626,12 @@ MachineBasicBlock *Filler::selectSuccBB(<br>
return NULL;<br>
<br>
// Select the successor with the larget edge weight.<br>
- CmpWeight Cmp(B, getAnalysis<MachineBranchProbabilityInfo>());<br>
- MachineBasicBlock *S = *std::max_element(B.succ_begin(), B.succ_end(), Cmp);<br>
+ auto &Prob = getAnalysis<MachineBranchProbabilityInfo>();<br>
+ MachineBasicBlock *S = *std::max_element(B.succ_begin(), B.succ_end(),<br>
+ [&](const MachineBasicBlock *Dst0,<br>
+ const MachineBasicBlock *Dst1) {<br>
+ return Prob.getEdgeWeight(&B, Dst0) < Prob.getEdgeWeight(&B, Dst1);<br>
+ });<br>
return S->isLandingPad() ? NULL : S;<br>
}<br>
<br>
<br>
Modified: llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Instrumentation/GCOVProfiling.cpp Sat Mar 1 05:47:00 2014<br>
@@ -239,14 +239,6 @@ namespace {<br>
};<br>
<br>
<br>
- // Sorting function for deterministic behaviour in GCOVBlock::writeOut.<br>
- struct StringKeySort {<br>
- bool operator()(StringMapEntry<GCOVLines *> *LHS,<br>
- StringMapEntry<GCOVLines *> *RHS) const {<br>
- return LHS->getKey() < RHS->getKey();<br>
- }<br>
- };<br>
-<br>
// Represent a basic block in GCOV. Each block has a unique number in the<br>
// function, number of lines belonging to each block, and a set of edges to<br>
// other blocks.<br>
@@ -277,8 +269,11 @@ namespace {<br>
write(Len);<br>
write(Number);<br>
<br>
- StringKeySort Sorter;<br>
- std::sort(SortedLinesByFile.begin(), SortedLinesByFile.end(), Sorter);<br>
+ std::sort(SortedLinesByFile.begin(), SortedLinesByFile.end(),<br>
+ [](StringMapEntry<GCOVLines *> *LHS,<br>
+ StringMapEntry<GCOVLines *> *RHS) {<br>
+ return LHS->getKey() < RHS->getKey();<br>
+ });<br>
for (SmallVectorImpl<StringMapEntry<GCOVLines *> *>::iterator<br>
I = SortedLinesByFile.begin(), E = SortedLinesByFile.end();<br>
I != E; ++I)<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Sat Mar 1 05:47:00 2014<br>
@@ -702,22 +702,6 @@ bool DSE::HandleFree(CallInst *F) {<br>
return MadeChange;<br>
}<br>
<br>
-namespace {<br>
- struct CouldRef {<br>
- typedef Value *argument_type;<br>
- const CallSite CS;<br>
- AliasAnalysis *AA;<br>
-<br>
- bool operator()(Value *I) {<br>
- // See if the call site touches the value.<br>
- AliasAnalysis::ModRefResult A =<br>
- AA->getModRefInfo(CS, I, getPointerSize(I, *AA));<br>
-<br>
- return A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref;<br>
- }<br>
- };<br>
-}<br>
-<br>
/// handleEndBlock - Remove dead stores to stack-allocated locations in the<br>
/// function end block. Ex:<br>
/// %A = alloca i32<br>
@@ -819,7 +803,13 @@ bool DSE::handleEndBlock(BasicBlock &BB)<br>
<br>
// If the call might load from any of our allocas, then any store above<br>
// the call is live.<br>
- CouldRef Pred = { CS, AA };<br>
+ std::function<bool(Value *)> Pred = [&](Value *I) {<br>
+ // See if the call site touches the value.<br>
+ AliasAnalysis::ModRefResult A =<br>
+ AA->getModRefInfo(CS, I, getPointerSize(I, *AA));<br>
+<br>
+ return A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref;<br>
+ };<br>
DeadStackObjects.remove_if(Pred);<br>
<br>
// If all of the allocas were clobbered by the call then we're not going<br>
@@ -863,20 +853,6 @@ bool DSE::handleEndBlock(BasicBlock &BB)<br>
return MadeChange;<br>
}<br>
<br>
-namespace {<br>
- struct CouldAlias {<br>
- typedef Value *argument_type;<br>
- const AliasAnalysis::Location &LoadedLoc;<br>
- AliasAnalysis *AA;<br>
-<br>
- bool operator()(Value *I) {<br>
- // See if the loaded location could alias the stack location.<br>
- AliasAnalysis::Location StackLoc(I, getPointerSize(I, *AA));<br>
- return !AA->isNoAlias(StackLoc, LoadedLoc);<br>
- }<br>
- };<br>
-}<br>
-<br>
/// RemoveAccessedObjects - Check to see if the specified location may alias any<br>
/// of the stack objects in the DeadStackObjects set. If so, they become live<br>
/// because the location is being loaded.<br>
@@ -896,6 +872,10 @@ void DSE::RemoveAccessedObjects(const Al<br>
}<br>
<br>
// Remove objects that could alias LoadedLoc.<br>
- CouldAlias Pred = { LoadedLoc, AA };<br>
+ std::function<bool(Value *)> Pred = [&](Value *I) {<br>
+ // See if the loaded location could alias the stack location.<br>
+ AliasAnalysis::Location StackLoc(I, getPointerSize(I, *AA));<br>
+ return !AA->isNoAlias(StackLoc, LoadedLoc);<br>
+ };<br>
DeadStackObjects.remove_if(Pred);<br>
}<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/GlobalMerge.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GlobalMerge.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GlobalMerge.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/GlobalMerge.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/GlobalMerge.cpp Sat Mar 1 05:47:00 2014<br>
@@ -124,19 +124,6 @@ namespace {<br>
AU.setPreservesCFG();<br>
FunctionPass::getAnalysisUsage(AU);<br>
}<br>
-<br>
- struct GlobalCmp {<br>
- const DataLayout *DL;<br>
-<br>
- GlobalCmp(const DataLayout *DL) : DL(DL) { }<br>
-<br>
- bool operator()(const GlobalVariable *GV1, const GlobalVariable *GV2) {<br>
- Type *Ty1 = cast<PointerType>(GV1->getType())->getElementType();<br>
- Type *Ty2 = cast<PointerType>(GV2->getType())->getElementType();<br>
-<br>
- return (DL->getTypeAllocSize(Ty1) < DL->getTypeAllocSize(Ty2));<br>
- }<br>
- };<br>
};<br>
} // end anonymous namespace<br>
<br>
@@ -156,7 +143,13 @@ bool GlobalMerge::doMerge(SmallVectorImp<br>
unsigned MaxOffset = TLI->getMaximalGlobalOffset();<br>
<br>
// FIXME: Find better heuristics<br>
- std::stable_sort(Globals.begin(), Globals.end(), GlobalCmp(DL));<br>
+ std::stable_sort(Globals.begin(), Globals.end(),<br>
+ [DL](const GlobalVariable *GV1, const GlobalVariable *GV2) {<br>
+ Type *Ty1 = cast<PointerType>(GV1->getType())->getElementType();<br>
+ Type *Ty2 = cast<PointerType>(GV2->getType())->getElementType();<br>
+<br>
+ return (DL->getTypeAllocSize(Ty1) < DL->getTypeAllocSize(Ty2));<br>
+ });<br>
<br>
Type *Int32Ty = Type::getInt32Ty(M.getContext());<br>
<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp Sat Mar 1 05:47:00 2014<br>
@@ -1547,19 +1547,6 @@ Value *Reassociate::OptimizeAdd(Instruct<br>
return 0;<br>
}<br>
<br>
-namespace {<br>
- /// \brief Predicate tests whether a ValueEntry's op is in a map.<br>
- struct IsValueInMap {<br>
- const DenseMap<Value *, unsigned> ⤅<br>
-<br>
- IsValueInMap(const DenseMap<Value *, unsigned> &Map) : Map(Map) {}<br>
-<br>
- bool operator()(const ValueEntry &Entry) {<br>
- return Map.find(Entry.Op) != Map.end();<br>
- }<br>
- };<br>
-}<br>
-<br>
/// \brief Build up a vector of value/power pairs factoring a product.<br>
///<br>
/// Given a series of multiplication operands, build a vector of factors and<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Sat Mar 1 05:47:00 2014<br>
@@ -3255,18 +3255,6 @@ bool SROA::rewritePartition(AllocaInst &<br>
return true;<br>
}<br>
<br>
-namespace {<br>
-struct IsSliceEndLessOrEqualTo {<br>
- uint64_t UpperBound;<br>
-<br>
- IsSliceEndLessOrEqualTo(uint64_t UpperBound) : UpperBound(UpperBound) {}<br>
-<br>
- bool operator()(const AllocaSlices::iterator &I) {<br>
- return I->endOffset() <= UpperBound;<br>
- }<br>
-};<br>
-}<br>
-<br>
static void<br>
removeFinishedSplitUses(SmallVectorImpl<AllocaSlices::iterator> &SplitUses,<br>
uint64_t &MaxSplitUseEndOffset, uint64_t Offset) {<br>
@@ -3278,7 +3266,9 @@ removeFinishedSplitUses(SmallVectorImpl<<br>
<br>
size_t SplitUsesOldSize = SplitUses.size();<br>
SplitUses.erase(std::remove_if(SplitUses.begin(), SplitUses.end(),<br>
- IsSliceEndLessOrEqualTo(Offset)),<br>
+ [Offset](const AllocaSlices::iterator &I) {<br>
+ return I->endOffset() <= Offset;<br>
+ }),<br>
SplitUses.end());<br>
if (SplitUsesOldSize == SplitUses.size())<br>
return;<br>
@@ -3616,20 +3606,6 @@ bool SROA::promoteAllocas(Function &F) {<br>
return true;<br>
}<br>
<br>
-namespace {<br>
- /// \brief A predicate to test whether an alloca belongs to a set.<br>
- class IsAllocaInSet {<br>
- typedef SmallPtrSet<AllocaInst *, 4> SetType;<br>
- const SetType &Set;<br>
-<br>
- public:<br>
- typedef AllocaInst *argument_type;<br>
-<br>
- IsAllocaInSet(const SetType &Set) : Set(Set) {}<br>
- bool operator()(AllocaInst *AI) const { return Set.count(AI); }<br>
- };<br>
-}<br>
-<br>
bool SROA::runOnFunction(Function &F) {<br>
if (skipOptnoneFunction(F))<br>
return false;<br>
@@ -3665,11 +3641,14 @@ bool SROA::runOnFunction(Function &F) {<br>
// Remove the deleted allocas from various lists so that we don't try to<br>
// continue processing them.<br>
if (!DeletedAllocas.empty()) {<br>
- Worklist.remove_if(IsAllocaInSet(DeletedAllocas));<br>
- PostPromotionWorklist.remove_if(IsAllocaInSet(DeletedAllocas));<br>
+ std::function<bool(AllocaInst *)> IsInSet = [&](AllocaInst *AI) {<br>
+ return DeletedAllocas.count(AI);<br>
+ };<br>
+ Worklist.remove_if(IsInSet);<br>
+ PostPromotionWorklist.remove_if(IsInSet);<br>
PromotableAllocas.erase(std::remove_if(PromotableAllocas.begin(),<br>
PromotableAllocas.end(),<br>
- IsAllocaInSet(DeletedAllocas)),<br>
+ IsInSet),<br>
PromotableAllocas.end());<br>
DeletedAllocas.clear();<br>
}<br>
<br>
Modified: llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp Sat Mar 1 05:47:00 2014<br>
@@ -1682,16 +1682,6 @@ Value *BoUpSLP::vectorizeTree() {<br>
return VectorizableTree[0].VectorizedValue;<br>
}<br>
<br>
-class DTCmp {<br>
- const DominatorTree *DT;<br>
-<br>
-public:<br>
- DTCmp(const DominatorTree *DT) : DT(DT) {}<br>
- bool operator()(const BasicBlock *A, const BasicBlock *B) const {<br>
- return DT->properlyDominates(A, B);<br>
- }<br>
-};<br>
-<br>
void BoUpSLP::optimizeGatherSequence() {<br>
DEBUG(dbgs() << "SLP: Optimizing " << GatherSeq.size()<br>
<< " gather sequences instructions.\n");<br>
@@ -1730,7 +1720,10 @@ void BoUpSLP::optimizeGatherSequence() {<br>
// Sort blocks by domination. This ensures we visit a block after all blocks<br>
// dominating it are visited.<br>
SmallVector<BasicBlock *, 8> CSEWorkList(CSEBlocks.begin(), CSEBlocks.end());<br>
- std::stable_sort(CSEWorkList.begin(), CSEWorkList.end(), DTCmp(DT));<br>
+ std::stable_sort(CSEWorkList.begin(), CSEWorkList.end(),<br>
+ [this](const BasicBlock *A, const BasicBlock *B) {<br>
+ return DT->properlyDominates(A, B);<br>
+ });<br>
<br>
// Perform O(N^2) search over the gather sequences and merge identical<br>
// instructions. TODO: We can further optimize this scan if we split the<br>
<br>
Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)<br>
+++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Sat Mar 1 05:47:00 2014<br>
@@ -475,16 +475,6 @@ void addMember(std::vector<NewArchiveIte<br>
Members[Pos] = NI;<br>
}<br>
<br>
-namespace {<br>
-class HasName {<br>
- StringRef Name;<br>
-<br>
-public:<br>
- HasName(StringRef Name) : Name(Name) {}<br>
- bool operator()(StringRef Path) { return Name == sys::path::filename(Path); }<br>
-};<br>
-}<br>
-<br>
enum InsertAction {<br>
IA_AddOldMember,<br>
IA_AddNewMeber,<br>
@@ -500,8 +490,9 @@ computeInsertAction(ArchiveOperation Ope<br>
if (Operation == QuickAppend || Members.empty())<br>
return IA_AddOldMember;<br>
<br>
- std::vector<std::string>::iterator MI =<br>
- std::find_if(Members.begin(), Members.end(), HasName(Name));<br>
+ std::vector<std::string>::iterator MI = std::find_if(<br>
+ Members.begin(), Members.end(),<br>
+ [Name](StringRef Path) { return Name == sys::path::filename(Path); });<br>
<br>
if (MI == Members.end())<br>
return IA_AddOldMember;<br>
<br>
Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Sat Mar 1 05:47:00 2014<br>
@@ -288,15 +288,6 @@ public:<br>
}<br>
};<br>
<br>
-namespace {<br>
-/// Sort ClassInfo pointers independently of pointer value.<br>
-struct LessClassInfoPtr {<br>
- bool operator()(const ClassInfo *LHS, const ClassInfo *RHS) const {<br>
- return *LHS < *RHS;<br>
- }<br>
-};<br>
-}<br>
-<br>
/// MatchableInfo - Helper class for storing the necessary information for an<br>
/// instruction or alias which is capable of being matched.<br>
struct MatchableInfo {<br>
@@ -1288,7 +1279,7 @@ void AsmMatcherInfo::buildOperandMatchIn<br>
<br>
/// Map containing a mask with all operands indices that can be found for<br>
/// that class inside a instruction.<br>
- typedef std::map<ClassInfo*, unsigned, LessClassInfoPtr> OpClassMaskTy;<br>
+ typedef std::map<ClassInfo *, unsigned, less_ptr<ClassInfo>> OpClassMaskTy;<br>
OpClassMaskTy OpClassMask;<br>
<br>
for (std::vector<MatchableInfo*>::const_iterator it =<br>
<br>
Modified: llvm/trunk/utils/TableGen/CodeGenRegisters.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenRegisters.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenRegisters.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/TableGen/CodeGenRegisters.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/CodeGenRegisters.cpp Sat Mar 1 05:47:00 2014<br>
@@ -1705,16 +1705,6 @@ void CodeGenRegBank::computeRegUnitSets(<br>
}<br>
}<br>
<br>
-struct LessUnits {<br>
- const CodeGenRegBank &RegBank;<br>
- LessUnits(const CodeGenRegBank &RB): RegBank(RB) {}<br>
-<br>
- bool operator()(unsigned ID1, unsigned ID2) {<br>
- return RegBank.getRegPressureSet(ID1).Units.size()<br>
- < RegBank.getRegPressureSet(ID2).Units.size();<br>
- }<br>
-};<br>
-<br>
void CodeGenRegBank::computeDerivedInfo() {<br>
computeComposites();<br>
computeSubRegIndexLaneMasks();<br>
@@ -1737,7 +1727,10 @@ void CodeGenRegBank::computeDerivedInfo(<br>
RegUnitSetOrder.push_back(Idx);<br>
<br>
std::stable_sort(RegUnitSetOrder.begin(), RegUnitSetOrder.end(),<br>
- LessUnits(*this));<br>
+ [this](unsigned ID1, unsigned ID2) {<br>
+ return getRegPressureSet(ID1).Units.size() <<br>
+ getRegPressureSet(ID2).Units.size();<br>
+ });<br>
for (unsigned Idx = 0, EndIdx = RegUnitSets.size(); Idx != EndIdx; ++Idx) {<br>
RegUnitSets[RegUnitSetOrder[Idx]].Order = Idx;<br>
}<br>
<br>
Modified: llvm/trunk/utils/TableGen/CodeGenTarget.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenTarget.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenTarget.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/TableGen/CodeGenTarget.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/CodeGenTarget.cpp Sat Mar 1 05:47:00 2014<br>
@@ -289,17 +289,6 @@ GetInstByName(const char *Name,<br>
return I->second;<br>
}<br>
<br>
-namespace {<br>
-/// SortInstByName - Sorting predicate to sort instructions by name.<br>
-///<br>
-struct SortInstByName {<br>
- bool operator()(const CodeGenInstruction *Rec1,<br>
- const CodeGenInstruction *Rec2) const {<br>
- return Rec1->TheDef->getName() < Rec2->TheDef->getName();<br>
- }<br>
-};<br>
-}<br>
-<br>
/// \brief Return all of the instructions defined by the target, ordered by<br>
/// their enum value.<br>
void CodeGenTarget::ComputeInstrsByEnum() const {<br>
@@ -346,8 +335,10 @@ void CodeGenTarget::ComputeInstrsByEnum(<br>
<br>
// All of the instructions are now in random order based on the map iteration.<br>
// Sort them by name.<br>
- std::sort(InstrsByEnum.begin()+EndOfPredefines, InstrsByEnum.end(),<br>
- SortInstByName());<br>
+ std::sort(InstrsByEnum.begin() + EndOfPredefines, InstrsByEnum.end(),<br>
+ [](const CodeGenInstruction *Rec1, const CodeGenInstruction *Rec2) {<br>
+ return Rec1->TheDef->getName() < Rec2->TheDef->getName();<br>
+ });<br>
}<br>
<br>
<br>
<br>
Modified: llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp?rev=202588&r1=202587&r2=202588&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp?rev=202588&r1=202587&r2=202588&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp Sat Mar 1 05:47:00 2014<br>
@@ -131,20 +131,6 @@ void IntrinsicEmitter::EmitEnumInfo(cons<br>
OS << "#endif\n\n";<br>
}<br>
<br>
-struct IntrinsicNameSorter {<br>
- IntrinsicNameSorter(const std::vector<CodeGenIntrinsic> &I)<br>
- : Ints(I) {}<br>
-<br>
- // Sort in reverse order of intrinsic name so "abc.def" appears after<br>
- // "abd.def.ghi" in the overridden name matcher<br>
- bool operator()(unsigned i, unsigned j) {<br>
- return Ints[i].Name > Ints[j].Name;<br>
- }<br>
-<br>
-private:<br>
- const std::vector<CodeGenIntrinsic> &Ints;<br>
-};<br>
-<br>
void IntrinsicEmitter::<br>
EmitFnNameRecognizer(const std::vector<CodeGenIntrinsic> &Ints,<br>
raw_ostream &OS) {<br>
@@ -158,15 +144,17 @@ EmitFnNameRecognizer(const std::vector<C<br>
OS << " StringRef NameR(Name+6, Len-6); // Skip over 'llvm.'\n";<br>
OS << " switch (Name[5]) { // Dispatch on first letter.\n";<br>
OS << " default: break;\n";<br>
- IntrinsicNameSorter Sorter(Ints);<br>
// Emit the intrinsic matching stuff by first letter.<br>
for (std::map<char, std::vector<unsigned> >::iterator I = IntMapping.begin(),<br>
E = IntMapping.end(); I != E; ++I) {<br>
OS << " case '" << I->first << "':\n";<br>
std::vector<unsigned> &IntList = I->second;<br>
<br>
- // Sort intrinsics in reverse order of their names<br>
- std::sort(IntList.begin(), IntList.end(), Sorter);<br>
+ // Sort in reverse order of intrinsic name so "abc.def" appears after<br>
+ // "abd.def.ghi" in the overridden name matcher<br>
+ std::sort(IntList.begin(), IntList.end(), [&](unsigned i, unsigned j) {<br>
+ return Ints[i].Name > Ints[j].Name;<br>
+ });<br>
<br>
// Emit all the overloaded intrinsics first, build a table of the<br>
// non-overloaded ones.<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>