5 #ifndef JLM_LLVM_IR_CFG_HPP
6 #define JLM_LLVM_IR_CFG_HPP
21 class InterProceduralGraphModule;
22 class ThreeAddressCode;
32 const std::
string &
name,
44 const std::string &
name,
45 std::unique_ptr<jlm::rvsdg::Type>
type,
57 static std::unique_ptr<Argument>
59 const std::string &
name,
60 std::shared_ptr<const jlm::rvsdg::Type>
type,
66 static std::unique_ptr<Argument>
67 create(
const std::string &
name, std::shared_ptr<const jlm::rvsdg::Type>
type)
105 std::vector<llvm::Argument *>
147 const std::vector<const Variable *>
220 nodes_.insert(std::move(bb));
227 std::unique_ptr<BasicBlock> up(bb);
228 auto it =
nodes_.find(up);
254 std::vector<std::shared_ptr<const jlm::rvsdg::Type>> arguments;
258 std::vector<std::shared_ptr<const jlm::rvsdg::Type>> results;
265 static std::unique_ptr<ControlFlowGraph>
268 return std::make_unique<ControlFlowGraph>(im);
284 const std::unordered_map<ControlFlowGraphNode *, std::string> & labels);
289 const std::unordered_map<ControlFlowGraphNode *, std::string> & labels);
291 static std::unordered_map<ControlFlowGraphNode *, std::string>
292 CreateLabels(
const std::vector<ControlFlowGraphNode *> & nodes);
297 std::unordered_set<std::unique_ptr<BasicBlock>>
nodes_;
300 std::vector<ControlFlowGraphNode *>
303 std::vector<ControlFlowGraphNode *>
314 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)
~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)