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

daisytuner / docc / 28158800507

25 Jun 2026 08:57AM UTC coverage: 61.644% (+0.06%) from 61.582%
28158800507

push

github

web-flow
MapFusionByDomain (#771)

 + New Map fusion caches data about iteration domain and map candidates
 + only matches up iteration domain exactly, per loop level.
 + Can support fusing non-leaf stacks of loops (stack ends where the shallower stack stops being perfectly nested & parallel)
 + new Element::replace for bulk replacements
 + New PatternMatcher visitor supports descending into replaced or modified nodes to allow for single-pass nested loop fusings
 + LoopAnalysis can now be kept up-to-date with changes done by Map-fusion
 + unit tests for the updating of LoopAnalysis
 * updated LoopAnalysis to be easier to keep up-to-date with changes. LoopTree is no longer ordered, if you want to iterate in pre-order, use the specific method for that
 + convenience StructuredSDFGBuilder.remove_from_parent()
 + RedundantLoadElim pass to skip reading from memory locations that have just been written (same block). Fusing no longer needs to do this
     RedundantLoadElimination does a simple check for other writes to the same structure. Can skip writes if redundant or not modify, if their are writes to different indices
* Updated verifiers to match new fusion
~ moved verifier checks behind correctness checks in npbench harness. Its more critical if we do not even get the expected results
* Added MapFusionByDomain also to loop-norm stage (currently inactive, causes more kernels that currently cannot be safely offloaded to CUDA.
---------

Co-authored-by: Lukas Truemper <lukas.truemper@outlook.de>

771 of 1186 new or added lines in 55 files covered. (65.01%)

6 existing lines in 6 files now uncovered.

38302 of 62134 relevant lines covered (61.64%)

987.24 hits per line

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

0.0
/sdfg/src/data_flow/library_nodes/stdlib/unreachable.cpp
1
#include "sdfg/data_flow/library_nodes/stdlib/unreachable.h"
2

3
namespace sdfg {
4
namespace stdlib {
5

6
UnreachableNode::UnreachableNode(
7
    size_t element_id, const DebugInfo& debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph& parent
8
)
9
    : StdlibNode(
×
10
          element_id,
×
11
          debug_info,
×
12
          vertex,
×
13
          parent,
×
14
          LibraryNodeType_Unreachable,
×
15
          {},
×
16
          {},
×
17
          true,
×
18
          data_flow::ImplementationType_NONE
×
19
      ) {}
×
20

21
void UnreachableNode::validate(const Function& function) const { LibraryNode::validate(function); }
×
22

23
symbolic::SymbolSet UnreachableNode::symbols() const { return symbolic::SymbolSet(); }
×
24

25
std::unique_ptr<data_flow::DataFlowNode> UnreachableNode::
26
    clone(size_t element_id, const graph::Vertex vertex, data_flow::DataFlowGraph& parent) const {
×
27
    return std::make_unique<UnreachableNode>(element_id, debug_info_, vertex, parent);
×
28
}
×
29

30
void UnreachableNode::replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression) {
×
31
    this->size_ = symbolic::subs(this->size_, old_expression, new_expression);
×
32
}
×
33

NEW
34
void UnreachableNode::replace(const symbolic::ExpressionMapping& replacements) {
×
NEW
35
    this->size_ = symbolic::subs(this->size_, replacements);
×
NEW
36
}
×
37

38
nlohmann::json UnreachableNodeSerializer::serialize(const data_flow::LibraryNode& library_node) {
×
39
    const UnreachableNode& node = static_cast<const UnreachableNode&>(library_node);
×
40

41
    nlohmann::json j;
×
42
    j["code"] = node.code().value();
×
43

44
    return j;
×
45
}
×
46

47
data_flow::LibraryNode& UnreachableNodeSerializer::deserialize(
48
    const nlohmann::json& j, builder::StructuredSDFGBuilder& builder, structured_control_flow::Block& parent
49
) {
×
50
    assert(j.contains("code"));
×
51
    assert(j.contains("debug_info"));
×
52

53
    auto code = j["code"].get<std::string>();
×
54
    if (code != LibraryNodeType_Unreachable.value()) {
×
55
        throw InvalidSDFGException("Invalid library node code");
×
56
    }
×
57

58
    sdfg::serializer::JSONSerializer serializer;
×
59
    DebugInfo debug_info = serializer.json_to_debug_info(j["debug_info"]);
×
60

61
    return builder.add_library_node<UnreachableNode>(parent, debug_info);
×
62
}
×
63

64
UnreachableNodeDispatcher::UnreachableNodeDispatcher(
65
    codegen::LanguageExtension& language_extension,
66
    const Function& function,
67
    const data_flow::DataFlowGraph& data_flow_graph,
68
    const UnreachableNode& node
69
)
70
    : codegen::LibraryNodeDispatcher(language_extension, function, data_flow_graph, node) {}
×
71

72
void UnreachableNodeDispatcher::dispatch_code(
73
    codegen::PrettyPrinter& stream,
74
    codegen::PrettyPrinter& globals_stream,
75
    codegen::CodeSnippetFactory& library_snippet_factory
76
) {
×
77
    auto& node = static_cast<const UnreachableNode&>(node_);
×
78

79
    stream << "__builtin_unreachable()" << ";";
×
80
    stream << std::endl;
×
81
}
×
82

83
} // namespace stdlib
84
} // 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