![]() |
ArkScript
A small, lisp-inspired, functional scripting language
|
#include <IROptimizer.hpp>
Classes | |
struct | Rule |
Public Member Functions | |
IROptimizer (unsigned debug) | |
Create a new IROptimizer. | |
void | process (const std::vector< IR::Block > &pages, const std::vector< std::string > &symbols, const std::vector< ValTableElem > &values) |
Turn a given IR into bytecode. | |
const std::vector< IR::Block > & | intermediateRepresentation () const noexcept |
Return the IR blocks (one per scope) | |
Private Types | |
using | Entities = std::span<const IR::Entity> |
using | Condition_t = std::function<bool(const Entities)> |
using | Replacement_t = std::function<IR::Entity(const Entities)> |
Private Member Functions | |
bool | match (const std::vector< Instruction > &expected_insts, std::span< const IR::Entity > entities) const |
bool | canBeOptimizedSafely (std::span< const IR::Entity > entities, std::size_t window_size) const |
std::optional< EntityWithOffset > | replaceWithRules (const std::vector< Rule > &rules, std::span< const IR::Entity > entities) |
bool | isPositiveNumberInlinable (uint16_t id) const |
uint16_t | numberAsArg (uint16_t id) const |
Private Attributes | |
std::vector< Rule > | m_ruleset |
Logger | m_logger |
std::vector< IR::Block > | m_ir |
std::vector< std::string > | m_symbols |
std::vector< ValTableElem > | m_values |
Definition at line 30 of file IROptimizer.hpp.
|
private |
Definition at line 58 of file IROptimizer.hpp.
|
private |
Definition at line 57 of file IROptimizer.hpp.
|
private |
Definition at line 59 of file IROptimizer.hpp.
|
explicit |
Create a new IROptimizer.
debug | debug level |
Definition at line 12 of file IROptimizer.cpp.
References Ark::internal::ADD, Ark::internal::APPEND_IN_PLACE, Ark::internal::APPEND_IN_PLACE_SYM, Ark::internal::APPEND_IN_PLACE_SYM_INDEX, Ark::internal::AT, Ark::internal::AT_SYM_INDEX_SYM_INDEX, Ark::internal::AT_SYM_SYM, Ark::internal::BUILTIN, Ark::internal::Builtins::builtins, Ark::internal::CALL, Ark::internal::CALL_BUILTIN, Ark::internal::CALL_BUILTIN_WITHOUT_RETURN_ADDRESS, Ark::internal::CALL_CURRENT_PAGE, Ark::internal::CALL_SYMBOL, Ark::internal::CHECK_TYPE_OF, Ark::internal::CHECK_TYPE_OF_BY_INDEX, Ark::internal::DECREMENT, Ark::internal::DECREMENT_BY_INDEX, Ark::internal::DECREMENT_STORE, Ark::internal::EQ, Ark::internal::EQ_CONST_JUMP_IF_TRUE, Ark::internal::EQ_SYM_INDEX_JUMP_IF_TRUE, Ark::internal::GET_CURRENT_PAGE_ADDR, Ark::internal::GET_FIELD, Ark::internal::GET_FIELD_FROM_SYMBOL, Ark::internal::GET_FIELD_FROM_SYMBOL_INDEX, Ark::internal::IR::Entity::GotoWithArg(), Ark::internal::GT, Ark::internal::GT_CONST_JUMP_IF_FALSE, Ark::internal::GT_CONST_JUMP_IF_TRUE, Ark::internal::GT_SYM_JUMP_IF_FALSE, Ark::internal::HEAD, Ark::internal::INCREMENT, Ark::internal::INCREMENT_BY_INDEX, Ark::internal::INCREMENT_STORE, isPositiveNumberInlinable(), Ark::internal::LIST, Ark::internal::LOAD_CONST, Ark::internal::LOAD_CONST_LOAD_CONST, Ark::internal::LOAD_CONST_SET_VAL, Ark::internal::LOAD_CONST_STORE, Ark::internal::LOAD_SYMBOL, Ark::internal::LOAD_SYMBOL_BY_INDEX, Ark::internal::LT, Ark::internal::LT_CONST_JUMP_IF_FALSE, Ark::internal::LT_CONST_JUMP_IF_TRUE, Ark::internal::LT_SYM_JUMP_IF_FALSE, m_ruleset, Ark::internal::NEQ, Ark::internal::NEQ_CONST_JUMP_IF_TRUE, Ark::internal::NEQ_SYM_JUMP_IF_FALSE, numberAsArg(), Ark::internal::POP_JUMP_IF_FALSE, Ark::internal::POP_JUMP_IF_TRUE, Ark::internal::PUSH_RETURN_ADDRESS, Ark::internal::SET_VAL, Ark::internal::SET_VAL_FROM, Ark::internal::SET_VAL_FROM_INDEX, Ark::internal::SET_VAL_HEAD, Ark::internal::SET_VAL_HEAD_BY_INDEX, Ark::internal::SET_VAL_TAIL, Ark::internal::SET_VAL_TAIL_BY_INDEX, Ark::internal::STORE, Ark::internal::STORE_FROM, Ark::internal::STORE_FROM_INDEX, Ark::internal::STORE_HEAD, Ark::internal::STORE_HEAD_BY_INDEX, Ark::internal::STORE_LIST, Ark::internal::STORE_TAIL, Ark::internal::STORE_TAIL_BY_INDEX, Ark::internal::SUB, Ark::internal::TAIL, and Ark::internal::TYPE.
|
nodiscardprivate |
Definition at line 258 of file IROptimizer.cpp.
References Ark::internal::IR::MaxValueForDualArg, and Ark::internal::IR::Entity::primaryArg().
Referenced by replaceWithRules().
|
nodiscardnoexcept |
Return the IR blocks (one per scope)
Definition at line 239 of file IROptimizer.cpp.
References m_ir.
Referenced by Ark::Welder::generateBytecode().
|
nodiscardprivate |
Definition at line 293 of file IROptimizer.cpp.
References m_values, Ark::internal::IR::MaxValueForDualArg, and Ark::internal::Number.
Referenced by IROptimizer().
|
nodiscardprivate |
Definition at line 244 of file IROptimizer.cpp.
Referenced by replaceWithRules().
|
nodiscardprivate |
void Ark::internal::IROptimizer::process | ( | const std::vector< IR::Block > & | pages, |
const std::vector< std::string > & | symbols, | ||
const std::vector< ValTableElem > & | values ) |
Turn a given IR into bytecode.
pages | list of lists of IR entities generated by the compiler |
symbols | symbol table generated by the compiler |
values | value table generated by the compiler |
Definition at line 200 of file IROptimizer.cpp.
References m_ir, m_logger, m_ruleset, m_symbols, m_values, replaceWithRules(), Ark::internal::Logger::traceEnd(), and Ark::internal::Logger::traceStart().
Referenced by Ark::Welder::generateBytecode().
|
private |
Definition at line 268 of file IROptimizer.cpp.
References canBeOptimizedSafely(), and match().
Referenced by process().
|
private |
Definition at line 91 of file IROptimizer.hpp.
Referenced by intermediateRepresentation(), and process().
|
private |
Definition at line 90 of file IROptimizer.hpp.
Referenced by process().
|
private |
Definition at line 88 of file IROptimizer.hpp.
Referenced by IROptimizer(), and process().
|
private |
Definition at line 92 of file IROptimizer.hpp.
Referenced by process().
|
private |
Definition at line 93 of file IROptimizer.hpp.
Referenced by isPositiveNumberInlinable(), numberAsArg(), and process().