• 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_interchange.cpp
1
#include "sdfg/transformations/loop_interchange.h"
2

3
#include "sdfg/analysis/data_parallelism_analysis.h"
4
#include "sdfg/structured_control_flow/structured_loop.h"
5

6
namespace sdfg {
7
namespace transformations {
8

UNCOV
9
LoopInterchange::LoopInterchange(structured_control_flow::Sequence& parent,
×
10
                                 structured_control_flow::StructuredLoop& outer_loop,
11
                                 structured_control_flow::StructuredLoop& inner_loop)
UNCOV
12
    : outer_loop_(outer_loop), inner_loop_(inner_loop) {
×
13

UNCOV
14
      };
×
15

16
std::string LoopInterchange::name() { return "LoopInterchange"; };
×
17

UNCOV
18
bool LoopInterchange::can_be_applied(builder::StructuredSDFGBuilder& builder,
×
19
                                     analysis::AnalysisManager& analysis_manager) {
UNCOV
20
    auto& outer_indvar = this->outer_loop_.indvar();
×
21

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

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

UNCOV
45
    auto& outer_dependencies = analysis.get(this->outer_loop_);
×
UNCOV
46
    if (outer_dependencies.size() > 0) {
×
UNCOV
47
        bool is_map = true;
×
UNCOV
48
        for (auto& dep : outer_dependencies) {
×
UNCOV
49
            auto& dep_type = dep.second;
×
UNCOV
50
            if (dep_type < analysis::Parallelism::PARALLEL) {
×
51
                is_map = false;
×
52
                break;
×
53
            }
54
        }
UNCOV
55
        if (is_map) {
×
UNCOV
56
            return true;
×
57
        }
58
    }
×
59
    auto& inner_dependencies = analysis.get(this->inner_loop_);
×
60
    if (inner_dependencies.size() > 0) {
×
61
        bool is_map = true;
×
62
        for (auto& dep : inner_dependencies) {
×
63
            auto& dep_type = dep.second;
×
64
            if (dep_type < analysis::Parallelism::PARALLEL) {
×
65
                is_map = false;
×
66
                break;
×
67
            }
68
        }
69
        if (is_map) {
×
70
            return true;
×
71
        }
72
    }
×
73

74
    return false;
×
UNCOV
75
};
×
76

UNCOV
77
void LoopInterchange::apply(builder::StructuredSDFGBuilder& builder,
×
78
                            analysis::AnalysisManager& analysis_manager) {
UNCOV
79
    auto new_inner_loop = builder.add_for_after(
×
UNCOV
80
        builder.parent(inner_loop_), this->inner_loop_, this->outer_loop_.indvar(),
×
UNCOV
81
        this->outer_loop_.condition(), this->outer_loop_.init(), this->outer_loop_.update());
×
UNCOV
82
    auto& inner_body = this->inner_loop_.root();
×
83

UNCOV
84
    builder.insert_children(new_inner_loop.first.root(), inner_body, 0);
×
85

UNCOV
86
    auto new_outer_loop = builder.add_for_after(
×
UNCOV
87
        builder.parent(outer_loop_), this->outer_loop_, this->inner_loop_.indvar(),
×
UNCOV
88
        this->inner_loop_.condition(), this->inner_loop_.init(), this->inner_loop_.update());
×
89

UNCOV
90
    auto& outer_body = this->outer_loop_.root();
×
UNCOV
91
    builder.insert_children(new_outer_loop.first.root(), outer_body, 0);
×
UNCOV
92
    builder.remove_child(builder.parent(inner_loop_), this->inner_loop_);
×
UNCOV
93
    builder.remove_child(builder.parent(outer_loop_), this->outer_loop_);
×
94

UNCOV
95
    analysis_manager.invalidate_all();
×
UNCOV
96
};
×
97

98
}  // namespace transformations
99
}  // 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