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

daisytuner / sdfglib / 15787041637

20 Jun 2025 08:14PM UTC coverage: 63.076% (-1.5%) from 64.591%
15787041637

Pull #95

github

web-flow
Merge 8c012fc8f into 37b47b09d
Pull Request #95: Extends Data Dependency Analysis

717 of 900 new or added lines in 19 files covered. (79.67%)

95 existing lines in 7 files now uncovered.

7788 of 12347 relevant lines covered (63.08%)

134.28 hits per line

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

85.19
/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/maps.h"
7

8
namespace sdfg {
9
namespace passes {
10

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

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

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

64
    return applied;
3✔
65
};
3✔
66

67
LoopNormalization::LoopNormalization()
3✔
68
    : Pass() {
3✔
69

70
      };
3✔
71

72
std::string LoopNormalization::name() { return "LoopNormalization"; };
×
73

74
bool LoopNormalization::run_pass(builder::StructuredSDFGBuilder& builder,
3✔
75
                                 analysis::AnalysisManager& analysis_manager) {
76
    bool applied = false;
3✔
77

78
    auto& loop_analysis = analysis_manager.get<analysis::LoopAnalysis>();
3✔
79
    for (const auto& loop : loop_analysis.loops()) {
6✔
80
        if (auto for_loop = dynamic_cast<structured_control_flow::For*>(loop)) {
3✔
81
            applied |= this->apply(builder, analysis_manager, *for_loop);
3✔
82
        }
3✔
83
    }
84

85
    return applied;
3✔
86
};
×
87

88
}  // namespace passes
89
}  // 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