25std::vector<rvsdg::LambdaNode::ContextVar>
28 std::vector<rvsdg::LambdaNode::ContextVar> result;
34 auto arg = util::assertedCast<const llvm::LlvmGraphImport>(
traced);
47 std::vector<rvsdg::SimpleNode *> &
calls,
48 std::unordered_set<rvsdg::Output *> & visited)
50 if (visited.count(output))
55 visited.insert(output);
62 rvsdg::MatchTypeOrFail(
64 [&](rvsdg::SimpleNode & simplenode)
66 rvsdg::MatchTypeWithDefault(
67 simplenode.GetOperation(),
68 [&](const llvm::CallOperation &)
71 calls.push_back(&simplenode);
75 for (size_t i = 0; i < simplenode.noutputs(); ++i)
77 trace_function_calls(simplenode.output(i), calls, visited);
83 trace_function_calls(loop.mapInput(user).inner, calls, visited);
87 trace_function_calls(theta.MapInputLoopVar(user).pre, calls, visited);
93 [&](const rvsdg::GammaNode::MatchVar &)
98 for (auto out : evar.branchArgument)
100 trace_function_calls(out, calls, visited);
105 [&](rvsdg::Region * region)
107 rvsdg::MatchTypeOrFail(
112 loop.mapResult(user),
113 [&](const LoopNode::BackEdgeVar & backedge)
115 trace_function_calls(backedge.pre, calls, visited);
117 [&](
const LoopNode::ExitVar & exit)
119 trace_function_calls(exit.output, calls, visited);
122 [&](rvsdg::ThetaNode & theta)
125 theta.mapResult(user),
126 [&](
const rvsdg::ThetaNode::LoopVar & loopvar)
128 trace_function_calls(loopvar.output, calls, visited);
130 [&](
const rvsdg::ThetaNode::PredicateVar &)
134 [&](rvsdg::GammaNode & gamma)
142const llvm::IntegerConstantOperation *
150 auto [constantNode, constantOperation] =
151 rvsdg::TryGetSimpleNodeAndOptionalOp<llvm::IntegerConstantOperation>(*dst);
154 if (constantOperation)
155 return constantOperation;
157 for (
size_t i = 0; i < constantNode->ninputs(); ++i)
160 if (*constantNode->input(i)->Type() == *dst->
Type())
176 JLM_ASSERT(target_regions.front() == out_regions.front());
179 while (!target_regions.empty() && !out_regions.empty()
180 && target_regions.front() == out_regions.front())
182 common_region = target_regions.front();
183 target_regions.pop_front();
184 out_regions.pop_front();
188 auto common_loop =
dynamic_cast<LoopNode *
>(common_region->
node());
203 target_regions.empty() || target_regions.front()->node()->region() == common_out->
region());
211 if (response->
region() == target)
218 auto ln = util::assertedCast<LoopNode>(target->
node());
219 return ln->addResponseInput(parent_response);
226 if (request->
region() == target)
231 auto ln = util::assertedCast<LoopNode>(request->
region()->
node());
232 auto output = ln->addRequestOutput(request);
237std::deque<rvsdg::Region *>
240 std::deque<rvsdg::Region *> regions;
244 regions.push_front(target_region);
245 target_region = target_region->
node()->
region();
247 regions.push_front(target_region);
254 return rvsdg::MatchVariant(
258 if (region->IsRootRegion())
262 return rvsdg::MatchTypeOrFail(
267 if (dynamic_cast<const BackEdgeArgument *>(output))
277 if (
dynamic_cast<const BackEdgeArgument *
>(output))
282 return trace_call_rhls(
dynamic_cast<const rvsdg::RegionArgument *
>(output)->input());
285 [&](rvsdg::Node * node) ->
const rvsdg::Output *
287 return rvsdg::MatchTypeOrFail(
289 [&](LoopNode & loop) ->
const rvsdg::Output *
292 auto so =
dynamic_cast<const rvsdg::StructuralOutput *
>(output);
293 for (
auto & r : so->results)
302 [&](rvsdg::StructuralNode & structural) ->
const rvsdg::Output *
305 auto so =
dynamic_cast<const rvsdg::StructuralOutput *
>(output);
306 for (
auto & r : so->results)
315 [&](rvsdg::SimpleNode & simple) ->
const rvsdg::Output *
317 for (
auto & input : simple.Inputs())
319 if (*input.Type() == *output->Type())
345 auto arg = util::assertedCast<const llvm::LlvmGraphImport>(traced);
354 auto arg = jlm::util::assertedCast<const jlm::llvm::LlvmGraphImport>(traced);
364 if (name.rfind(
"decouple_req") != name.npos)
376 if (name.rfind(
"decouple_res") != name.npos)
400 if (ra->input() && rvsdg::TryGetOwnerNode<LoopNode>(*ra->input()))
412 JLM_ASSERT(rvsdg::TryGetOwnerNode<LoopNode>(*out));
416 JLM_ASSERT(rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*out));
BackEdgeResult * result()
BackEdgeArgument * add_backedge(std::shared_ptr< const jlm::rvsdg::Type > type)
Conditional operator / pattern matching.
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
virtual const Operation & GetOperation() const noexcept=0
rvsdg::Region * region() const noexcept
rvsdg::Input & SingleUser() noexcept
rvsdg::Region * region() const noexcept
std::variant< Node *, Region * > GetOwner() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
size_t nusers() const noexcept
Represents the argument of a region.
Represent acyclic RVSDG subgraphs.
rvsdg::StructuralNode * node() const noexcept
const SimpleOperation & GetOperation() const noexcept override
NodeInput * input(size_t index) const noexcept
#define JLM_UNREACHABLE(msg)
rvsdg::Output * route_response_rhls(rvsdg::Region *target, rvsdg::Output *response)
void trace_function_calls(rvsdg::Output *output, std::vector< rvsdg::SimpleNode * > &calls, std::unordered_set< rvsdg::Output * > &visited)
std::deque< rvsdg::Region * > get_parent_regions(rvsdg::Region *region)
rvsdg::Output * FindSourceNode(rvsdg::Output *out)
bool is_function_argument(const rvsdg::LambdaNode::ContextVar &cv)
rvsdg::Output * route_request_rhls(rvsdg::Region *target, rvsdg::Output *request)
bool is_dec_res(rvsdg::SimpleNode *node)
std::string get_function_name(jlm::rvsdg::Input *input)
rvsdg::Output * route_to_region_rhls(rvsdg::Region *target, rvsdg::Output *out)
const llvm::IntegerConstantOperation * trace_constant(const rvsdg::Output *dst)
const rvsdg::Output * trace_call_rhls(const rvsdg::Output *output)
rvsdg::Input * get_mem_state_user(rvsdg::Output *state_edge)
std::vector< rvsdg::LambdaNode::ContextVar > find_function_arguments(const rvsdg::LambdaNode *lambda, std::string name_contains)
bool is_dec_req(rvsdg::SimpleNode *node)
decltype(auto) MatchVariant(T &&obj, Fns &&... fns)
Pattern match over variant.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
A variable routed into all gamma regions.
rvsdg::Input * input
Input variable bound into lambda node.