• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daisytuner / sdfglib / 16069945621

04 Jul 2025 08:56AM UTC coverage: 64.375% (-0.2%) from 64.606%
16069945621

push

github

web-flow
Merge pull request #137 from daisytuner/clang-format

runs clang-format on codebase

609 of 827 new or added lines in 63 files covered. (73.64%)

46 existing lines in 30 files now uncovered.

8578 of 13325 relevant lines covered (64.38%)

177.24 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.3
/src/transformations/loop_tiling.cpp
1
#include "sdfg/transformations/loop_tiling.h"
2

3
#include "sdfg/analysis/assumptions_analysis.h"
4
#include "sdfg/analysis/loop_analysis.h"
5
#include "sdfg/analysis/scope_analysis.h"
6
#include "sdfg/builder/structured_sdfg_builder.h"
7
#include "sdfg/structured_control_flow/structured_loop.h"
8

9
namespace sdfg {
10
namespace transformations {
11

12
LoopTiling::LoopTiling(structured_control_flow::StructuredLoop& loop, size_t tile_size)
10✔
13
    : loop_(loop), tile_size_(tile_size) {};
10✔
14

15
std::string LoopTiling::name() const { return "LoopTiling"; };
6✔
16

17
bool LoopTiling::can_be_applied(builder::StructuredSDFGBuilder& builder, analysis::AnalysisManager& analysis_manager) {
10✔
18
    if (this->tile_size_ <= 1) {
10✔
19
        return false;
2✔
20
    }
21
    // Criterion contiguous loop
22
    auto& assumptions_analysis = analysis_manager.get<analysis::AssumptionsAnalysis>();
8✔
23
    return analysis::LoopAnalysis::is_contiguous(&loop_, assumptions_analysis);
8✔
24
};
10✔
25

26
void LoopTiling::apply(builder::StructuredSDFGBuilder& builder, analysis::AnalysisManager& analysis_manager) {
8✔
27
    auto& sdfg = builder.subject();
8✔
28

29
    auto& scope_analysis = analysis_manager.get<analysis::ScopeAnalysis>();
8✔
30
    auto parent = static_cast<structured_control_flow::Sequence*>(scope_analysis.parent_scope(&loop_));
8✔
31

32
    auto indvar = loop_.indvar();
8✔
33

34
    // Step 1: Define new outer loop
35
    auto outer_indvar_str = builder.find_new_name(indvar->get_name() + "_tile");
8✔
36
    builder.add_container(outer_indvar_str, sdfg.type(loop_.indvar()->get_name()));
8✔
37

38
    auto outer_indvar = symbolic::symbol(outer_indvar_str);
8✔
39
    auto outer_condition = symbolic::subs(loop_.condition(), indvar, outer_indvar);
8✔
40
    auto outer_update = symbolic::add(outer_indvar, symbolic::integer(this->tile_size_));
8✔
41

42
    structured_control_flow::StructuredLoop* outer_loop = nullptr;
8✔
43
    if (auto map = dynamic_cast<structured_control_flow::Map*>(&loop_)) {
8✔
44
        outer_loop =
4✔
45
            &builder
4✔
46
                 .add_map_before(
4✔
47
                     *parent, loop_, outer_indvar, outer_condition, loop_.init(), outer_update, map->schedule_type()
4✔
48
                 )
49
                 .first;
4✔
50
    } else {
4✔
51
        outer_loop =
4✔
52
            &builder.add_for_before(*parent, loop_, outer_indvar, outer_condition, loop_.init(), outer_update).first;
4✔
53
    }
54

55
    // Step 2: Redefine inner loop
56
    auto inner_indvar = indvar;
8✔
57
    auto inner_init = outer_indvar;
8✔
58
    auto inner_condition_tile =
59
        symbolic::Lt(inner_indvar, symbolic::add(outer_indvar, symbolic::integer(this->tile_size_)));
8✔
60
    auto inner_condition = symbolic::And(inner_condition_tile, loop_.condition());
8✔
61
    auto inner_update = symbolic::add(inner_indvar, symbolic::integer(1));
8✔
62
    loop_.update() = inner_update;
8✔
63
    loop_.condition() = inner_condition;
8✔
64
    loop_.init() = inner_init;
8✔
65

66
    // Step 3: Move inner loop body to outer loop body
67
    builder.insert(loop_, *parent, outer_loop->root(), loop_.debug_info());
8✔
68

69
    analysis_manager.invalidate_all();
8✔
70
};
8✔
71

72
void LoopTiling::to_json(nlohmann::json& j) const {
4✔
73
    j["transformation_type"] = this->name();
4✔
74
    j["loop_element_id"] = loop_.element_id();
4✔
75
    j["tile_size"] = tile_size_;
4✔
76
};
4✔
77

78
LoopTiling LoopTiling::from_json(builder::StructuredSDFGBuilder& builder, const nlohmann::json& desc) {
4✔
79
    auto loop_id = desc["loop_element_id"].get<size_t>();
4✔
80
    size_t tile_size = desc["tile_size"].get<size_t>();
4✔
81
    auto element = builder.find_element_by_id(loop_id);
4✔
82
    if (!element) {
4✔
NEW
83
        throw InvalidTransformationDescriptionException("Element with ID " + std::to_string(loop_id) + " not found.");
×
84
    }
85
    auto loop = dynamic_cast<structured_control_flow::StructuredLoop*>(element);
4✔
86

87
    return LoopTiling(*loop, tile_size);
4✔
88
};
×
89

90
} // namespace transformations
91
} // namespace sdfg
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc