17 for (
const auto & tac : tacs_)
24 const std::vector<const Variable *> &
operands)
29 for (
size_t n = 0; n <
operands.size(); n++)
34 operation.
argument(n)->debug_string());
41 const std::vector<std::unique_ptr<ThreeAddressCodeVariable>> & results)
43 if (results.size() != operation.
nresults())
46 for (
size_t n = 0; n < results.size(); n++)
48 if (results[n]->
type() != *operation.
result(n))
54 std::unique_ptr<rvsdg::SimpleOperation> operation,
55 const std::vector<const Variable *> &
operands)
57 operation_(std::move(operation))
66 std::unique_ptr<rvsdg::SimpleOperation> operation,
67 const std::vector<const Variable *> &
operands,
68 const std::vector<std::string> & names)
70 operation_(std::move(operation))
74 if (names.size() != this->operation().nresults())
75 throw util::Error(
"Invalid number of result names.");
81 std::unique_ptr<rvsdg::SimpleOperation> operation,
82 const std::vector<const Variable *> &
operands,
83 std::vector<std::unique_ptr<ThreeAddressCodeVariable>> results)
85 operation_(std::move(operation)),
86 results_(std::move(results))
95 const std::vector<const Variable *> &
operands)
110 const std::vector<const Variable *> &
operands)
122 std::string resultString;
123 for (
size_t n = 0; n < threeAddressCode.
nresults(); n++)
126 if (n != threeAddressCode.
nresults() - 1)
127 resultString +=
", ";
130 std::string operandString;
131 for (
size_t n = 0; n < threeAddressCode.
noperands(); n++)
134 if (n != threeAddressCode.
noperands() - 1)
135 operandString +=
", ";
139 std::string resultOperationSeparator = resultString.empty() ?
"" :
" = ";
140 std::string operationOperandSeparator = operandString.empty() ?
"" :
" ";
141 return resultString + resultOperationSeparator + operationString + operationOperandSeparator
~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_
void replace(const rvsdg::SimpleOperation &operation, const std::vector< const Variable * > &operands)
ThreeAddressCode(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands)
const Variable * operand(size_t index) const noexcept
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
size_t noperands() const noexcept
static std::vector< std::string > create_names(size_t nnames)
virtual std::string debug_string() const
virtual std::string debug_string() const =0
virtual std::unique_ptr< Operation > copy() const =0
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
size_t nresults() const noexcept
size_t narguments() const noexcept
Global memory state passed between functions.
static void check_operands(const rvsdg::SimpleOperation &operation, const std::vector< const Variable * > &operands)
static void check_results(const rvsdg::SimpleOperation &operation, const std::vector< std::unique_ptr< ThreeAddressCodeVariable >> &results)
static std::string type(const Node *n)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)