34 std::vector<rvsdg::SimpleNode *> &
mem_ops,
63 auto si = util::assertedCast<rvsdg::StructuralInput>(
state_edge);
64 auto arg =
si->arguments.begin().ptr();
65 std::vector<rvsdg::SimpleNode *>
mem_ops;
77 new_in->arguments.begin().ptr(),
105 for (
size_t i = 0;
i <
sn->noutputs(); ++
i)
125 return sn->output(0);
145 for (
size_t i = 0;
i <
sn->noutputs(); ++
i)
148 std::vector<rvsdg::SimpleNode *>
mem_ops;
170 return sn->output(0);
207 std::vector<rvsdg::SimpleNode *> &
mem_ops,
245 std::vector<rvsdg::Output *>
operands(
258 std::vector<rvsdg::SimpleNode *> &
mem_ops,
283 std::vector<rvsdg::SimpleNode *> &
mem_ops,
319 auto si = jlm::util::assertedCast<rvsdg::StructuralInput>(
state_edge);
320 auto arg =
si->arguments.begin().ptr();
345 for (
size_t i = 0;
i <
sn->noutputs(); ++
i)
367 return sn->output(0);
384 for (
size_t i = 0;
i <
sn->noutputs(); ++
i)
400 return sn->output(0);
443 auto arg =
si->arguments.begin().ptr();
460 const auto rootRegion = &graph.GetRootRegion();
463 throw std::logic_error(
"Root should have only one node now");
469 throw std::logic_error(
"Node needs to be a lambda");
496 std::vector<rvsdg::SimpleNode *>
mem_ops;
497 std::vector<std::tuple<rvsdg::SimpleNode *, rvsdg::Input *>>
dummy;
static jlm::util::StatisticsCollector statisticsCollector
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, jlm::rvsdg::Output &value)
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
~MemoryStateDecoupling() noexcept override
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &predicate, const std::vector< jlm::rvsdg::Output * > &alternatives, bool discarding, bool loop=false)
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.
#define JLM_UNREACHABLE(msg)
static rvsdg::Output * follow_state_edge(rvsdg::Input *state_edge, std::vector< rvsdg::SimpleNode * > &mem_ops, bool modify)
static void handle_structural(std::vector< std::tuple< rvsdg::SimpleNode *, rvsdg::Input * > > &outstanding_dec_reqs, std::vector< rvsdg::SimpleNode * > &mem_ops, rvsdg::Input *state_edge_before, rvsdg::Output *state_edge_after)
bool is_dec_res(rvsdg::SimpleNode *node)
const llvm::IntegerConstantOperation * trace_constant(const rvsdg::Output *dst)
static void optimize_single_mem_op_loop(std::vector< rvsdg::SimpleNode * > &mem_ops, rvsdg::Input *state_edge_before, rvsdg::Output *state_edge_after)
static void decouple_mem_state(rvsdg::RvsdgModule &rvsdgModule)
rvsdg::Input * get_mem_state_user(rvsdg::Output *state_edge)
static rvsdg::Output * trace_edge(rvsdg::Input *state_edge, rvsdg::Output *new_edge, rvsdg::SimpleNode *target_call, rvsdg::Output *end)
bool is_dec_req(rvsdg::SimpleNode *node)
void convert_loop_state_to_lcb(rvsdg::Input *loop_state_input)
rvsdg::SimpleNode * tryGetMemoryStateEntrySplit(const rvsdg::LambdaNode &lambdaNode) noexcept
rvsdg::SimpleNode * tryGetMemoryStateExitMerge(const rvsdg::LambdaNode &lambdaNode) noexcept
rvsdg::Output & GetMemoryStateRegionArgument(const rvsdg::LambdaNode &lambdaNode) noexcept
static void remove(Node *node)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
@ State
Designate a state type.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.