1 #ifndef PARTITIONED_ANALYSIS_H
2 #define PARTITIONED_ANALYSIS_H
6 #include "genericDataflowCommon.h"
9 #include "analysisCommon.h"
10 #include "functionState.h"
11 #include "latticeFull.h"
14 #include "VirtualCFGIterator.h"
15 #include "LogicalCond.h"
16 #include "printAnalysisStates.h"
42 std::set<IntraPartitionDataflow*> splitSet;
47 this->master = master;
48 splitSet.insert(master);
53 splitSet.insert(child);
56 std::string str(std::string indent=
"")
58 std::ostringstream oss;
60 oss << indent <<
"[partSplit:\n";
61 oss << indent <<
" splitSet = <";
62 for(std::set<IntraPartitionDataflow*>::iterator it=splitSet.begin(); it!=splitSet.end(); )
66 if(it!=splitSet.end()) oss <<
", ";
69 oss << indent <<
" master = "<< master <<
"]\n";
78 std::set<IntraPartitionDataflow*> activeParts;
84 std::set<IntraPartitionDataflow*> joinParts;
91 std::map<IntraPartitionDataflow*, std::list<partSplit*> > parts2splits;
95 std::map<IntraPartitionDataflow*, IntraPartitionDataflowCheckpoint*> parts2chkpts;
123 std::set<IntraPartitionDataflow*> split(
IntraPartitionDataflow* origA, std::vector<IntraPartitionDataflowCheckpoint*> partitionChkpts,
143 const std::map<IntraPartitionDataflow*, IntraPartitionDataflowCheckpoint*>& parts2chkpts)=0;
162 this->srcAnalysis = srcAnalysis;
163 this->tgtAnalysis = tgtAnalysis;
168 state.cloneAnalysisState(srcAnalysis, tgtAnalysis);
177 std::set<Analysis*> unionSet;
182 std::set<Analysis*>& unionSet,
Analysis* master)
184 for(std::set<Analysis*>::iterator it = unionSet.begin(); it!=unionSet.end(); it++)
185 { this->unionSet.insert(*it); }
187 this->master = master;
196 std::set<IntraPartitionDataflow*> tgtA;
206 for(std::set<IntraPartitionDataflow*>::iterator it = tgtA.begin(); it!=tgtA.end(); it++)
223 parent = that.parent;
224 partitionCond = that.partitionCond;
229 this->parent = parent;
230 partitionCond = NULL;
235 delete partitionCond;
262 virtual bool runAnalysis(
const Function& func,
NodeState* fState,
bool& splitPart,
277 const std::vector<Lattice*>& dfInfo,
const std::vector<NodeFact*>& facts,
287 std::set<DataflowNode> joinNodes;
301 dfChkpt(that.dfChkpt), func(that.func)
303 this->joinNodes = that.joinNodes;
307 this->curNode = NULL;
309 this->partitionCond = that.partitionCond;
310 this->partitionIndex = that.partitionIndex;
311 this->fState = that.fState;
316 printable* partitionCond,
int partitionIndex,
318 dfChkpt(dfChkpt), func(func)
320 this->joinNodes = joinNodes;
324 this->curNode = NULL;
326 this->partitionCond = partitionCond;
327 this->partitionIndex = partitionIndex;
328 this->fState = fState;
338 std::string str(std::string indent=
"")
340 std::ostringstream outs;
341 outs << indent <<
"[IntraPartitionDataflowCheckpoint : \n";
342 outs << indent <<
" dfChkpt = \n"<<dfChkpt.str(indent+
" ")<<
"\n";
344 outs << indent <<
" curNode = <"<<curNode->getNode()->
class_name()<<
" | "<<curNode->getNode()->
unparseToString()<<
" | "<< curNode->getIndex() <<
">\n";
346 outs << indent <<
" curNode = NULL\n";
348 if(joinNodes.size()==0)
349 outs << indent <<
" joinNodes = None\n";
352 outs << indent <<
" joinNodes = \n";
353 for(std::set<DataflowNode>::iterator it=joinNodes.begin(); it!=joinNodes.end(); it++)
354 { outs << indent <<
" <"<<(*it).getNode()->class_name()<<
" | "<<(*it).getNode()->unparseToString()<<
">\n"; }
357 outs << indent <<
" partitionCond = \n"<<partitionCond->str(indent+
" ")<<
"\n";
359 if(partitionIndex>=0)
360 outs << indent <<
" partitionIndex = descendant "<<partitionIndex<<
"]";
362 outs << indent <<
" partitionIndex = all descendants ("<<partitionIndex<<
")]";
400 typedef enum {noSplit, splitNew, splitParent} splitType;
410 splitType& splitAnalysis, std::vector</*LogicalCond*/printable*>& splitConditions,
bool& joinNode)=0;
415 bool runAnalysis(
const Function& func,
NodeState* fState,
bool analyzeDueToCallers, std::set<Function> calleesUpdated);
428 typedef enum {retFalse, cont, normal} partitionTranferRet;
430 partitionTranferRet partitionTranfer(
432 const std::vector<Lattice*>& dfInfoBelow,
bool& splitPart, std::set<DataflowNode>& joinNodes,
437 bool propagateFWStateToNextNode(
438 const std::vector<Lattice*>& curNodeState,
DataflowNode curDFNode,
int nodeIndex,
439 const std::vector<Lattice*>& nextNodeState,
DataflowNode nextDFNode);
virtual std::string unparseToString(SgUnparse_Info *info) const
This function unparses the AST node (excluding comments and unnecessary white space) ...
virtual std::string class_name() const
returns a string representing the class name