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

daisytuner / sdfglib / 15656007340

14 Jun 2025 08:51PM UTC coverage: 13.234% (-49.9%) from 63.144%
15656007340

Pull #76

github

web-flow
Merge 9586c8161 into 413c53212
Pull Request #76: New Loop Dependency Analysis

361 of 465 new or added lines in 7 files covered. (77.63%)

6215 existing lines in 110 files now uncovered.

1612 of 12181 relevant lines covered (13.23%)

13.64 hits per line

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

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

3
#include "sdfg/analysis/loop_analysis.h"
4
#include "sdfg/builder/structured_sdfg_builder.h"
5
#include "sdfg/deepcopy/structured_sdfg_deep_copy.h"
6
#include "sdfg/passes/structured_control_flow/dead_cfg_elimination.h"
7
#include "sdfg/passes/structured_control_flow/sequence_fusion.h"
8
#include "sdfg/structured_control_flow/structured_loop.h"
9

10
namespace sdfg {
11
namespace transformations {
12

UNCOV
13
LoopTiling::LoopTiling(structured_control_flow::Sequence& parent,
×
14
                       structured_control_flow::StructuredLoop& loop, size_t tile_size)
UNCOV
15
    : parent_(parent), loop_(loop), tile_size_(tile_size) {
×
UNCOV
16
    if (tile_size <= 1) {
×
17
        throw InvalidSDFGException("LoopTiling: Tile size must be greater than 1");
×
18
    }
UNCOV
19
};
×
20

21
std::string LoopTiling::name() { return "LoopTiling"; };
×
22

UNCOV
23
bool LoopTiling::can_be_applied(builder::StructuredSDFGBuilder& builder,
×
24
                                analysis::AnalysisManager& analysis_manager) {
25
    // Criterion contiguous loop
UNCOV
26
    auto& loop_analysis = analysis_manager.get<analysis::LoopAnalysis>();
×
UNCOV
27
    return loop_analysis.is_contiguous(&loop_);
×
28
};
29

UNCOV
30
void LoopTiling::apply(builder::StructuredSDFGBuilder& builder,
×
31
                       analysis::AnalysisManager& analysis_manager) {
UNCOV
32
    auto& sdfg = builder.subject();
×
33

UNCOV
34
    auto indvar = loop_.indvar();
×
UNCOV
35
    auto outer_indvar_str = builder.find_new_name(indvar->get_name() + "_tile");
×
UNCOV
36
    builder.add_container(outer_indvar_str, sdfg.type(loop_.indvar()->get_name()));
×
UNCOV
37
    auto outer_indvar = symbolic::symbol(outer_indvar_str);
×
38

UNCOV
39
    auto tile_size = symbolic::integer(this->tile_size_);
×
40

UNCOV
41
    auto condition = symbolic::subs(loop_.condition(), indvar, outer_indvar);
×
UNCOV
42
    auto update = symbolic::add(outer_indvar, tile_size);
×
43

UNCOV
44
    auto& outer_loop =
×
UNCOV
45
        builder.add_for_before(parent_, loop_, outer_indvar, condition, loop_.init(), update).first;
×
46

UNCOV
47
    auto& outer_body = outer_loop.root();
×
48

UNCOV
49
    auto inner_indvar = indvar;
×
UNCOV
50
    auto inner_init = outer_indvar;
×
UNCOV
51
    auto inner_condition_tile = symbolic::Lt(inner_indvar, symbolic::add(outer_indvar, tile_size));
×
UNCOV
52
    auto inner_condition_base = symbolic::subs(loop_.condition(), outer_indvar, inner_indvar);
×
UNCOV
53
    auto inner_condition = symbolic::And(inner_condition_tile, inner_condition_base);
×
UNCOV
54
    auto inner_update = symbolic::add(inner_indvar, symbolic::integer(1));
×
55

56
    // Add new loop with original body
UNCOV
57
    auto& tmp_root = builder.add_sequence_before(parent_, loop_).first;
×
UNCOV
58
    auto& inner_loop =
×
UNCOV
59
        builder.add_for(tmp_root, inner_indvar, inner_condition, inner_init, inner_update);
×
60

UNCOV
61
    deepcopy::StructuredSDFGDeepCopy copies(builder, inner_loop.root(), loop_.root());
×
UNCOV
62
    copies.copy();
×
63

UNCOV
64
    builder.clear_sequence(outer_body);
×
65

UNCOV
66
    deepcopy::StructuredSDFGDeepCopy copies2(builder, outer_body, tmp_root);
×
UNCOV
67
    copies2.copy();
×
68

UNCOV
69
    builder.remove_child(parent_, tmp_root);
×
UNCOV
70
    builder.remove_child(parent_, loop_);
×
71

UNCOV
72
    analysis_manager.invalidate_all();
×
73

UNCOV
74
    passes::SequenceFusion sf_pass;
×
UNCOV
75
    passes::DeadCFGElimination dce_pass;
×
UNCOV
76
    bool applies = false;
×
UNCOV
77
    do {
×
UNCOV
78
        applies = false;
×
UNCOV
79
        applies |= dce_pass.run(builder, analysis_manager);
×
UNCOV
80
        applies |= sf_pass.run(builder, analysis_manager);
×
UNCOV
81
    } while (applies);
×
UNCOV
82
};
×
83

84
}  // namespace transformations
85
}  // 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

© 2026 Coveralls, Inc