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

daisytuner / sdfglib / 17125566588

21 Aug 2025 11:28AM UTC coverage: 61.091% (-0.2%) from 61.329%
17125566588

Pull #209

github

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

4 of 66 new or added lines in 2 files covered. (6.06%)

16 existing lines in 1 file now uncovered.

9353 of 15310 relevant lines covered (61.09%)

118.9 hits per line

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

4.62
/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
        if (move_pointee_type.type_id() == types::TypeID::Scalar) {
×
NEW
46
            if (move_pointee_type.primitive_type() == types::PrimitiveType::Int8) {
×
NEW
47
                continue;
×
48
            }
NEW
49
        }
×
NEW
50
        auto move_pointee_type_bytes = types::get_type_size(move_pointee_type, false);
×
NEW
51
        if (!SymEngine::is_a<SymEngine::Integer>(*move_pointee_type_bytes)) {
×
NEW
52
            continue;
×
53
        }
NEW
54
        auto move_pointee_type_bytes_int = SymEngine::rcp_static_cast<const SymEngine::Integer>(move_pointee_type_bytes
×
55
        );
56

NEW
57
        for (auto& view : views) {
×
NEW
58
            auto view_node = dynamic_cast<data_flow::AccessNode*>(view->element());
×
NEW
59
            if (!users.dominates(*move, *view)) {
×
NEW
60
                continue;
×
61
            }
62

NEW
63
            auto& view_graph = view_node->get_parent();
×
NEW
64
            auto& view_edge = *view_graph.out_edges(*view_node).begin();
×
NEW
65
            auto& view_type = view_edge.base_type();
×
NEW
66
            if (view_type.type_id() != types::TypeID::Pointer) {
×
NEW
67
                continue;
×
68
            }
69

70
            // Criterion: View must do address calculation in bytes
NEW
71
            auto& view_pointer_type = static_cast<const types::Pointer&>(view_type);
×
NEW
72
            auto& view_pointee_type = view_pointer_type.pointee_type();
×
NEW
73
            if (view_pointee_type.type_id() != types::TypeID::Scalar) {
×
NEW
74
                continue;
×
75
            }
NEW
76
            if (view_pointee_type.primitive_type() != types::PrimitiveType::Int8) {
×
NEW
77
                continue;
×
78
            }
NEW
79
            if (view_edge.subset().size() != 1) {
×
NEW
80
                continue;
×
81
            }
NEW
82
            auto offset = view_edge.subset().at(0);
×
NEW
83
            if (!SymEngine::is_a<SymEngine::Integer>(*offset)) {
×
NEW
84
                continue;
×
85
            }
NEW
86
            auto offset_int = SymEngine::rcp_static_cast<const SymEngine::Integer>(offset);
×
NEW
87
            if (offset_int->as_int() % move_pointee_type_bytes_int->as_int() != 0) {
×
NEW
88
                continue;
×
89
            }
90

91
            // Convert bytes into elements
NEW
92
            auto offset_elements = symbolic::div(offset_int, move_pointee_type_bytes);
×
NEW
93
            view_edge.set_subset({offset_elements});
×
NEW
94
            view_edge.set_base_type(move_pointer_type);
×
95

NEW
96
            applied = true;
×
NEW
97
        }
×
NEW
98
    }
×
99

NEW
100
    return applied;
×
NEW
101
};
×
102

103
} // namespace passes
104
} // 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