mirror of https://github.com/exaloop/codon.git
66 lines
1.6 KiB
C++
66 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <set>
|
|
#include <unordered_map>
|
|
#include <utility>
|
|
|
|
#include "sir/analyze/analysis.h"
|
|
#include "sir/analyze/dataflow/cfg.h"
|
|
|
|
namespace codon {
|
|
namespace ir {
|
|
namespace analyze {
|
|
namespace dataflow {
|
|
|
|
/// Helper to query the dominators of a particular function.
|
|
class DominatorInspector {
|
|
private:
|
|
std::unordered_map<id_t, std::set<id_t>> sets;
|
|
CFGraph *cfg;
|
|
|
|
public:
|
|
explicit DominatorInspector(CFGraph *cfg) : cfg(cfg) {}
|
|
|
|
/// Do the analysis.
|
|
void analyze();
|
|
|
|
/// Checks if one value dominates another.
|
|
/// @param v the value
|
|
/// @param dominator the dominator value
|
|
bool isDominated(const Value *v, const Value *dominator);
|
|
};
|
|
|
|
/// Result of a dominator analysis.
|
|
struct DominatorResult : public Result {
|
|
/// the corresponding control flow result
|
|
const CFResult *cfgResult;
|
|
/// the dominator inspectors
|
|
std::unordered_map<id_t, std::unique_ptr<DominatorInspector>> results;
|
|
|
|
explicit DominatorResult(const CFResult *cfgResult) : cfgResult(cfgResult) {}
|
|
};
|
|
|
|
/// Dominator analysis. Must have control flow-graph available.
|
|
class DominatorAnalysis : public Analysis {
|
|
private:
|
|
/// the control-flow analysis key
|
|
std::string cfAnalysisKey;
|
|
|
|
public:
|
|
static const std::string KEY;
|
|
|
|
/// Initializes a dominator analysis.
|
|
/// @param cfAnalysisKey the control-flow analysis key
|
|
explicit DominatorAnalysis(std::string cfAnalysisKey)
|
|
: cfAnalysisKey(std::move(cfAnalysisKey)) {}
|
|
|
|
std::string getKey() const override { return KEY; }
|
|
|
|
std::unique_ptr<Result> run(const Module *m) override;
|
|
};
|
|
|
|
} // namespace dataflow
|
|
} // namespace analyze
|
|
} // namespace ir
|
|
} // namespace codon
|