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

daisytuner / sdfglib / 17124488572

21 Aug 2025 10:38AM UTC coverage: 61.119% (-0.2%) from 61.329%
17124488572

Pull #209

github

web-flow
Merge 133ebbb48 into cf937daf1
Pull Request #209: adds byte reference elimination pass

4 of 59 new or added lines in 2 files covered. (6.78%)

16 existing lines in 1 file now uncovered.

9353 of 15303 relevant lines covered (61.12%)

118.95 hits per line

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

5.17
/src/passes/dataflow/byte_reference_elimination.cpp
1
#include "sdfg/passes/dataflow/byte_reference_elimination.h"
2

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

6
namespace sdfg {
7
namespace passes {
8

9
ByteReferenceElimination::ByteReferenceElimination()
1✔
10
    : Pass() {
1✔
11

12
      };
1✔
13

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

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

NEW
20
    auto& sdfg = builder.subject();
×
NEW
21
    auto& users = analysis_manager.get<analysis::Users>();
×
22

NEW
23
    for (auto& name : sdfg.containers()) {
×
NEW
24
        if (!sdfg.is_transient(name)) {
×
NEW
25
            continue;
×
26
        }
NEW
27
        if (!dynamic_cast<const types::Pointer*>(&sdfg.type(name))) {
×
NEW
28
            continue;
×
29
        }
NEW
30
        auto views = users.views(name);
×
NEW
31
        auto moves = users.moves(name);
×
NEW
32
        if (moves.size() != 1) {
×
NEW
33
            continue;
×
34
        }
NEW
35
        auto move = *moves.begin();
×
NEW
36
        auto move_node = dynamic_cast<data_flow::AccessNode*>(move->element());
×
NEW
37
        auto& move_graph = move_node->get_parent();
×
NEW
38
        auto& move_edge = *move_graph.in_edges(*move_node).begin();
×
NEW
39
        auto& move_type = move_edge.base_type();
×
NEW
40
        if (move_type.type_id() != types::TypeID::Pointer) {
×
NEW
41
            continue;
×
42
        }
NEW
43
        auto& move_pointer_type = static_cast<const types::Pointer&>(move_type);
×
NEW
44
        auto& move_pointee_type = move_pointer_type.pointee_type();
×
NEW
45
        auto move_pointee_type_bytes = types::get_type_size(move_pointee_type);
×
NEW
46
        if (move_pointee_type_bytes == SymEngine::null) {
×
NEW
47
            continue;
×
48
        }
49

NEW
50
        for (auto& view : views) {
×
NEW
51
            auto view_node = dynamic_cast<data_flow::AccessNode*>(view->element());
×
NEW
52
            if (!users.dominates(*move, *view)) {
×
NEW
53
                continue;
×
54
            }
55

NEW
56
            auto& view_graph = view_node->get_parent();
×
NEW
57
            auto& view_edge = *view_graph.out_edges(*view_node).begin();
×
NEW
58
            auto& view_type = view_edge.base_type();
×
NEW
59
            if (view_type.type_id() != types::TypeID::Pointer) {
×
NEW
60
                continue;
×
61
            }
62

63
            // Criterion: View must do address calculation in bytes
NEW
64
            auto& view_pointer_type = static_cast<const types::Pointer&>(view_type);
×
NEW
65
            auto& view_pointee_type = view_pointer_type.pointee_type();
×
NEW
66
            if (view_pointee_type.type_id() != types::TypeID::Scalar) {
×
NEW
67
                continue;
×
68
            }
NEW
69
            if (view_pointee_type.primitive_type() != types::PrimitiveType::Int8) {
×
NEW
70
                continue;
×
71
            }
NEW
72
            if (view_edge.subset().size() != 1) {
×
NEW
73
                continue;
×
74
            }
NEW
75
            auto offset = view_edge.subset().at(0);
×
NEW
76
            if (!SymEngine::is_a<SymEngine::Integer>(*offset)) {
×
NEW
77
                continue;
×
78
            }
NEW
79
            auto offset_int = SymEngine::rcp_static_cast<const SymEngine::Integer>(offset);
×
80

81
            // Convert bytes into elements
NEW
82
            auto offset_elements = symbolic::div(offset_int, move_pointee_type_bytes);
×
NEW
83
            view_edge.set_subset({offset_elements});
×
NEW
84
            view_edge.set_base_type(move_pointer_type);
×
85

NEW
86
            applied = true;
×
NEW
87
        }
×
NEW
88
    }
×
89

NEW
90
    return applied;
×
NEW
91
};
×
92

93
} // namespace passes
94
} // 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