29 std::vector<jlm::rvsdg::SimpleNode *> & load_nodes,
30 std::vector<jlm::rvsdg::SimpleNode *> & store_nodes,
31 std::unordered_set<jlm::rvsdg::Output *> & visited)
37 if (visited.count(
op))
43 for (
auto &
user :
op->Users())
63 for (
auto & arg :
sti->arguments)
95 for (
size_t i = 1;
i < 3; ++
i)
97 auto arg =
muxNode->input(
i)->origin();
100 auto res =
ba->result();
109 for (
size_t j = 0;
j < 2; ++
j)
154 auto loop_node = jlm::util::assertedCast<jlm::hls::LoopNode>(
sti->node());
192 auto op = &
sn->GetOperation();
201 for (
size_t i = 0;
i <
sn->noutputs(); ++
i)
272 for (
size_t i = 0;
i <
msso->nresults(); ++
i)
332 JLM_ASSERT(
"Decoupled nodes not implemented yet");
368 return user.origin();
372 auto op = &
sn->GetOperation();
377 for (
size_t i = 0;
i <
sn->noutputs(); ++
i)
386 return sn->output(0);
392 return sn->output(0);
418 std::vector<jlm::rvsdg::SimpleNode *> load_nodes;
419 std::vector<jlm::rvsdg::SimpleNode *> store_nodes;
420 std::unordered_set<jlm::rvsdg::Output *> visited;
432 for (
size_t i = 0;
i < load_nodes.size(); ++
i)
434 auto load = load_nodes[
i];
455 for (
size_t j = 0;
j < store_nodes.size(); ++
j)
478 const auto rootRegion = &graph.GetRootRegion();
481 throw std::logic_error(
"Root should have only one node now");
487 throw std::logic_error(
"Node needs to be a lambda");
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
~AddressQueueInsertion() noexcept override
static jlm::rvsdg::Output * create(jlm::rvsdg::Output &check, jlm::rvsdg::Output &enq, jlm::rvsdg::Output &deq, bool combinatorial, size_t capacity=10)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &predicate, jlm::rvsdg::Output &value, bool loop=false)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &predicate, const std::vector< jlm::rvsdg::Output * > &alternatives, bool discarding, bool loop=false)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &value)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, const std::vector< jlm::rvsdg::Output * > &states)
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *address, const Variable *state, std::shared_ptr< const rvsdg::Type > loadedType, size_t alignment)
static rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static std::vector< rvsdg::Output * > Create(rvsdg::Output &operand, const size_t numResults)
Represents the result of a region.
StructuralOutput * output() const noexcept
#define JLM_UNREACHABLE(msg)
static void find_load_store(jlm::rvsdg::Output *op, std::vector< jlm::rvsdg::SimpleNode * > &load_nodes, std::vector< jlm::rvsdg::SimpleNode * > &store_nodes, std::unordered_set< jlm::rvsdg::Output * > &visited)
rvsdg::Output * route_to_region_rhls(rvsdg::Region *target, rvsdg::Output *out)
jlm::rvsdg::Output * process_loops(jlm::rvsdg::Output *state_edge)
static rvsdg::StructuralOutput * find_loop_output(jlm::rvsdg::StructuralInput *sti)
static rvsdg::Output * separate_load_edge(jlm::rvsdg::Output *mem_edge, jlm::rvsdg::Output *addr_edge, jlm::rvsdg::SimpleNode **load, jlm::rvsdg::Output **new_mem_edge, std::vector< jlm::rvsdg::Output * > &store_addresses, std::vector< jlm::rvsdg::Output * > &store_dequeues, std::vector< bool > &store_precedes, bool *load_encountered)
static void mem_queue(rvsdg::RvsdgModule &rvsdgModule)
void convert_loop_state_to_lcb(rvsdg::Input *loop_state_input)
rvsdg::Output & GetMemoryStateRegionArgument(const rvsdg::LambdaNode &lambdaNode) noexcept
static void remove(Node *node)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.