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

daisytuner / sdfglib / 17697974118

13 Sep 2025 02:36PM UTC coverage: 60.51% (+1.2%) from 59.335%
17697974118

Pull #219

github

web-flow
Merge a1c5ecbc6 into 6c1992b40
Pull Request #219: stdlib Library Nodes and ConstantNodes

565 of 1799 new or added lines in 102 files covered. (31.41%)

102 existing lines in 38 files now uncovered.

9442 of 15604 relevant lines covered (60.51%)

107.02 hits per line

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

4.48
/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

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

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

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

23
    for (auto& name : sdfg.containers()) {
×
24
        if (!sdfg.is_transient(name)) {
×
25
            continue;
×
26
        }
27
        if (!dynamic_cast<const types::Pointer*>(&sdfg.type(name))) {
×
28
            continue;
×
29
        }
30
        auto views = users.views(name);
×
31
        auto moves = users.moves(name);
×
32
        if (moves.size() != 1) {
×
33
            continue;
×
34
        }
35
        auto move = *moves.begin();
×
36
        auto move_node = dynamic_cast<data_flow::AccessNode*>(move->element());
×
37
        auto& move_graph = move_node->get_parent();
×
38
        auto& move_edge = *move_graph.in_edges(*move_node).begin();
×
39
        auto& move_type = move_edge.base_type();
×
40
        if (move_type.type_id() != types::TypeID::Pointer) {
×
41
            continue;
×
42
        }
43
        auto& move_pointer_type = static_cast<const types::Pointer&>(move_type);
×
NEW
44
        if (!move_pointer_type.has_pointee_type()) {
×
NEW
45
            continue;
×
46
        }
47
        auto& move_pointee_type = move_pointer_type.pointee_type();
×
48
        if (move_pointee_type.type_id() == types::TypeID::Scalar) {
×
49
            if (move_pointee_type.primitive_type() == types::PrimitiveType::Int8) {
×
50
                continue;
×
51
            }
52
        }
×
53
        auto move_pointee_type_bytes = types::get_type_size(move_pointee_type, false);
×
54
        if (move_pointee_type_bytes.is_null() || !SymEngine::is_a<SymEngine::Integer>(*move_pointee_type_bytes)) {
×
55
            continue;
×
56
        }
57
        auto move_pointee_type_bytes_int = SymEngine::rcp_static_cast<const SymEngine::Integer>(move_pointee_type_bytes
×
58
        );
59

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

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

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

94
            // Convert bytes into elements
95
            auto offset_elements = symbolic::div(offset_int, move_pointee_type_bytes);
×
96
            view_edge.set_subset({offset_elements});
×
97
            view_edge.set_base_type(move_pointer_type);
×
98

99
            applied = true;
×
100
        }
×
101
    }
×
102

103
    return applied;
×
104
};
×
105

106
} // namespace passes
107
} // 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