70 std::unordered_map<analysis::ElementId, std::unique_ptr<loop_fusion::FusionLoopCandidate>>
fuse_candidates;
95 std::string
name()
override {
96 return "LoopFusionPass";
126 const std::unordered_set<loop_fusion::RegId>& skipped_containers
140 bool local_not_nested =
true,
141 bool only_no_overlap =
false
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,
148 bool local_not_nested =
true,
149 bool only_no_overlap =
false
157 SymEngine::map_basic_basic& canonical_indvars
180 const std::function<
void(
181 const std::string& name,
183 std::unordered_map<std::string, loop_fusion::FusionArg>& target_args
193 bool can_remove_original
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 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
Definition fusion_types.h:9
Definition loop_fusion_pass.h:129
bool no_conflicts
Definition loop_fusion_pass.h:130
bool subset_mismatch
Definition loop_fusion_pass.h:132
bool overlap
Definition loop_fusion_pass.h:131
Definition loop_fusion_pass.h:66
uint32_t fused_by_access_count
Definition loop_fusion_pass.h:72
uint32_t total_fused_count() const
std::unique_ptr< analysis::LoopAnalysis > loop_analysis
Definition loop_fusion_pass.h:69
loop_fusion::FusionLoopCandidate * get_parent(loop_fusion::FusionLoopCandidate ¤t)
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 ¤t)
Definition fusion_types.h:122