[llvm] r276429 - [RDF] Make the graph construction/use less expensive
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 22 09:09:47 PDT 2016
Author: kparzysz
Date: Fri Jul 22 11:09:47 2016
New Revision: 276429
URL: http://llvm.org/viewvc/llvm-project?rev=276429&view=rev
Log:
[RDF] Make the graph construction/use less expensive
- FuncNode::findBlock traverses the function every time. Avoid using it,
and keep a cache of block addresses in DataFlowGraph instead.
- The operator[] in the map of definition stacks was very slow. Replace
the map with unordered_map.
Modified:
llvm/trunk/lib/Target/Hexagon/RDFGraph.cpp
llvm/trunk/lib/Target/Hexagon/RDFGraph.h
Modified: llvm/trunk/lib/Target/Hexagon/RDFGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/RDFGraph.cpp?rev=276429&r1=276428&r2=276429&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/RDFGraph.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/RDFGraph.cpp Fri Jul 22 11:09:47 2016
@@ -936,6 +936,7 @@ void DataFlowGraph::build(unsigned Optio
for (auto &B : MF) {
auto BA = newBlock(Func, &B);
+ BlockNodes.insert(std::make_pair(&B, BA));
for (auto &I : B) {
if (I.isDebugValue())
continue;
@@ -1069,6 +1070,7 @@ NodeList DataFlowGraph::getRelatedRefs(N
// Clear all information in the graph.
void DataFlowGraph::reset() {
Memory.clear();
+ BlockNodes.clear();
Func = NodeAddr<FuncNode*>();
}
@@ -1277,7 +1279,7 @@ void DataFlowGraph::buildBlockRefs(NodeA
assert(N);
for (auto I : *N) {
MachineBasicBlock *SB = I->getBlock();
- auto SBA = Func.Addr->findBlock(SB, *this);
+ auto SBA = findBlock(SB);
buildBlockRefs(SBA, RefM);
const auto &SRs = RefM[SBA.Id];
Refs.insert(SRs.begin(), SRs.end());
@@ -1329,13 +1331,13 @@ void DataFlowGraph::recordDefsForDF(Bloc
// Get the register references that are reachable from this block.
RegisterSet &Refs = RefM[BA.Id];
for (auto DB : IDF) {
- auto DBA = Func.Addr->findBlock(DB, *this);
+ auto DBA = findBlock(DB);
const auto &Rs = RefM[DBA.Id];
Refs.insert(Rs.begin(), Rs.end());
}
for (auto DB : IDF) {
- auto DBA = Func.Addr->findBlock(DB, *this);
+ auto DBA = findBlock(DB);
PhiM[DBA.Id].insert(Defs.begin(), Defs.end());
}
}
@@ -1392,7 +1394,7 @@ void DataFlowGraph::buildPhis(BlockRefsM
std::vector<NodeId> PredList;
const MachineBasicBlock *MBB = BA.Addr->getCode();
for (auto PB : MBB->predecessors()) {
- auto B = Func.Addr->findBlock(PB, *this);
+ auto B = findBlock(PB);
PredList.push_back(B.Id);
}
@@ -1584,7 +1586,7 @@ void DataFlowGraph::linkBlockRefs(DefSta
MachineDomTreeNode *N = MDT.getNode(BA.Addr->getCode());
for (auto I : *N) {
MachineBasicBlock *SB = I->getBlock();
- auto SBA = Func.Addr->findBlock(SB, *this);
+ auto SBA = findBlock(SB);
linkBlockRefs(DefM, SBA);
}
@@ -1598,7 +1600,7 @@ void DataFlowGraph::linkBlockRefs(DefSta
};
MachineBasicBlock *MBB = BA.Addr->getCode();
for (auto SB : MBB->successors()) {
- auto SBA = Func.Addr->findBlock(SB, *this);
+ auto SBA = findBlock(SB);
for (NodeAddr<InstrNode*> IA : SBA.Addr->members_if(IsPhi, *this)) {
// Go over each phi use associated with MBB, and link it.
for (auto U : IA.Addr->members_if(IsUseForBA, *this)) {
Modified: llvm/trunk/lib/Target/Hexagon/RDFGraph.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/RDFGraph.h?rev=276429&r1=276428&r2=276429&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/RDFGraph.h (original)
+++ llvm/trunk/lib/Target/Hexagon/RDFGraph.h Fri Jul 22 11:09:47 2016
@@ -210,6 +210,7 @@
#include <functional>
#include <map>
#include <set>
+#include <unordered_map>
#include <vector>
namespace llvm {
@@ -679,7 +680,14 @@ namespace rdf {
StorageType Stack;
};
- typedef std::map<RegisterRef,DefStack> DefStackMap;
+ struct RegisterRefHasher {
+ unsigned operator() (RegisterRef RR) const {
+ return RR.Reg | (RR.Sub << 24);
+ }
+ };
+ // Make this std::unordered_map for speed of accessing elements.
+ typedef std::unordered_map<RegisterRef,DefStack,RegisterRefHasher>
+ DefStackMap;
void build(unsigned Options = BuildOptions::None);
void pushDefs(NodeAddr<InstrNode*> IA, DefStackMap &DM);
@@ -783,9 +791,15 @@ namespace rdf {
IA.Addr->removeMember(RA, *this);
}
+ NodeAddr<BlockNode*> findBlock(MachineBasicBlock *BB) {
+ return BlockNodes[BB];
+ }
+
TimerGroup TimeG;
NodeAddr<FuncNode*> Func;
NodeAllocator Memory;
+ // Local map: MachineBasicBlock -> NodeAddr<BlockNode*>
+ std::map<MachineBasicBlock*,NodeAddr<BlockNode*>> BlockNodes;
MachineFunction &MF;
const TargetInstrInfo &TII;
More information about the llvm-commits
mailing list