17 std::vector<const jlm::llvm::InterProceduralGraphNode *> & node_stack,
19 std::vector<std::unordered_set<const jlm::llvm::InterProceduralGraphNode *>> & sccs)
21 map.emplace(node, std::make_pair(index, index));
22 node_stack.push_back(node);
25 for (
auto callee : *node)
27 if (map.find(callee) == map.end())
31 map[node].second = std::min(map[node].second, map[callee].second);
33 else if (std::find(node_stack.begin(), node_stack.end(), callee) != node_stack.end())
36 map[node].second = std::min(map[node].second, map[callee].first);
40 if (map[node].second == map[node].first)
42 std::unordered_set<const jlm::llvm::InterProceduralGraphNode *> scc;
46 w = node_stack.back();
47 node_stack.pop_back();
61 nodes_.push_back(std::move(node));
64 std::vector<std::unordered_set<const InterProceduralGraphNode *>>
67 std::vector<std::unordered_set<const InterProceduralGraphNode *>> sccs;
69 std::unordered_map<const InterProceduralGraphNode *, std::pair<size_t, size_t>> map;
70 std::vector<const InterProceduralGraphNode *> node_stack;
73 for (
auto & node : *
this)
75 if (map.find(&node) == map.end())
85 for (
auto & node : nodes_)
87 if (node->name() == name)
110 std::shared_ptr<const jlm::rvsdg::Type>
125 return cfg() !=
nullptr;
132 throw util::Error(
"CFG does not match the function node's type.");
154 std::shared_ptr<const rvsdg::Type>
rvsdg::FunctionType fcttype() const
std::shared_ptr< const jlm::rvsdg::Type > Type() const override
const llvm::Linkage & linkage() const noexcept override
const DataNodeInit * initialization() const noexcept
const PointerType & type() const noexcept override
bool hasBody() const noexcept override
const jlm::rvsdg::Type & type() const noexcept override
const rvsdg::FunctionType & fcttype() const noexcept
std::shared_ptr< const rvsdg::FunctionType > FunctionType_
void add_cfg(std::unique_ptr< ControlFlowGraph > cfg)
Adds cfg to the function node. If the function node already has a CFG, then it is replaced with cfg.
std::unique_ptr< ControlFlowGraph > cfg_
bool hasBody() const noexcept override
const llvm::Linkage & linkage() const noexcept override
llvm::ControlFlowGraph * cfg() const noexcept
std::shared_ptr< const jlm::rvsdg::Type > Type() const override
~FunctionVariable() noexcept override
virtual ~InterProceduralGraphNode() noexcept
std::vector< std::unordered_set< const InterProceduralGraphNode * > > find_sccs() const
const InterProceduralGraphNode * find(const std::string &name) const noexcept
std::vector< std::unique_ptr< InterProceduralGraphNode > > nodes_
void add_node(std::unique_ptr< InterProceduralGraphNode > node)
static std::shared_ptr< const PointerType > Create()
static void strongconnect(const jlm::llvm::InterProceduralGraphNode *node, std::unordered_map< const jlm::llvm::InterProceduralGraphNode *, std::pair< size_t, size_t >> &map, std::vector< const jlm::llvm::InterProceduralGraphNode * > &node_stack, size_t &index, std::vector< std::unordered_set< const jlm::llvm::InterProceduralGraphNode * >> &sccs)
Global memory state passed between functions.
static void strongconnect(ControlFlowGraphNode *node, ControlFlowGraphNode *exit, std::unordered_map< ControlFlowGraphNode *, std::pair< size_t, size_t >> &map, std::vector< ControlFlowGraphNode * > &node_stack, size_t &index, std::vector< StronglyConnectedComponent > &sccs)