35 virtual std::string
name()
const = 0;
59 std::unordered_map<std::type_index, std::unique_ptr<Analysis>> cache_;
61 static constexpr const char* STATS_SCOPE =
"AnalysisMgr";
79 return options_->get(key);
84 std::type_index type = std::type_index(
typeid(T));
87 auto it = cache_.find(type);
88 if (it != cache_.end()) {
89 return *
static_cast<T*
>(it->second.get());
93 if constexpr (std::is_constructible_v<T, StructuredSDFG&, const Options&>) {
94 cache_[type] = std::make_unique<T>(this->sdfg_, *this->options_);
96 cache_[type] = std::make_unique<T>(this->sdfg_);
98 cache_[type]->additional_assumptions_ = this->additional_assumptions_;
103 stats->
enter_scope(cache_[type]->name(), STATS_SCOPE);
106 cache_[type]->run(*
this);
112 return *
static_cast<T*
>(cache_[type].get());
117 std::type_index type = std::type_index(
typeid(T));
118 if (cache_.find(type) != cache_.end()) {
125 template<
class... Ts>
127 std::unordered_map<std::type_index, std::unique_ptr<Analysis>> kept;
128 auto try_keep = [&](std::type_index type) {
129 auto it = cache_.find(type);
130 if (it != cache_.end()) {
131 kept.emplace(type, std::move(it->second));
134 (try_keep(std::type_index(
typeid(Ts))), ...);
136 for (
auto& [type,
analysis] : kept) {
137 cache_.emplace(type, std::move(
analysis));
T get(const OptionKey< T > &key, T fallback=T{}) const
Definition options.h:72
static const Options & empty()
Definition options.h:84
Definition structured_sdfg.h:30
AnalysisManager & operator=(const AnalysisManager &)=delete
void invalidate_all(structured_control_flow::ControlFlowNode &changed)
Invalidates the analyses after a change confined to the subtree of changed; see Analysis::invalidate.
AnalysisManager(StructuredSDFG &sdfg, const Options &options)
AnalysisManager(StructuredSDFG &sdfg, const symbolic::Assumptions &additional_assumptions)
AnalysisManager(StructuredSDFG &sdfg, const symbolic::Assumptions &additional_assumptions, const Options &options)
void preserve()
Definition analysis.h:126
T option(const OptionKey< T > &key) const
Definition analysis.h:78
void invalidate()
Definition analysis.h:116
T & get()
Definition analysis.h:83
AnalysisManager(StructuredSDFG &sdfg)
AnalysisManager(const AnalysisManager &am)=delete
const Options & options() const
Definition analysis.h:73
Analysis & operator=(const Analysis &)=delete
symbolic::Assumptions additional_assumptions_
Definition analysis.h:17
Analysis(const Analysis &a)=delete
const Options * options_
Definition analysis.h:19
virtual std::string name() const =0
StructuredSDFG & sdfg_
Definition analysis.h:16
virtual ~Analysis()=default
Analysis(StructuredSDFG &sdfg)
virtual void run(analysis::AnalysisManager &analysis_manager)=0
Analysis(StructuredSDFG &sdfg, const Options &options)
T option(const OptionKey< T > &key, T fallback=T{}) const
Definition analysis.h:24
virtual bool invalidate(structured_control_flow::ControlFlowNode &changed)
Updates the analysis after a change confined to the subtree of changed.
Definition analysis.h:45
friend class AnalysisManager
Definition analysis.h:13
Definition statistics.h:73
static bool enabled()
Definition statistics.h:200
static CompileStatistics & instance()
Definition statistics.h:92
Node * enter_scope(const std::string &name, const std::string &scope_type)
Base class for all structured control flow nodes in a StructuredSDFG.
Definition control_flow_node.h:44
Map from symbols to their assumptions.
Definition assumptions.h:313