docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
loop_fusion_pass.h
Go to the documentation of this file.
1#pragma once
2
7#include "sdfg/passes/pass.h"
9
11
20
62 friend class LoopFusionHandler;
63 LoopFusionConfig config_;
64
65public:
66 struct State {
69 std::unique_ptr<analysis::LoopAnalysis> loop_analysis;
70 std::unordered_map<analysis::ElementId, std::unique_ptr<loop_fusion::FusionLoopCandidate>> fuse_candidates;
74
82
84
86
87 uint32_t total_fused_count() const;
88
89 uint32_t run;
90 };
91
94
95 std::string name() override {
96 return "LoopFusionPass";
97 }
98
100
101protected:
104
105 // std::unique_ptr<MapFusionState> create_initial_state(const structured_control_flow::ControlFlowNode& node)
106 // override;
107};
108
110 LoopFusionPass::State& state_;
111 LoopFusionConfig config_;
112
113public:
115
117 match(StructuredLoop& first, StructuredLoop& second, bool no_uses_between) override;
118
120 FusionLoopCandidate& first, FusionLoopCandidate& second, bool no_uses_between, bool domains_match
121 );
122
124 const StructuredLoop& map,
125 const StructuredLoop& second,
126 const std::unordered_set<loop_fusion::RegId>& skipped_containers
127 ) override;
128
131 bool overlap = false;
132 bool subset_mismatch = false;
133 };
134
135protected:
137 const loop_fusion::FusionLoopCandidate& first_candidate,
138 const loop_fusion::FusionLoopCandidate& second_candidate,
139 symbolic::ExpressionMapping& canonical_indvars,
140 bool local_not_nested = true,
141 bool only_no_overlap = false
142 );
143
145 const std::unordered_map<loop_fusion::RegId, loop_fusion::FusionArg>& first_args,
146 const std::unordered_map<loop_fusion::RegId, loop_fusion::FusionArg>& second_args,
147 symbolic::ExpressionMapping& canonical_indvars,
148 bool local_not_nested = true,
149 bool only_no_overlap = false
150 );
151
152 void update_fused_seq(Sequence& sequence, const symbolic::ExpressionMapping& replacements);
153
157 SymEngine::map_basic_basic& canonical_indvars
158 );
159
161
163 ControlFlowNode* first_top,
165 loop_fusion::FusionLoopCandidate* second_current,
166 const symbolic::ExpressionMapping& canonical_indvars
167 );
168
177 ControlFlowNode* first_top,
179 loop_fusion::FusionLoopCandidate* second_current,
180 const std::function<void(
181 const std::string& name,
182 loop_fusion::FusionArg& source_arg,
183 std::unordered_map<std::string, loop_fusion::FusionArg>& target_args
184 )>& action
185 );
186
188 ControlFlowNode* first_top,
189 loop_fusion::FusionLoopCandidate* first_innermost,
190 loop_fusion::FusionLoopCandidate* second_innermost,
191 const symbolic::ExpressionMapping& indvar_mapping,
192 Sequence& target_root,
193 bool can_remove_original
194 );
195
197
199
201
203 const Plan& plan, FusionLoopCandidate* first_current, FusionLoopCandidate* second_current
204 ) override;
205};
206
207} // namespace sdfg::passes::loop_fusion
Definition analysis.h:53
Definition loop_analysis.h:97
Note: Even though the class references unique_ptr, it will never delete an SDFG it has a reference to...
Definition structured_sdfg_builder.h:44
Definition pass.h:11
Definition loop_fusion_by_accesses.h:13
loop_fusion::PatternHandler::MatchResult fuse_contents(ControlFlowNode *first_top, loop_fusion::FusionLoopCandidate *first_innermost, loop_fusion::FusionLoopCandidate *second_innermost, const symbolic::ExpressionMapping &indvar_mapping, Sequence &target_root, bool can_remove_original)
LoopFusionHandler(const LoopFusionConfig &config, LoopFusionPass::State &state)
loop_fusion::FusionLoopCandidate * get_fuse_candidate(StructuredLoop &loop) override
bool check_no_overlap(const StructuredLoop &map, const StructuredLoop &second, const std::unordered_set< loop_fusion::RegId > &skipped_containers) override
void update_copied_leaf_contents_from_first_to_second(const Plan &plan, FusionLoopCandidate *first_current, FusionLoopCandidate *second_current) override
Moved non-loop contents from first_current to second_current.
void update_candidate_state(ControlFlowNode *first_top, loop_fusion::FusionLoopCandidate *first_current, loop_fusion::FusionLoopCandidate *second_current, const symbolic::ExpressionMapping &canonical_indvars)
InOutCheckResult check_ins_outs(const loop_fusion::FusionLoopCandidate &first_candidate, const loop_fusion::FusionLoopCandidate &second_candidate, symbolic::ExpressionMapping &canonical_indvars, bool local_not_nested=true, bool only_no_overlap=false)
analysis::LoopAnalysis & get_loop_analysis() override
void update_fused_seq(Sequence &sequence, const symbolic::ExpressionMapping &replacements)
void update_candidate_args_up(ControlFlowNode *first_top, loop_fusion::FusionLoopCandidate *first_current, loop_fusion::FusionLoopCandidate *second_current, const std::function< void(const std::string &name, loop_fusion::FusionArg &source_arg, std::unordered_map< std::string, loop_fusion::FusionArg > &target_args)> &action)
Helper that walks up from the innermost loops fused (first_current & second_current) until reaching t...
loop_fusion::PatternHandler::MatchResult try_complex_fuse_producer_into_consumer(FusionLoopCandidate &first, FusionLoopCandidate &second, bool no_uses_between, bool domains_match)
bool loop_match(loop_fusion::FusionLoopCandidate &first, loop_fusion::FusionLoopCandidate &second, SymEngine::map_basic_basic &canonical_indvars)
loop_fusion::PatternHandler::MatchResult match(StructuredLoop &first, StructuredLoop &second, bool no_uses_between) override
builder::StructuredSDFGBuilder & builder() override
InOutCheckResult check_ins_outs(const std::unordered_map< loop_fusion::RegId, loop_fusion::FusionArg > &first_args, const std::unordered_map< loop_fusion::RegId, loop_fusion::FusionArg > &second_args, symbolic::ExpressionMapping &canonical_indvars, bool local_not_nested=true, bool only_no_overlap=false)
void update_moved_candidate_states(loop_fusion::FusionLoopCandidate *top, const symbolic::ExpressionMapping &replace)
std::string name() override
Definition loop_fusion_pass.h:95
friend class LoopFusionHandler
Definition loop_fusion_pass.h:62
bool run_pass(builder::StructuredSDFGBuilder &builder, analysis::AnalysisManager &analysis_manager) override
const symbolic::Assumption * find_indvar_boundaries(const symbolic::Symbol &indvar, const symbolic::Assumptions &assumptions)
LoopFusionPass(const LoopFusionConfig &config)
bool visit(sdfg::structured_control_flow::Sequence &node) override
NeighboringPatternVisitor(loop_fusion::PatternHandler &handler)
Definition fusion_types.h:118
Base class for all structured control flow nodes in a StructuredSDFG.
Definition control_flow_node.h:44
A sequential container of control flow nodes.
Definition sequence.h:52
Base class for structured loop constructs.
Definition structured_loop.h:244
Represents assumptions about a symbol's properties and behavior.
Definition assumptions.h:61
Map from symbols to their assumptions.
Definition assumptions.h:313
Visitor for Structured SDFG (not a builder).
Definition structured_sdfg_visitor.h:71
SymEngine::RCP< const SymEngine::Symbol > Symbol
Reference-counted pointer to a SymEngine Symbol.
Definition symbolic.h:71
SymEngine::map_basic_basic ExpressionMapping
Definition symbolic.h:109
Definition function_builder.h:10
Definition fusion_types.h:7
Definition fusion_types.h:67
Represents pre-cached data for 1 Loop that fullfills the prerequisits for fusing with another candida...
Definition fusion_types.h:90
Definition loop_fusion_by_accesses.h:27
bool subset_mismatch
Definition loop_fusion_pass.h:132
Definition loop_fusion_pass.h:66
uint32_t fused_by_access_count
Definition loop_fusion_pass.h:72
std::unique_ptr< analysis::LoopAnalysis > loop_analysis
Definition loop_fusion_pass.h:69
loop_fusion::FusionLoopCandidate * get_parent(loop_fusion::FusionLoopCandidate &current)
uint32_t run
Definition loop_fusion_pass.h:89
builder::StructuredSDFGBuilder & builder
Definition loop_fusion_pass.h:67
State(builder::StructuredSDFGBuilder &builder, analysis::AnalysisManager &analysis_manager, std::unique_ptr< analysis::LoopAnalysis > loop_analysis)
Definition loop_fusion_pass.h:75
std::unordered_map< analysis::ElementId, std::unique_ptr< loop_fusion::FusionLoopCandidate > > fuse_candidates
Definition loop_fusion_pass.h:70
int64_t copied_redundant_writes
Definition loop_fusion_pass.h:73
uint32_t fused_by_domain_count
Definition loop_fusion_pass.h:71
analysis::AnalysisManager & analysis_manager
Definition loop_fusion_pass.h:68
loop_fusion::FusionLoopCandidate * get_next_level_map_stack(loop_fusion::FusionLoopCandidate &current)