2024-01-09 17:28:28 +03:00
|
|
|
#pragma once
|
|
|
|
|
#include<vector>
|
|
|
|
|
#include<set>
|
|
|
|
|
|
2025-06-04 13:08:38 +03:00
|
|
|
#include "SgUtils.h"
|
2024-01-09 17:28:28 +03:00
|
|
|
#include "../CFGraph.h"
|
|
|
|
|
#include "../IR.h"
|
|
|
|
|
|
2024-05-22 20:28:13 +03:00
|
|
|
enum class DATA_FLOW_UPD_STATUS { NO_CHANGE = 0, PROPAGATED, GENERATED };
|
2024-05-22 10:33:58 +03:00
|
|
|
|
2024-01-09 17:28:28 +03:00
|
|
|
template <class DataType>
|
|
|
|
|
class DataFlowAnalysisNode {
|
2024-01-10 23:53:12 +03:00
|
|
|
static const int CNT_NOTINIT = 0;
|
|
|
|
|
|
2024-01-09 17:28:28 +03:00
|
|
|
int in_cnt = CNT_NOTINIT, out_cnt = CNT_NOTINIT;
|
|
|
|
|
|
|
|
|
|
std::set<int> rollback;
|
|
|
|
|
|
|
|
|
|
std::set<DataFlowAnalysisNode<DataType>*> prev_blocks;
|
|
|
|
|
|
|
|
|
|
SAPFOR::BasicBlock* bb;
|
|
|
|
|
public:
|
|
|
|
|
DataFlowAnalysisNode();
|
|
|
|
|
|
|
|
|
|
void doStep();
|
|
|
|
|
|
|
|
|
|
virtual DataType getIn() = 0;
|
|
|
|
|
virtual DataType getOut() = 0;
|
|
|
|
|
|
|
|
|
|
virtual bool addIn(const DataType& data) = 0;
|
|
|
|
|
virtual bool addOut(const DataType& data) = 0;
|
|
|
|
|
|
2024-04-03 21:13:56 +03:00
|
|
|
virtual bool updateState() { return false; }
|
2024-05-22 10:33:58 +03:00
|
|
|
virtual DATA_FLOW_UPD_STATUS forwardData(const DataType& data) = 0;
|
2024-01-09 17:28:28 +03:00
|
|
|
|
|
|
|
|
bool newerThan(const DataFlowAnalysisNode<DataType>* block) const { return out_cnt > block->in_cnt; }
|
|
|
|
|
|
|
|
|
|
int getInCnt() { return in_cnt; }
|
|
|
|
|
int getOutCnt() { return out_cnt; }
|
|
|
|
|
|
|
|
|
|
void setInCnt(int cnt) { in_cnt = cnt; }
|
|
|
|
|
void setOutCnt(int cnt) { out_cnt = cnt; }
|
2024-01-10 23:53:12 +03:00
|
|
|
static int getStartCounter() { return CNT_NOTINIT; }
|
2024-01-09 17:28:28 +03:00
|
|
|
|
|
|
|
|
std::set<int>& getRollback() { return rollback; }
|
|
|
|
|
|
|
|
|
|
std::set<DataFlowAnalysisNode<DataType>*>& getPrevBlocks() { return prev_blocks; }
|
|
|
|
|
|
|
|
|
|
SAPFOR::BasicBlock* getBlock() { return bb; }
|
|
|
|
|
void setBlock(SAPFOR::BasicBlock* b) { bb = b; }
|
|
|
|
|
};
|
|
|
|
|
|
2024-01-12 16:57:02 +03:00
|
|
|
template <class NodeType>
|
2024-01-09 17:28:28 +03:00
|
|
|
class DataFlowAnalysis {
|
|
|
|
|
protected:
|
|
|
|
|
std::vector<NodeType*> nodes;
|
|
|
|
|
|
|
|
|
|
virtual NodeType* createNode(SAPFOR::BasicBlock* block) = 0;
|
|
|
|
|
public:
|
|
|
|
|
virtual void fit(const std::vector<SAPFOR::BasicBlock*>& blocks) = 0;
|
|
|
|
|
void analyze();
|
|
|
|
|
|
|
|
|
|
const std::vector<NodeType*>& getNodes() { return nodes; }
|
|
|
|
|
|
|
|
|
|
~DataFlowAnalysis();
|
|
|
|
|
};
|
|
|
|
|
|
2024-01-10 23:53:12 +03:00
|
|
|
#include "data_flow_impl.h"
|