From b1a82589339fed148c12b052d30861a539552f1a Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Mon, 11 Feb 2013 17:19:34 +0000 Subject: [PATCH] BBVectorize: Eliminate one more restricted linear search This eliminates one more linear search over a range of std::multimap entries. This gives a 22% speedup on the csa.ll test case from PR15222. No functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174893 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/BBVectorize.cpp | 58 +++++++++++++----------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/lib/Transforms/Vectorize/BBVectorize.cpp b/lib/Transforms/Vectorize/BBVectorize.cpp index 9da4c372aee..bf8fca06ff5 100644 --- a/lib/Transforms/Vectorize/BBVectorize.cpp +++ b/lib/Transforms/Vectorize/BBVectorize.cpp @@ -240,6 +240,7 @@ namespace { }; void computeConnectedPairs(std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, std::vector &PairableInsts, std::multimap &ConnectedPairs, DenseMap &PairConnectionTypes); @@ -250,6 +251,7 @@ namespace { DenseSet &PairableInstUsers); void choosePairs(std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, DenseMap &CandidatePairCostSavings, std::vector &PairableInsts, DenseSet &FixedOrderPairs, @@ -310,6 +312,7 @@ namespace { void buildInitialTreeFor( std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, std::vector &PairableInsts, std::multimap &ConnectedPairs, DenseSet &PairableInstUsers, @@ -318,6 +321,7 @@ namespace { void findBestTreeFor( std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, DenseMap &CandidatePairCostSavings, std::vector &PairableInsts, DenseSet &FixedOrderPairs, @@ -704,6 +708,12 @@ namespace { PairableInsts, NonPow2Len); if (PairableInsts.empty()) continue; + // Build the candidate pair set for faster lookups. + DenseSet CandidatePairsSet; + for (std::multimap::iterator I = CandidatePairs.begin(), + E = CandidatePairs.end(); I != E; ++I) + CandidatePairsSet.insert(*I); + // Now we have a map of all of the pairable instructions and we need to // select the best possible pairing. A good pairing is one such that the // users of the pair are also paired. This defines a (directed) forest @@ -715,8 +725,8 @@ namespace { std::multimap ConnectedPairs, ConnectedPairDeps; DenseMap PairConnectionTypes; - computeConnectedPairs(CandidatePairs, PairableInsts, ConnectedPairs, - PairConnectionTypes); + computeConnectedPairs(CandidatePairs, CandidatePairsSet, + PairableInsts, ConnectedPairs, PairConnectionTypes); if (ConnectedPairs.empty()) continue; for (std::multimap::iterator @@ -736,7 +746,8 @@ namespace { // variables. DenseMap ChosenPairs; - choosePairs(CandidatePairs, CandidatePairCostSavings, + choosePairs(CandidatePairs, CandidatePairsSet, + CandidatePairCostSavings, PairableInsts, FixedOrderPairs, PairConnectionTypes, ConnectedPairs, ConnectedPairDeps, PairableInstUsers, ChosenPairs); @@ -1332,22 +1343,19 @@ namespace { // of the second pair. void BBVectorize::computeConnectedPairs( std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, std::vector &PairableInsts, std::multimap &ConnectedPairs, DenseMap &PairConnectionTypes) { - DenseSet CandidatePairsSet; - for (std::multimap::iterator I = CandidatePairs.begin(), - E = CandidatePairs.end(); I != E; ++I) - CandidatePairsSet.insert(*I); - for (std::vector::iterator PI = PairableInsts.begin(), PE = PairableInsts.end(); PI != PE; ++PI) { VPIteratorPair choiceRange = CandidatePairs.equal_range(*PI); for (std::multimap::iterator P = choiceRange.first; P != choiceRange.second; ++P) - computePairsConnectedTo(CandidatePairs, CandidatePairsSet, PairableInsts, - ConnectedPairs, PairConnectionTypes, *P); + computePairsConnectedTo(CandidatePairs, CandidatePairsSet, + PairableInsts, ConnectedPairs, + PairConnectionTypes, *P); } DEBUG(dbgs() << "BBV: found " << ConnectedPairs.size() @@ -1464,6 +1472,7 @@ namespace { // pair J at the root. void BBVectorize::buildInitialTreeFor( std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, std::vector &PairableInsts, std::multimap &ConnectedPairs, DenseSet &PairableInstUsers, @@ -1485,18 +1494,7 @@ namespace { for (std::multimap::iterator k = qtRange.first; k != qtRange.second; ++k) { // Make sure that this child pair is still a candidate: - bool IsStillCand = false; - VPIteratorPair checkRange = - CandidatePairs.equal_range(k->second.first); - for (std::multimap::iterator m = checkRange.first; - m != checkRange.second; ++m) { - if (m->second == k->second.second) { - IsStillCand = true; - break; - } - } - - if (IsStillCand) { + if (CandidatePairsSet.count(ValuePair(k->second))) { DenseMap::iterator C = Tree.find(k->second); if (C == Tree.end()) { size_t d = getDepthFactor(k->second.first); @@ -1686,6 +1684,7 @@ namespace { // pairs, given the choice of root pairs as an iterator range. void BBVectorize::findBestTreeFor( std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, DenseMap &CandidatePairCostSavings, std::vector &PairableInsts, DenseSet &FixedOrderPairs, @@ -1725,7 +1724,8 @@ namespace { continue; DenseMap Tree; - buildInitialTreeFor(CandidatePairs, PairableInsts, ConnectedPairs, + buildInitialTreeFor(CandidatePairs, CandidatePairsSet, + PairableInsts, ConnectedPairs, PairableInstUsers, ChosenPairs, Tree, *J); // Because we'll keep the child with the largest depth, the largest @@ -1745,7 +1745,8 @@ namespace { DenseSet PrunedTree; pruneTreeFor(CandidatePairs, PairableInsts, ConnectedPairs, - PairableInstUsers, PairableInstUserMap, PairableInstUserPairSet, + PairableInstUsers, PairableInstUserMap, + PairableInstUserPairSet, ChosenPairs, Tree, PrunedTree, *J, UseCycleCheck); int EffSize = 0; @@ -2061,6 +2062,7 @@ namespace { // that will be fused into vector instructions. void BBVectorize::choosePairs( std::multimap &CandidatePairs, + DenseSet &CandidatePairsSet, DenseMap &CandidatePairCostSavings, std::vector &PairableInsts, DenseSet &FixedOrderPairs, @@ -2085,7 +2087,8 @@ namespace { size_t BestMaxDepth = 0; int BestEffSize = 0; DenseSet BestTree; - findBestTreeFor(CandidatePairs, CandidatePairCostSavings, + findBestTreeFor(CandidatePairs, CandidatePairsSet, + CandidatePairCostSavings, PairableInsts, FixedOrderPairs, PairConnectionTypes, ConnectedPairs, ConnectedPairDeps, PairableInstUsers, PairableInstUserMap, @@ -2115,9 +2118,10 @@ namespace { K->second == S->second || K->first == S->second) { // Don't remove the actual pair chosen so that it can be used // in subsequent tree selections. - if (!(K->first == S->first && K->second == S->second)) + if (!(K->first == S->first && K->second == S->second)) { + CandidatePairsSet.erase(*K); CandidatePairs.erase(K++); - else + } else ++K; } else { ++K;