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

daisytuner / sdfglib / 15049122732

15 May 2025 03:33PM UTC coverage: 62.241% (+4.7%) from 57.525%
15049122732

Pull #9

github

web-flow
Merge b96e33e0e into 9d3b1a2b3
Pull Request #9: Graphviz DOT Visualizer for SDFGs

520 of 542 new or added lines in 3 files covered. (95.94%)

782 existing lines in 68 files now uncovered.

8049 of 12932 relevant lines covered (62.24%)

504.09 hits per line

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

95.45
/src/transformations/loop_interchange.cpp
1
#include "sdfg/transformations/loop_interchange.h"
2

3
namespace sdfg {
4
namespace transformations {
5

6
LoopInterchange::LoopInterchange(structured_control_flow::Sequence& parent,
92✔
7
                                 structured_control_flow::For& outer_loop,
8
                                 structured_control_flow::For& inner_loop)
9
    : outer_loop_(outer_loop), inner_loop_(inner_loop) {
92✔
10

11
      };
92✔
12

UNCOV
13
std::string LoopInterchange::name() { return "LoopInterchange"; };
×
14

15
bool LoopInterchange::can_be_applied(Schedule& schedule) {
92✔
16
    auto& builder = schedule.builder();
92✔
17
    auto& sdfg = builder.subject();
92✔
18

19
    auto& outer_indvar = this->outer_loop_.indvar();
92✔
20
    auto& inner_indvar = this->inner_loop_.indvar();
92✔
21

22
    // Criterion: Inner loop must not depend on outer loop
23
    auto& inner_loop_init = this->inner_loop_.init();
92✔
24
    auto& inner_loop_condition = this->inner_loop_.condition();
92✔
25
    auto& inner_loop_update = this->inner_loop_.update();
92✔
26
    if (symbolic::uses(inner_loop_init, outer_indvar->get_name()) ||
173✔
27
        symbolic::uses(inner_loop_condition, outer_indvar->get_name()) ||
152✔
28
        symbolic::uses(inner_loop_update, outer_indvar->get_name())) {
71✔
29
        return false;
21✔
30
    }
31

32
    // Criterion: Outer loop must not have any outer blocks
33
    if (outer_loop_.root().size() > 1) {
71✔
34
        return false;
13✔
35
    }
36
    if (outer_loop_.root().at(0).second.assignments().size() > 0) {
58✔
UNCOV
37
        return false;
×
38
    }
39
    if (&outer_loop_.root().at(0).first != &inner_loop_) {
58✔
UNCOV
40
        return false;
×
41
    }
42
    // Criterion: Any of both loops is a map
43
    auto& analysis_manager = schedule.analysis_manager();
58✔
44
    auto& analysis = analysis_manager.get<analysis::DataParallelismAnalysis>();
58✔
45

46
    auto& outer_dependencies = analysis.get(this->outer_loop_);
58✔
47
    if (outer_dependencies.size() > 0) {
58✔
48
        bool is_map = true;
58✔
49
        for (auto& dep : outer_dependencies) {
362✔
50
            auto& container = dep.first;
321✔
51
            auto& dep_type = dep.second;
321✔
52
            if (dep_type < analysis::Parallelism::PARALLEL) {
321✔
53
                is_map = false;
17✔
54
                break;
17✔
55
            }
56
        }
57
        if (is_map) {
58✔
58
            return true;
41✔
59
        }
60
    }
17✔
61
    auto& inner_dependencies = analysis.get(this->inner_loop_);
17✔
62
    if (inner_dependencies.size() > 0) {
17✔
63
        bool is_map = true;
17✔
64
        for (auto& dep : inner_dependencies) {
85✔
65
            auto& container = dep.first;
73✔
66
            auto& dep_type = dep.second;
73✔
67
            if (dep_type < analysis::Parallelism::PARALLEL) {
73✔
68
                is_map = false;
5✔
69
                break;
5✔
70
            }
71
        }
72
        if (is_map) {
17✔
73
            return true;
12✔
74
        }
75
    }
5✔
76

77
    return false;
5✔
78
};
92✔
79

80
void LoopInterchange::apply(Schedule& schedule) {
13✔
81
    // Swap loop definitions
82
    auto outer_indvar = this->outer_loop_.indvar();
13✔
83
    auto outer_init = this->outer_loop_.init();
13✔
84
    auto outer_condition = this->outer_loop_.condition();
13✔
85
    auto outer_update = this->outer_loop_.update();
13✔
86

87
    this->outer_loop_.indvar() = this->inner_loop_.indvar();
13✔
88
    this->outer_loop_.init() = this->inner_loop_.init();
13✔
89
    this->outer_loop_.condition() = this->inner_loop_.condition();
13✔
90
    this->outer_loop_.update() = this->inner_loop_.update();
13✔
91

92
    this->inner_loop_.indvar() = outer_indvar;
13✔
93
    this->inner_loop_.init() = outer_init;
13✔
94
    this->inner_loop_.condition() = outer_condition;
13✔
95
    this->inner_loop_.update() = outer_update;
13✔
96

97
    auto& analysis_manager = schedule.analysis_manager();
13✔
98
    analysis_manager.invalidate_all();
13✔
99
};
13✔
100

101
}  // namespace transformations
102
}  // 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