36 lines
868 B
C
36 lines
868 B
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <vector>
|
|||
|
|
#include <map>
|
|||
|
|
#include <unordered_map>
|
|||
|
|
|
|||
|
|
#include "CFGraph.h"
|
|||
|
|
|
|||
|
|
// Lengauer, Thomas. A fast algorithm for finding dominators in a flowgraph / Thomas Lengauer, Robert Endre Tarjan
|
|||
|
|
// ACM Transactions on Programming Languages and Systems (TOPLAS). <20> 1979. <20> Vol. 1, no. 1. <20> Pp. 121<32>141.
|
|||
|
|
|
|||
|
|
namespace SAPFOR {
|
|||
|
|
|
|||
|
|
class BasicBlock;
|
|||
|
|
|
|||
|
|
class DominatorFinder {
|
|||
|
|
private:
|
|||
|
|
BasicBlock* entry;
|
|||
|
|
std::vector<BasicBlock*> vertices;
|
|||
|
|
std::unordered_map<BasicBlock*, int> dfs_num;
|
|||
|
|
std::vector<int> parent, semi, vertex, ancestor, label;
|
|||
|
|
std::vector<std::vector<int>> bucket;
|
|||
|
|
int n;
|
|||
|
|
|
|||
|
|
void DFS(BasicBlock* v, int parent_num);
|
|||
|
|
void Compress(int v);
|
|||
|
|
int Eval(int v);
|
|||
|
|
void Link(int v, int w);
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
DominatorFinder(std::vector<BasicBlock*>& blocks);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
void buildDominatorTree(std::vector<BasicBlock*>& blocks);
|
|||
|
|
}
|