5 #ifndef JLM_LLVM_IR_CFG_HPP
6 #define JLM_LLVM_IR_CFG_HPP
22 class InterProceduralGraphModule;
23 class ThreeAddressCode;
33 const std::
string &
name,
45 const std::string &
name,
46 std::unique_ptr<jlm::rvsdg::Type>
type,
58 static std::unique_ptr<Argument>
60 const std::string &
name,
61 std::shared_ptr<const jlm::rvsdg::Type>
type,
67 static std::unique_ptr<Argument>
68 create(
const std::string &
name, std::shared_ptr<const jlm::rvsdg::Type>
type)
106 std::vector<llvm::Argument *>
148 const std::vector<const Variable *>
221 nodes_.insert(std::move(bb));
228 std::unique_ptr<BasicBlock> up(bb);
229 auto it =
nodes_.find(up);
255 std::vector<std::shared_ptr<const jlm::rvsdg::Type>> arguments;
259 std::vector<std::shared_ptr<const jlm::rvsdg::Type>> results;
266 static std::unique_ptr<ControlFlowGraph>
269 return std::make_unique<ControlFlowGraph>(im);
303 const std::unordered_map<ControlFlowGraphNode *, std::string> & labels);
308 const std::unordered_map<ControlFlowGraphNode *, std::string> & labels);
310 static std::unordered_map<ControlFlowGraphNode *, std::string>
311 CreateLabels(
const std::vector<ControlFlowGraphNode *> & nodes);
316 std::unordered_set<std::unique_ptr<BasicBlock>>
nodes_;
319 std::vector<ControlFlowGraphNode *>
322 std::vector<ControlFlowGraphNode *>
333 std::vector<ControlFlowGraphNode *>
static std::unique_ptr< Argument > create(const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > type)
Argument(const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > type)
~Argument() noexcept override
Argument(const std::string &name, std::unique_ptr< jlm::rvsdg::Type > type, const AttributeSet &attributes)
static std::unique_ptr< Argument > create(const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > type, const AttributeSet &attributes)
const AttributeSet & attributes() const noexcept
ControlFlowGraph & cfg() const noexcept
rvsdg::FunctionType fcttype() const
static std::string ToAscii(const ControlFlowGraph &controlFlowGraph)
static std::unique_ptr< ControlFlowGraph > create(InterProceduralGraphModule &im)
const_iterator begin() const
EntryNode * entry() const noexcept
static ControlFlowGraph::iterator remove_node(ControlFlowGraph::iterator &it)
ControlFlowGraph::iterator find_node(BasicBlock *bb)
ExitNode * exit() const noexcept
std::unique_ptr< EntryNode > entry_
static std::unordered_map< ControlFlowGraphNode *, std::string > CreateLabels(const std::vector< ControlFlowGraphNode * > &nodes)
const_iterator end() const
static std::string CreateTargets(const ControlFlowGraphNode &node, const std::unordered_map< ControlFlowGraphNode *, std::string > &labels)
static util::graph::Graph & toDot(util::graph::Writer &writer, const ControlFlowGraph &controlFlowGraph)
~ControlFlowGraph() noexcept=default
InterProceduralGraphModule & module_
BasicBlock * add_node(std::unique_ptr< BasicBlock > bb)
size_t nnodes() const noexcept
std::unordered_set< std::unique_ptr< BasicBlock > > nodes_
InterProceduralGraphModule & module() const noexcept
util::PtrIterator< BasicBlock, std::unordered_set< std::unique_ptr< BasicBlock > >::iterator > iterator
std::unique_ptr< ExitNode > exit_
util::PtrIterator< const BasicBlock, std::unordered_set< std::unique_ptr< BasicBlock > >::const_iterator > const_iterator
llvm::Argument * append_argument(std::unique_ptr< llvm::Argument > arg)
size_t narguments() const noexcept
std::vector< llvm::Argument * > arguments() const noexcept
std::vector< std::unique_ptr< llvm::Argument > > arguments_
const llvm::Argument * argument(size_t index) const
~EntryNode() noexcept override
std::vector< const Variable * > results_
const Variable * result(size_t index) const
const std::vector< const Variable * > results() const noexcept
~ExitNode() noexcept override
void append_result(const Variable *v)
size_t nresults() const noexcept
const std::string & name() const noexcept
const jlm::rvsdg::Type & type() const noexcept
const std::shared_ptr< const jlm::rvsdg::Type > Type() const noexcept
Global memory state passed between functions.
std::vector< ControlFlowGraphNode * > breadth_first(const ControlFlowGraph &cfg)
std::vector< ControlFlowGraphNode * > postorder(const ControlFlowGraph &cfg)
size_t ntacs(const AggregationNode &root)
std::vector< ControlFlowGraphNode * > reverse_postorder(const ControlFlowGraph &cfg)