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

daisytuner / sdfglib / 19224861453

10 Nov 2025 08:06AM UTC coverage: 61.207% (-0.2%) from 61.422%
19224861453

push

github

web-flow
Merge pull request #334 from daisytuner/unify-loop-exits

adds unify loop exits pass

0 of 59 new or added lines in 1 file covered. (0.0%)

10322 of 16864 relevant lines covered (61.21%)

101.5 hits per line

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

0.0
/src/passes/structured_control_flow/unify_loop_exits.cpp
1
#include "sdfg/passes/structured_control_flow/unify_loop_exits.h"
2

3
namespace sdfg {
4
namespace passes {
5

6
std::unordered_set<const control_flow::State*> UnifyLoopExits::
NEW
7
    determine_loop_nodes(const SDFG& sdfg, const control_flow::State& start, const control_flow::State& end) const {
×
NEW
8
    std::unordered_set<const control_flow::State*> nodes;
×
NEW
9
    std::unordered_set<const control_flow::State*> visited;
×
NEW
10
    std::list<const control_flow::State*> queue = {&start};
×
NEW
11
    while (!queue.empty()) {
×
NEW
12
        auto curr = queue.front();
×
NEW
13
        queue.pop_front();
×
NEW
14
        nodes.insert(curr);
×
15

NEW
16
        if (visited.find(curr) != visited.end()) {
×
NEW
17
            continue;
×
18
        }
NEW
19
        visited.insert(curr);
×
20

NEW
21
        if (curr == &end) {
×
NEW
22
            continue;
×
23
        }
24

NEW
25
        for (auto& iedge : sdfg.in_edges(*curr)) {
×
NEW
26
            if (visited.find(&iedge.src()) != visited.end()) {
×
NEW
27
                continue;
×
28
            }
NEW
29
            queue.push_back(&iedge.src());
×
30
        }
31
    }
32

NEW
33
    return nodes;
×
NEW
34
};
×
35

NEW
36
std::string UnifyLoopExits::name() { return "UnifyLoopExits"; };
×
37

NEW
38
bool UnifyLoopExits::run_pass(builder::SDFGBuilder& builder) {
×
NEW
39
    auto& sdfg = builder.subject();
×
40

NEW
41
    bool applied = false;
×
NEW
42
    auto bedges = sdfg.back_edges();
×
NEW
43
    for (auto back_edge : bedges) {
×
NEW
44
        auto loop_states = determine_loop_nodes(sdfg, back_edge->src(), back_edge->dst());
×
45

46
        // Determine loop exits
NEW
47
        std::unordered_set<const control_flow::State*> exit_states;
×
48
        std::unordered_map<const control_flow::State*, std::unordered_set<const control_flow::InterstateEdge*>>
NEW
49
            exit_edges;
×
NEW
50
        for (auto& node : loop_states) {
×
NEW
51
            for (auto& edge : sdfg.out_edges(*node)) {
×
NEW
52
                auto exit_state = &edge.dst();
×
NEW
53
                if (loop_states.find(exit_state) == loop_states.end()) {
×
NEW
54
                    exit_states.insert(exit_state);
×
NEW
55
                    if (exit_edges.find(exit_state) == exit_edges.end()) {
×
NEW
56
                        exit_edges.insert({exit_state, {}});
×
NEW
57
                    }
×
NEW
58
                    exit_edges[exit_state].insert(&edge);
×
NEW
59
                }
×
60
            }
61
        }
62
        // Merge exit states
NEW
63
        if (exit_states.size() > 1) {
×
NEW
64
            auto& merged_state = builder.add_state(false);
×
65

NEW
66
            auto sym_name = builder.find_new_name("daisy_jump_");
×
NEW
67
            builder.add_container(sym_name, types::Scalar(types::PrimitiveType::Int64));
×
NEW
68
            auto sym = symbolic::symbol(sym_name);
×
69

NEW
70
            size_t i = 0;
×
NEW
71
            for (auto exit_state : exit_states) {
×
NEW
72
                for (auto iedge : exit_edges[exit_state]) {
×
NEW
73
                    auto assignments = iedge->assignments();
×
NEW
74
                    assignments[sym] = symbolic::integer(i);
×
NEW
75
                    builder.add_edge(iedge->src(), merged_state, assignments, iedge->condition());
×
NEW
76
                }
×
77

NEW
78
                builder.add_edge(merged_state, *exit_state, symbolic::Eq(sym, symbolic::integer(i)));
×
79

NEW
80
                for (auto iedge : exit_edges[exit_state]) {
×
NEW
81
                    builder.remove_edge(*iedge);
×
82
                }
83

NEW
84
                i++;
×
85
            }
86

NEW
87
            applied = true;
×
88
            break;
NEW
89
        }
×
NEW
90
    }
×
91

NEW
92
    return applied;
×
NEW
93
};
×
94

95
} // namespace passes
96
} // 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