• 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/passes/structured_control_flow/loop_normalization.cpp
1
#include "sdfg/passes/structured_control_flow/loop_normalization.h"
2

3
#include "sdfg/analysis/assumptions_analysis.h"
4
#include "sdfg/analysis/loop_analysis.h"
5
#include "sdfg/symbolic/conjunctive_normal_form.h"
6
#include "sdfg/symbolic/series.h"
7

8
namespace sdfg {
9
namespace passes {
10

UNCOV
11
bool LoopNormalization::apply(builder::StructuredSDFGBuilder& builder,
×
12
                              analysis::AnalysisManager& analysis_manager,
13
                              structured_control_flow::For& loop) {
UNCOV
14
    auto& loop_analysis = analysis_manager.get<analysis::LoopAnalysis>();
×
UNCOV
15
    if (!loop_analysis.is_contiguous(&loop)) {
×
16
        return false;
×
17
    }
18

19
    // Section: Condition
20
    // Turn inequalities into strict less than
UNCOV
21
    auto indvar = loop.indvar();
×
UNCOV
22
    auto condition = loop.condition();
×
23

UNCOV
24
    auto& assumptions = analysis_manager.get<analysis::AssumptionsAnalysis>();
×
UNCOV
25
    auto& assums = assumptions.get(loop);
×
26

UNCOV
27
    bool applied = false;
×
28
    try {
UNCOV
29
        auto cnf = symbolic::conjunctive_normal_form(condition);
×
UNCOV
30
        symbolic::CNF new_cnf;
×
UNCOV
31
        for (auto& clause : cnf) {
×
UNCOV
32
            std::vector<symbolic::Condition> new_clause;
×
UNCOV
33
            for (auto& literal : clause) {
×
UNCOV
34
                if (SymEngine::is_a<SymEngine::Unequality>(*literal)) {
×
UNCOV
35
                    auto eq = SymEngine::rcp_static_cast<const SymEngine::Unequality>(literal);
×
UNCOV
36
                    auto eq_args = eq->get_args();
×
UNCOV
37
                    auto lhs = eq_args.at(0);
×
UNCOV
38
                    auto rhs = eq_args.at(1);
×
UNCOV
39
                    if (SymEngine::eq(*lhs, *indvar) && !symbolic::uses(rhs, indvar)) {
×
40
                        new_clause.push_back(symbolic::Lt(lhs, rhs));
×
41
                        applied = true;
×
UNCOV
42
                    } else if (SymEngine::eq(*rhs, *indvar) && !symbolic::uses(lhs, indvar)) {
×
UNCOV
43
                        new_clause.push_back(symbolic::Lt(rhs, lhs));
×
UNCOV
44
                        applied = true;
×
UNCOV
45
                    } else {
×
46
                        new_clause.push_back(literal);
×
47
                    }
UNCOV
48
                } else {
×
49
                    new_clause.push_back(literal);
×
50
                }
51
            }
UNCOV
52
            new_cnf.push_back(new_clause);
×
UNCOV
53
        }
×
54
        // Construct new condition
UNCOV
55
        symbolic::Condition new_condition = symbolic::__true__();
×
UNCOV
56
        for (auto& clause : new_cnf) {
×
UNCOV
57
            symbolic::Condition new_clause = symbolic::__false__();
×
UNCOV
58
            for (auto& literal : clause) {
×
UNCOV
59
                new_clause = symbolic::Or(new_clause, literal);
×
60
            }
UNCOV
61
            new_condition = symbolic::And(new_condition, new_clause);
×
UNCOV
62
        }
×
UNCOV
63
        loop.condition() = new_condition;
×
UNCOV
64
    } catch (const symbolic::CNFException e) {
×
65
    }
×
66

UNCOV
67
    return applied;
×
UNCOV
68
};
×
69

UNCOV
70
LoopNormalization::LoopNormalization()
×
UNCOV
71
    : Pass() {
×
72

UNCOV
73
      };
×
74

75
std::string LoopNormalization::name() { return "LoopNormalization"; };
×
76

UNCOV
77
bool LoopNormalization::run_pass(builder::StructuredSDFGBuilder& builder,
×
78
                                 analysis::AnalysisManager& analysis_manager) {
UNCOV
79
    bool applied = false;
×
80

UNCOV
81
    auto& loop_analysis = analysis_manager.get<analysis::LoopAnalysis>();
×
UNCOV
82
    for (const auto& loop : loop_analysis.loops()) {
×
UNCOV
83
        if (auto for_loop = dynamic_cast<structured_control_flow::For*>(loop)) {
×
UNCOV
84
            applied |= this->apply(builder, analysis_manager, *for_loop);
×
UNCOV
85
        }
×
86
    }
87

UNCOV
88
    return applied;
×
89
};
×
90

91
}  // namespace passes
92
}  // 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