Skip to content

Commit 81195c4

Browse files
committed
Merge branch 'ddg_observ'
1 parent 5927be1 commit 81195c4

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

include/tsar/Analysis/PDG.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
#include <map>
1818
#include <string>
1919

20+
#include <llvm/Analysis/DDG.h>
21+
#include <llvm/Analysis/DDGPrinter.h>
22+
2023
namespace tsar {
2124

2225
template<typename CFGType, typename CFGNodeType>
@@ -137,6 +140,13 @@ class ControlDependenceGraph : public CDGBase<CFGType, CFGNodeType> {
137140
CFGType *mCFG;
138141
};
139142

143+
using SourceCDG=ControlDependenceGraph<SourceCFG, SourceCFGNode>;
144+
using IRCDGNode=CDGNode<llvm::Function, llvm::BasicBlock>;
145+
using DefaultIRCDGNode=DefaultCDGNode<llvm::Function, llvm::BasicBlock>;
146+
using EntryIRCDGNode=EntryCDGNode<llvm::Function, llvm::BasicBlock>;
147+
using IRCDGEdge=CDGEdge<llvm::Function, llvm::BasicBlock>;
148+
using IRCDG=ControlDependenceGraph<llvm::Function, llvm::BasicBlock>;
149+
140150
}//namespace tsar
141151

142152
namespace llvm {
@@ -281,4 +291,88 @@ using IRCDGPass=CDGPass<tsar::ControlDependenceGraph<Function, BasicBlock>>;
281291

282292
};//namespace llvm
283293

294+
namespace tsar {
295+
class ControlPDGEdge : public llvm::DDGEdge {
296+
public:
297+
ControlPDGEdge(llvm::DDGNode &TargetNode) : llvm::DDGEdge(TargetNode, EdgeKind::Unknown) {}
298+
};
299+
300+
class ProgramDependencyGraph : public llvm::DataDependenceGraph {
301+
private:
302+
using Base=llvm::DataDependenceGraph;
303+
void construct(llvm::Function &F) {
304+
//
305+
for (auto INode : *this)
306+
for (auto Edge : INode->getEdges())
307+
assert(Edge->getKind()!=llvm::DDGEdge::EdgeKind::Unknown);
308+
//
309+
IRCDG *CDG=CDGBuilder<IRCDG>().populate(F);
310+
std::map<llvm::Instruction*, llvm::DDGNode*> InstrMap;
311+
for (auto INode : *this)
312+
if (llvm::isa<llvm::SimpleDDGNode>(INode))
313+
for (auto I : llvm::dyn_cast<llvm::SimpleDDGNode>(INode)->getInstructions())
314+
InstrMap[I]=INode;
315+
for (auto It : InstrMap)
316+
if (It.first->isTerminator()) {
317+
IRCDGNode *CDGNode=CDG->getNode(It.first->getParent());
318+
for (auto CDGEdge : *CDGNode) {
319+
//llvm::BasicBlock *TargetBB=(llvm::dyn_cast<DefaultIRCDGNode>(CDGEdge->getTargetNode())).getBlock();
320+
llvm::BasicBlock *TargetBB=((DefaultIRCDGNode*)(&CDGEdge->getTargetNode()))->getBlock();
321+
for (auto IIt=TargetBB->begin(); IIt!=TargetBB->end(); ++IIt)
322+
connect(*InstrMap[It.first], *InstrMap[&(*IIt)], *(new ControlPDGEdge(*InstrMap[&(*IIt)])));
323+
}
324+
}
325+
for (auto RootEdge : getRoot().getEdges())
326+
delete RootEdge;
327+
getRoot().clear();
328+
for (auto CDGEdge : *(CDG->getEntryNode()))
329+
//for (auto IIt=llvm::dyn_cast<DefaultIRCDGNode>(CDGEdge->getTargetNode()).getBlock()->begin();
330+
for (auto IIt=((DefaultIRCDGNode*)(&CDGEdge->getTargetNode()))->getBlock()->begin();
331+
//IIt!=llvm::dyn_cast<DefaultIRCDGNode>(&CDGEdge->getTargetNode())->getBlock()->end(); ++IIt)
332+
IIt!=((DefaultIRCDGNode*)(&CDGEdge->getTargetNode()))->getBlock()->end(); ++IIt)
333+
connect(getRoot(), *InstrMap[&(*IIt)], *(new ControlPDGEdge(*InstrMap[&(*IIt)])));
334+
delete CDG;
335+
}
336+
public:
337+
ProgramDependencyGraph(llvm::Function &F, llvm::DependenceInfo &DI)
338+
: Base(F, DI) {
339+
construct(F);
340+
}
341+
};
342+
}
343+
344+
namespace llvm {
345+
template <>
346+
struct GraphTraits<tsar::ProgramDependencyGraph *> : public GraphTraits<DataDependenceGraph*> {};
347+
348+
template <>
349+
struct GraphTraits<const tsar::ProgramDependencyGraph *> : public GraphTraits<const DataDependenceGraph*> {};
350+
351+
template <>
352+
struct DOTGraphTraits<const tsar::ProgramDependencyGraph *> : public DOTGraphTraits<const DataDependenceGraph*> {
353+
private:
354+
using GT=GraphTraits<const tsar::ProgramDependencyGraph *>;
355+
using BaseDOTGT=DOTGraphTraits<const DataDependenceGraph*>;
356+
public:
357+
DOTGraphTraits(bool isSimple=false) : BaseDOTGT(isSimple) {}
358+
359+
std::string getNodeLabel(const DDGNode *Node, const tsar::ProgramDependencyGraph *PDG) {
360+
return BaseDOTGT::getNodeLabel(Node, PDG);
361+
}
362+
363+
std::string getEdgeAttributes(const DDGNode *Node, typename GT::ChildIteratorType ChildNodeIt, const tsar::ProgramDependencyGraph *PDG) {
364+
assert((*ChildNodeIt.getCurrent())->getKind()!=DDGEdge::EdgeKind::Rooted);
365+
switch ((*ChildNodeIt.getCurrent())->getKind()) {
366+
case DDGEdge::EdgeKind::Unknown:
367+
return "style=\"dashed\"";
368+
case DDGEdge::EdgeKind::RegisterDefUse:
369+
return "style=\"solid\" color=\"blue\" "+BaseDOTGT::getEdgeAttributes(Node, ChildNodeIt, PDG);
370+
case DDGEdge::EdgeKind::MemoryDependence:
371+
return "style=\"solid\" color=\"green\" "+BaseDOTGT::getEdgeAttributes(Node, ChildNodeIt, PDG);
372+
}
373+
}
374+
};
375+
376+
};
377+
284378
#endif//TSAR_INCLUDE_BUILDPDG_H

lib/Analysis/PDG.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
#include <set>
1111
#include <string>
1212

13+
//
14+
#include "tsar/Analysis/Memory/DependenceAnalysis.h"
15+
#include <llvm/InitializePasses.h>
16+
//
17+
#include <llvm/Support/CommandLine.h>
18+
1319
using namespace tsar;
1420
using namespace llvm;
1521
using namespace clang;
@@ -183,20 +189,40 @@ template<> char IRCDGPass::ID=0;
183189

184190
INITIALIZE_PASS_BEGIN(IRCDGPass, "llvm-ir-cdg",
185191
"Control Dependence Graph from IR", false, true)
192+
INITIALIZE_PASS_DEPENDENCY(DependenceAnalysisWrapperPass)
186193
INITIALIZE_PASS_END(IRCDGPass, "llvm-ir-cdg",
187194
"Control Dependence Graph from IR", false, true)
188195

189196
FunctionPass *createIRCDGPass() { return new IRCDGPass; }
190197

191198
template<>
192199
void IRCDGPass::getAnalysisUsage(AnalysisUsage &AU) const {
200+
AU.addRequired<DependenceAnalysisWrapperPass>();
193201
AU.setPreservesAll();
194202
}
195203

196204
template<>
197205
bool IRCDGPass::runOnFunction(Function &F) {
198206
releaseMemory();
199207
mCDG=mCDGBuilder.populate(F);
208+
{
209+
auto &DIPass=getAnalysis<DependenceAnalysisWrapperPass>();
210+
/*May be useful*/
211+
StringMap<cl::Option*> &OpMap=cl::getRegisteredOptions();
212+
bool OldDDGSimplifyOpt=((cl::opt<bool>*)OpMap["ddg-simplify"])->getValue(),
213+
OldDDGPiBlocksOpt=((cl::opt<bool>*)OpMap["ddg-pi-blocks"])->getValue();
214+
((cl::opt<bool>*)OpMap["ddg-simplify"])->setValue(false);
215+
((cl::opt<bool>*)OpMap["ddg-pi-blocks"])->setValue(false);
216+
ProgramDependencyGraph PDG(F, DIPass.getDI());
217+
dumpDotGraphToFile((const ProgramDependencyGraph*)&PDG, "pdg.dot", "program dependency graph");
218+
DataDependenceGraph DDG(F, DIPass.getDI());
219+
dumpDotGraphToFile((const DataDependenceGraph*)&DDG, "data-dependence-graph.dot", "data dependence graph", false);
220+
((cl::opt<bool>*)OpMap["ddg-simplify"])->setValue(OldDDGSimplifyOpt);
221+
((cl::opt<bool>*)OpMap["ddg-pi-blocks"])->setValue(OldDDGPiBlocksOpt);
222+
DOTFuncInfo DOTCFGInfo(&F);
223+
dumpDotGraphToFile(&DOTCFGInfo, "ircfg.dot", "control flow graph");
224+
}
225+
/**/
200226
return false;
201227
}
202228

0 commit comments

Comments
 (0)