22 std::vector<rvsdg::LambdaNode::ContextVar>
25 std::vector<rvsdg::LambdaNode::ContextVar> result;
31 auto arg = util::assertedCast<const llvm::LlvmGraphImport>(traced);
33 && arg->Name().find(name_contains) != arg->Name().npos)
44 std::vector<rvsdg::SimpleNode *> & calls,
45 std::unordered_set<rvsdg::Output *> & visited)
47 if (visited.count(output))
52 visited.insert(output);
53 for (
auto & user : output->
Users())
55 if (
auto simplenode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(user))
60 calls.push_back(simplenode);
64 for (
size_t i = 0; i < simplenode->noutputs(); ++i)
72 for (
auto & arg : sti->arguments)
103 auto [constantNode, constantOperation] =
104 rvsdg::TryGetSimpleNodeAndOptionalOp<llvm::IntegerConstantOperation>(*dst);
107 if (constantOperation)
108 return constantOperation;
110 for (
size_t i = 0; i < constantNode->ninputs(); ++i)
113 if (*constantNode->input(i)->Type() == *dst->
Type())
129 JLM_ASSERT(target_regions.front() == out_regions.front());
132 while (!target_regions.empty() && !out_regions.empty()
133 && target_regions.front() == out_regions.front())
135 common_region = target_regions.front();
136 target_regions.pop_front();
137 out_regions.pop_front();
141 auto common_loop =
dynamic_cast<LoopNode *
>(common_region->
node());
156 target_regions.empty() || target_regions.front()->node()->region() == common_out->
region());
164 if (response->
region() == target)
171 auto ln = util::assertedCast<LoopNode>(target->
node());
172 return ln->addResponseInput(parent_response);
179 if (request->
region() == target)
184 auto ln = util::assertedCast<LoopNode>(request->
region()->
node());
185 auto output = ln->addRequestOutput(request);
190 std::deque<rvsdg::Region *>
193 std::deque<rvsdg::Region *> regions;
197 regions.push_front(target_region);
198 target_region = target_region->
node()->
region();
200 regions.push_front(target_region);
211 if (argument->region() == &graph->GetRootRegion())
224 for (
auto & r : so->results)
232 else if (
auto simpleNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*output))
234 for (
size_t i = 0; i < simpleNode->ninputs(); ++i)
236 auto ip = simpleNode->input(i);
237 if (*ip->Type() == *output->
Type())
266 auto arg = util::assertedCast<const llvm::LlvmGraphImport>(traced);
275 auto arg = jlm::util::assertedCast<const jlm::llvm::LlvmGraphImport>(traced);
285 if (name.rfind(
"decouple_req") != name.npos)
297 if (name.rfind(
"decouple_res") != name.npos)
321 if (ra->input() && rvsdg::TryGetOwnerNode<LoopNode>(*ra->input()))
333 JLM_ASSERT(rvsdg::TryGetOwnerNode<LoopNode>(*out));
337 JLM_ASSERT(rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*out));
BackEdgeResult * result()
BackEdgeArgument * add_backedge(std::shared_ptr< const jlm::rvsdg::Type > type)
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
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
size_t nusers() const noexcept
Represents the argument of a region.
Represents the result of a region.
Represent acyclic RVSDG subgraphs.
rvsdg::StructuralNode * node() const noexcept
Graph * graph() 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)
rvsdg::Input * input
Input variable bound into lambda node.