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

3
#include "sdfg/analysis/users.h"
4
#include "sdfg/types/utils.h"
5

6
namespace sdfg {
7
namespace passes {
8

UNCOV
9
TrivialArrayElimination::TrivialArrayElimination()
×
UNCOV
10
    : Pass() {
×
11

UNCOV
12
      };
×
13

14
std::string TrivialArrayElimination::name() { return "TrivialArrayElimination"; };
×
15

UNCOV
16
bool TrivialArrayElimination::run_pass(builder::StructuredSDFGBuilder& builder,
×
17
                                       analysis::AnalysisManager& analysis_manager) {
UNCOV
18
    bool applied = false;
×
19

UNCOV
20
    auto& sdfg = builder.subject();
×
UNCOV
21
    auto& users = analysis_manager.get<analysis::Users>();
×
UNCOV
22
    for (auto& name : sdfg.containers()) {
×
23
        // Criterion: Only transients
UNCOV
24
        if (!sdfg.is_transient(name)) {
×
25
            continue;
×
26
        }
UNCOV
27
        if (!users.moves(name).empty() || !users.views(name).empty()) {
×
28
            continue;
×
29
        }
30

31
        // Criterion: Data type must be or contain arrays
UNCOV
32
        std::unique_ptr<types::IType> type = sdfg.type(name).clone();
×
UNCOV
33
        uint depth = 0;
×
UNCOV
34
        bool has_trivial_dimension = false;
×
UNCOV
35
        while (auto atype = dynamic_cast<const types::Array*>(type.get())) {
×
UNCOV
36
            if (symbolic::eq(atype->num_elements(), symbolic::one())) {
×
UNCOV
37
                has_trivial_dimension = true;
×
UNCOV
38
                break;
×
39
            }
UNCOV
40
            type = atype->element_type().clone();
×
UNCOV
41
            depth++;
×
42
        }
43

UNCOV
44
        if (!has_trivial_dimension) {
×
UNCOV
45
            continue;
×
46
        }
47

48
        // Construct new type
UNCOV
49
        auto atype = static_cast<const types::Array*>(type.get());
×
UNCOV
50
        std::unique_ptr<types::IType> inner_type = atype->element_type().clone();
×
51
        std::unique_ptr<types::IType> new_type =
UNCOV
52
            types::recombine_array_type(sdfg.type(name), depth, *inner_type.get());
×
53

54
        // Replace data type
UNCOV
55
        builder.change_type(name, *new_type.get());
×
56

57
        // Replace all reads
UNCOV
58
        for (auto& user : users.reads(name)) {
×
UNCOV
59
            auto access_node = dynamic_cast<data_flow::AccessNode*>(user->element());
×
UNCOV
60
            assert(access_node != nullptr && "Expected AccessNode");
×
61

UNCOV
62
            auto& graph = access_node->get_parent();
×
UNCOV
63
            for (auto& oedge : graph.out_edges(*access_node)) {
×
UNCOV
64
                auto& subset = oedge.subset();
×
UNCOV
65
                subset.erase(subset.begin() + depth);
×
66
            }
67
        }
68
        // Replace all writes
UNCOV
69
        for (auto& user : users.writes(name)) {
×
UNCOV
70
            auto access_node = dynamic_cast<data_flow::AccessNode*>(user->element());
×
UNCOV
71
            assert(access_node != nullptr && "Expected AccessNode");
×
72

UNCOV
73
            auto& graph = access_node->get_parent();
×
UNCOV
74
            for (auto& iedge : graph.in_edges(*access_node)) {
×
UNCOV
75
                auto& subset = iedge.subset();
×
UNCOV
76
                subset.erase(subset.begin() + depth);
×
77
            }
78
        }
79

UNCOV
80
        applied = true;
×
UNCOV
81
    }
×
82

UNCOV
83
    return applied;
×
84
};
×
85

86
}  // namespace passes
87
}  // 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