6 #ifndef JLM_LLVM_IR_TAC_HPP
7 #define JLM_LLVM_IR_TAC_HPP
20 class ThreeAddressCode;
30 const std::
string &
name)
41 static std::unique_ptr<ThreeAddressCodeVariable>
44 std::shared_ptr<const jlm::rvsdg::Type>
type,
45 const std::string &
name)
47 return std::make_unique<ThreeAddressCodeVariable>(
tac, std::move(
type),
name);
60 std::unique_ptr<rvsdg::SimpleOperation>
operation,
64 std::unique_ptr<rvsdg::SimpleOperation>
operation,
66 const std::vector<std::
string> & names);
69 std::unique_ptr<rvsdg::SimpleOperation>
operation,
83 inline const rvsdg::SimpleOperation &
86 return *util::assertedCast<rvsdg::SimpleOperation>(
operation_.get());
119 std::vector<std::unique_ptr<ThreeAddressCodeVariable>>
134 static std::unique_ptr<llvm::ThreeAddressCode>
136 std::unique_ptr<rvsdg::SimpleOperation>
operation,
137 const std::vector<const Variable *> &
operands)
142 static std::unique_ptr<llvm::ThreeAddressCode>
144 std::unique_ptr<rvsdg::SimpleOperation>
operation,
145 const std::vector<const Variable *> &
operands,
146 const std::vector<std::string> & names)
148 return std::make_unique<llvm::ThreeAddressCode>(std::move(
operation),
operands, names);
151 static std::unique_ptr<llvm::ThreeAddressCode>
153 std::unique_ptr<rvsdg::SimpleOperation>
operation,
154 const std::vector<const Variable *> &
operands,
155 std::vector<std::unique_ptr<ThreeAddressCodeVariable>>
results)
157 return std::make_unique<llvm::ThreeAddressCode>(
176 static std::vector<std::string>
180 std::vector<std::string> names;
181 for (
size_t n = 0; n < nnames; n++)
189 std::vector<std::unique_ptr<ThreeAddressCodeVariable>>
results_;
202 typedef std::vector<std::unique_ptr<llvm::ThreeAddressCode>>
tacsvector_t;
229 for (
const auto & tac :
tacs_)
233 tacs_ = std::move(other.tacs_);
241 return tacs_.begin();
247 return tacs_.rbegin();
265 return *
tacs_.insert(it, tac.release());
277 tacs_.push_back(tac.release());
283 tacs_.push_front(tac.release());
302 return ntacs() != 0 ?
tacs_.front() :
nullptr;
311 std::unique_ptr<ThreeAddressCode>
314 std::unique_ptr<ThreeAddressCode> tac(
tacs_.front());
319 std::unique_ptr<ThreeAddressCode>
322 std::unique_ptr<ThreeAddressCode> tac(
tacs_.back());
330 delete tacs_.front();
342 std::list<ThreeAddressCode *>
tacs_;
~ThreeAddressCodeList() noexcept
const_iterator end() const noexcept
const_iterator begin() const noexcept
ThreeAddressCode * first() const noexcept
void append_first(std::unique_ptr< llvm::ThreeAddressCode > tac)
std::unique_ptr< ThreeAddressCode > pop_last() noexcept
ThreeAddressCodeList & operator=(ThreeAddressCodeList &&other) noexcept
void insert_before(const const_iterator &it, ThreeAddressCodeList &tl)
const_reverse_iterator rbegin() const noexcept
ThreeAddressCodeList & operator=(const ThreeAddressCodeList &)=delete
std::unique_ptr< ThreeAddressCode > pop_first() noexcept
std::list< ThreeAddressCode * >::const_reverse_iterator const_reverse_iterator
std::list< ThreeAddressCode * > tacs_
void append_first(ThreeAddressCodeList &tl)
ThreeAddressCode * last() const noexcept
ThreeAddressCode * insert_before(const const_iterator &it, std::unique_ptr< llvm::ThreeAddressCode > tac)
std::list< ThreeAddressCode * >::const_iterator const_iterator
size_t ntacs() const noexcept
void append_last(std::unique_ptr< llvm::ThreeAddressCode > tac)
const_reverse_iterator rend() const noexcept
llvm::ThreeAddressCode * tac_
llvm::ThreeAddressCode * tac() const noexcept
static std::unique_ptr< ThreeAddressCodeVariable > create(llvm::ThreeAddressCode *tac, std::shared_ptr< const jlm::rvsdg::Type > type, const std::string &name)
~ThreeAddressCodeVariable() noexcept override
void create_results(const rvsdg::SimpleOperation &operation, const std::vector< std::string > &names)
const ThreeAddressCodeVariable * result(size_t index) const noexcept
std::unique_ptr< rvsdg::Operation > operation_
std::vector< const Variable * > operands_
static std::unique_ptr< llvm::ThreeAddressCode > create(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands, const std::vector< std::string > &names)
void replace(const rvsdg::SimpleOperation &operation, const std::vector< const Variable * > &operands)
static std::unique_ptr< llvm::ThreeAddressCode > create(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands)
const Variable * operand(size_t index) const noexcept
static std::unique_ptr< llvm::ThreeAddressCode > create(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands, std::vector< std::unique_ptr< ThreeAddressCodeVariable >> results)
void convert(const rvsdg::SimpleOperation &operation, const std::vector< const Variable * > &operands)
size_t nresults() const noexcept
std::vector< std::unique_ptr< ThreeAddressCodeVariable > > results_
static std::string ToAscii(const ThreeAddressCode &threeAddressCode)
const rvsdg::SimpleOperation & operation() const noexcept
std::vector< std::unique_ptr< ThreeAddressCodeVariable > > results()
~ThreeAddressCode() noexcept=default
size_t noperands() const noexcept
static std::vector< std::string > create_names(size_t nnames)
const std::string & name() const noexcept
const jlm::rvsdg::Type & type() const noexcept
const std::shared_ptr< const jlm::rvsdg::Type > Type() const noexcept
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
size_t nresults() const noexcept
Global memory state passed between functions.
std::vector< std::unique_ptr< llvm::ThreeAddressCode > > tacsvector_t
static bool is(const AggregationNode *node)
static std::string type(const Node *n)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
static std::string strfmt(Args... args)