• 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

92.31
/src/transformations/loop_unroll.cpp
1
#include "sdfg/transformations/loop_unroll.h"
2

3
#include "sdfg/data_flow/access_node.h"
4
#include "sdfg/deepcopy/structured_sdfg_deep_copy.h"
5
#include "sdfg/symbolic/symbolic.h"
6
#include "sdfg/transformations/utils.h"
7

8
namespace sdfg {
9
namespace transformations {
10

11
LoopUnroll::LoopUnroll(structured_control_flow::Sequence& parent,
2✔
12
                       structured_control_flow::For& loop)
13
    : parent_(parent), loop_(loop) {
2✔
14

15
      };
2✔
16

UNCOV
17
std::string LoopUnroll::name() { return "LoopUnroll"; };
×
18

19
bool LoopUnroll::can_be_applied(Schedule& schedule) {
2✔
20
    // Criterion: Check if the loop iteration count is known and an Integer
21
    auto iteration_count = get_iteration_count(this->loop_);
2✔
22
    if (iteration_count == SymEngine::null) {
2✔
23
        return false;
1✔
24
    }
25

26
    // Criterion: Check if the loop has a known init and update expression
27
    auto& update = loop_.update();
1✔
28
    if (!symbolic::eq(update, symbolic::add(loop_.indvar(), symbolic::integer(1)))) {
1✔
UNCOV
29
        return false;
×
30
    }
31

32
    // Criterion: Check if the loop indvar is not used as an access_node in the loop body
33
    auto& analysis_manager = schedule.analysis_manager();
1✔
34
    auto& users = analysis_manager.get<analysis::Users>();
1✔
35
    auto& body = loop_.root();
1✔
36
    analysis::UsersView body_users(users, body);
1✔
37
    for (auto user : body_users.uses(loop_.indvar()->get_name())) {
3✔
38
        if (auto AccessNode = dynamic_cast<data_flow::AccessNode*>(user->element())) {
2✔
UNCOV
39
            return false;
×
40
        }
41
    }
42

43
    return true;
1✔
44
};
2✔
45

46
void LoopUnroll::apply(Schedule& schedule) {
1✔
47
    auto& builder = schedule.builder();
1✔
48
    auto& sdfg = builder.subject();
1✔
49
    auto& analysis_manager = schedule.analysis_manager();
1✔
50
    auto iteration_count = get_iteration_count(this->loop_);
1✔
51

52
    auto& init = loop_.init();
1✔
53
    auto update = symbolic::integer(1);
1✔
54

55
    for (int i = 0; i < iteration_count->as_int(); i++) {
5✔
56
        auto& branch = builder.add_if_else(parent_);
4✔
57
        auto pseudo_iterator = symbolic::add(init, symbolic::mul(symbolic::integer(i), update));
4✔
58
        auto branch_cond =
59
            symbolic::subs(this->loop_.condition(), this->loop_.indvar(), pseudo_iterator);
4✔
60
        auto& branch_case = builder.add_case(branch, branch_cond);
4✔
61

62
        deepcopy::StructuredSDFGDeepCopy copier(builder, branch_case, loop_.root());
4✔
63
        copier.copy();
4✔
64
        branch_case.replace(this->loop_.indvar(), pseudo_iterator);
4✔
65
    }
4✔
66

67
    builder.remove_child(parent_, loop_);
1✔
68

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

72
}  // namespace transformations
73
}  // 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