Skip to content

Feat/inliner#705

Merged
SuperFola merged 26 commits into
devfrom
feat/inliner
Jul 21, 2026
Merged

Feat/inliner#705
SuperFola merged 26 commits into
devfrom
feat/inliner

Conversation

@SuperFola

@SuperFola SuperFola commented Jul 19, 2026

Copy link
Copy Markdown
Member

Description

Add an IR inliner to the compiler pipeline.

  • Benchmarks needed.
  • Need to update documentation about the new debugger command, and add a test for it.
  • IR inlining tests needed.
  • Need to update documentation about the compilation process, to reference the inliner.

Checklist

  • I have read the Contributor guide
  • My code follows the style guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • I have updated the documentation if needed (on https://github.com/ArkScript-lang/website, content/docs/)
  • I have added tests that prove my fix/feature is working
  • New and existing tests pass locally with my changes
  • I confirm that I am the author of this code and release it to the ArkScript project under the MPL-2.0 license. This contribution does not contain code from other sources, including code generated by a Large Language Model ("AI").

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown

Static analysis report

Lizard report

Listing only functions with cyclomatic complexity >= 15 or NLOC >= 100 or parameters >= 6.

Filename Start line:end line Function name Parameters NLOC CCN
src/arkreactor/VM/VM.cpp 457:2165 Ark::VM::unsafeRun 2 1437 283
src/arkscript/main.cpp 24:389 main 2 315 43
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 361:440 Ark::internal::ASTLowerer::compileListInstruction 3 64 32
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 212:322 Ark::internal::ASTLowerer::compileExpression 5 92 31
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 891:1039 Ark::internal::ASTLowerer::handleFunctionCall 3 116 31
src/arkreactor/Compiler/IntermediateRepresentation/IRInliner.cpp 267:339 Ark::internal::IRInliner::extractPagesMetadata 1 63 21
src/arkreactor/VM/VM.cpp 2319:2413 Ark::VM::backtrace 3 81 20
src/arkreactor/Compiler/IntermediateRepresentation/IRInliner.cpp 137:198 Ark::internal::IRInliner::isBuiltinProxy 1 48 19
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 520:613 Ark::internal::ASTLowerer::compileFunction 3 67 19
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 837:889 Ark::internal::ASTLowerer::handleOperator 3 42 18
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 107:129 Ark::internal::ASTLowerer::nodeProducesOutput 1 18 17
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 635:683 Ark::internal::ASTLowerer::compileLetMutSet 4 40 17
src/arkreactor/VM/VM.cpp 2177:2234 Ark::VM::throwArityError 4 47 15
src/arkreactor/Compiler/IntermediateRepresentation/IROptimizer.cpp 22:259 Ark::internal::IROptimizer::IROptimizer 1 215 12
Report about files you didn't modify in this PR
Filename Start line:end line Function name Parameters NLOC CCN
src/arkreactor/Compiler/Macros/Processor.cpp 259:643 Ark::internal::MacroProcessor::evaluate 3 353 119
src/arkreactor/Compiler/BytecodeReader.cpp 385:596 Ark::BytecodeReader::display 4 171 92
src/arkreactor/Error/Diagnostics.cpp 45:192 Ark::Diagnostics::makeContext 4 109 44
src/arkreactor/Compiler/AST/Parser.cpp 841:975 Ark::internal::Parser::string 1 131 42
src/arkscript/JsonCompiler.cpp 27:276 JsonCompiler::_compile 1 214 38
src/arkreactor/Compiler/NameResolution/NameResolutionPass.cpp 163:268 Ark::internal::NameResolutionPass::visitKeyword 3 85 35
src/arkreactor/Builtins/Slice.cpp 21:93 Ark::internal::Builtins::slice 1 63 34
src/arkreactor/Compiler/AST/Node.cpp 179:285 Ark::internal::Node::repr 0 90 30
src/arkreactor/Compiler/Macros/Processor.cpp 107:191 Ark::internal::MacroProcessor::processNode 3 63 28
src/arkreactor/Compiler/AST/Node.cpp 287:368 Ark::internal::Node::debugPrint 1 70 26
src/arkreactor/Compiler/BytecodeReader.cpp 612:713 Ark::BytecodeReader::printInstruction 7 98 25
src/arkreactor/TypeChecker.cpp 149:236 Ark::types::generateError 6 75 25
src/arkreactor/Compiler/NameResolution/StaticScope.cpp 70:124 Ark::internal::NamespaceScope::get 3 42 24
src/arkreactor/TypeChecker.cpp 32:147 Ark::types::displayContract 6 102 24
src/arkreactor/Compiler/AST/Parser.cpp 289:417 Ark::internal::Parser::import_ 1 98 23
src/arkreactor/Compiler/NameResolution/NameResolutionPass.cpp 57:161 Ark::internal::NameResolutionPass::visit 2 83 23
include/utf8.hpp 138:184 utf8::isValid 1 44 21
src/arkreactor/VM/Value/Value.cpp 81:149 Ark::Value::toString 2 54 21
src/arkreactor/Compiler/AST/Optimizer.cpp 35:85 Ark::internal::Optimizer::countAndPruneDeadCode 1 42 20
src/arkreactor/Compiler/AST/Optimizer.cpp 87:144 Ark::internal::Optimizer::pruneUnusedGlobalVariables 1 50 18
src/arkreactor/Builtins/String.cpp 47:113 fmt::formatter::parse 1 59 18
src/arkscript/Formatter.cpp 212:274 Formatter::format 3 59 18
src/arkscript/Formatter.cpp 527:585 Formatter::formatCall 2 50 18
src/arkreactor/Compiler/Macros/Executors/Function.cpp 16:89 Ark::internal::FunctionExecutor::applyMacro 2 56 17
include/Ark/Compiler/AST/Predicates.hpp 142:166 Ark::internal::IsSymbol::operator ( ) 1 24 16
src/arkscript/Formatter.cpp 324:366 Formatter::formatFunction 2 36 16
src/arkreactor/Compiler/Macros/Executors/Function.cpp 99:156 Ark::internal::FunctionExecutor::unify 5 50 15
src/arkreactor/Builtins/Time.cpp 72:92 Ark::internal::Builtins::Time::makeTimestamp 6 20 5
src/arkreactor/Error/Diagnostics.cpp 194:211 Ark::Diagnostics::helper 7 17 2

CppCheck report

Filename Line Type Description
src/arkreactor/Compiler/Lowerer/ASTLowerer.cpp 658 style Consider using std::count_if algorithm instead of a raw loop.
src/arkreactor/VM/Debugger.cpp 352 style Parameter 'context' can be declared as reference to const
src/arkreactor/VM/VM.cpp 0 information Too many #ifdef configurations - cppcheck only checks 12 of 13 configurations. Use --force to check all configurations.
src/arkreactor/VM/VM.cpp 281 error Iterators of different containers 'm_execution_contexts.emplace_back(std::make_unique())' and 'm_execution_contexts.front()' are used together.
Report files about files you didn't modify in this PR
Filename Line Type Description
include/Ark/VM/VM.inl 267 style Variable 'maybe_value_ptr' can be declared as pointer to const
src/arkreactor/Builtins/Bytecode.cpp 23 style Parameter 'vm' can be declared as pointer to const
src/arkreactor/Builtins/Time.cpp 32 style Parameter 'n' can be declared as reference to const
src/arkreactor/Compiler/BytecodeReader.cpp 20 performance Variable 'm_arg_kinds' is assigned in constructor body. Consider performing initialization in initialization list.
src/arkreactor/Compiler/Lowerer/LocalsLocator.cpp 26 style The scope of the variable 'data' can be reduced.
src/arkreactor/Compiler/NameResolution/ScopeResolver.cpp 136 style Consider using std::find_if algorithm instead of a raw loop.
src/arkreactor/State.cpp 183 style Variable 'bytecode_hash' is assigned a value that is never used.
src/arkreactor/VM/SharedLibrary.cpp 0 information Too many #ifdef configurations - cppcheck only checks 12 of 13 configurations. Use --force to check all configurations.
include/Ark/VM/Value/Future.hpp 50 style Unused private function: 'Future::deleteSelfViaVM'
src/arkreactor/VM/Value/Future.cpp 23 performance Variable 'm_value' is assigned in constructor body. Consider performing initialization in initialization list.

@codspeed-hq

codspeed-hq Bot commented Jul 19, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 2.27%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

❌ 4 (👁 4) regressed benchmarks
✅ 14 untouched benchmarks

Performance Changes

Benchmark BASE HEAD Efficiency
👁 Welder - Big - 665 nodes[2] 43.5 ms 44.5 ms -2.32%
👁 Welder - Simple - 39 nodes[0] 1.1 ms 1.1 ms -2.56%
👁 Welder - Medium - 83 nodes[1] 2.1 ms 2.1 ms -2.56%
👁 Welder - Bigger[3] 70.3 ms 71.5 ms -1.62%

Comparing feat/inliner (4274418) with dev (00cfbe9)

Open in CodSpeed

…wise some compilers complain the expression is not a constant expression and performs head allocations
@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown

Super Instructions report

Some Super Instructions are under the usage threshold (24).

Super Instruction Uses in compiled code
APPEND_IN_PLACE_SYM_INDEX 23
INCREMENT 23
DECREMENT 21
STORE_FROM 15
LT_CONST_JUMP_IF_FALSE 9
NEQ_SYM_JUMP_IF_FALSE 4
CHECK_TYPE_OF 4
SET_VAL_TAIL 4
STORE_HEAD 2
NEQ_CONST_JUMP_IF_TRUE 2
SET_VAL_TAIL_BY_INDEX 1
SET_VAL_HEAD_BY_INDEX 1
MUL_SET_VAL 1
SET_VAL_HEAD 1
STORE_TAIL 1
Super Instructions over the threshold
Super Instruction Uses in compiled code
LOAD_CONST_LOAD_CONST 5972
CALL_SYMBOL 5479
LOAD_CONST_STORE 3201
CALL_BUILTIN_WITHOUT_RETURN_ADDRESS 1582
CALL_BUILTIN 976
LOAD_CONST_SET_VAL 965
INCREMENT_STORE 623
AT_SYM_SYM 572
GET_FIELD_FROM_SYMBOL_INDEX 505
STORE_LIST 385
GET_FIELD_FROM_SYMBOL 349
APPEND_IN_PLACE_SYM 342
LT_LEN_SYM_JUMP_IF_FALSE 331
CALL_SYMBOL_BY_INDEX 285
EQ_SYM_INDEX_JUMP_IF_TRUE 219
SET_VAL_FROM_INDEX 160
FUSED_MATH 143
SET_VAL_FROM 141
LT_SYM_JUMP_IF_FALSE 130
STORE_FROM_INDEX 127
DECREMENT_STORE 120
STORE_LEN 116
DECREMENT_BY_INDEX 116
GT_CONST_JUMP_IF_FALSE 112
LT_CONST_JUMP_IF_TRUE 96
GT_CONST_JUMP_IF_TRUE 84
AT_SYM_INDEX_SYM_INDEX 83
MUL_BY_INDEX 80
CALL_CURRENT_PAGE 75
EQ_CONST_JUMP_IF_TRUE 53
AT_SYM_INDEX_CONST 51
MUL_BY 47
GT_SYM_JUMP_IF_FALSE 39
STORE_HEAD_BY_INDEX 36
STORE_TAIL_BY_INDEX 35
INCREMENT_BY_INDEX 33
CHECK_TYPE_OF_BY_INDEX 30

@SuperFola

Copy link
Copy Markdown
Member Author

The welder performance regression here is not important ; that's because a new compilation pass was added.

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown

Fuzzing report

/usr/local/bin/afl-whatsup status check tool for afl-fuzz by Michal Zalewski

Summary stats

    Fuzzers alive : 0
   Dead or remote : 1 (included in stats)
   Total run time : 5 minutes, 0 seconds
      Total execs : 21 thousands
 Cumulative speed : 72 execs/sec
    Pending items : 0 faves, 1231 total
 Coverage reached : 8.37%
    Crashes saved : 0
      Hangs saved : 0

Cycles without finds : 0
Time without finds : 0

[+] Captured 46319 tuples (map size 277202, highest value 255, total values 476332336) in '/dev/null'.
[+] A coverage of 46319 edges were achieved out of 277248 existing (16.71%) with 1237 input files.

@coveralls

coveralls commented Jul 20, 2026

Copy link
Copy Markdown

Coverage Report for CI Build 29847311836

Coverage increased (+0.005%) to 94.39%

Details

  • Coverage increased (+0.005%) from the base build.
  • Patch coverage: 23 uncovered changes across 5 files (440 of 463 lines covered, 95.03%).
  • 4 coverage regressions across 1 file.

Uncovered Changes

File Changed Covered %
src/arkreactor/Compiler/IntermediateRepresentation/IRCompiler.cpp 25 17 68.0%
src/arkreactor/Compiler/IntermediateRepresentation/IRInliner.cpp 229 221 96.51%
include/Ark/Compiler/IntermediateRepresentation/Entity.hpp 49 45 91.84%
src/arkreactor/VM/Debugger.cpp 48 46 95.83%
include/Ark/Compiler/Lowerer/ASTLowerer.hpp 23 22 95.65%
Total (11 files) 463 440 95.03%

Coverage Regressions

4 previously-covered lines in 1 file lost coverage.

File Lines Losing Coverage Coverage
src/arkreactor/Compiler/BytecodeReader.cpp 4 85.71%

Coverage Stats

Coverage Status
Relevant Lines: 11336
Covered Lines: 10700
Line Coverage: 94.39%
Coverage Strength: 1164645.14 hits per line

💛 - Coveralls

@SuperFola
SuperFola marked this pull request as ready for review July 21, 2026 16:10
@SuperFola
SuperFola merged commit 68b3ba7 into dev Jul 21, 2026
38 checks passed
@SuperFola
SuperFola deleted the feat/inliner branch July 21, 2026 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants