summaryrefslogtreecommitdiff
path: root/yjit_iface.h
Commit message (Collapse)AuthorAgeFilesLines
* Remove the scraperAaron Patterson2021-10-201-3/+0
| | | | | Now that we're using the jit function entry point, we don't need the scraper. Thank you for your service, scraper. ❤️
* Add a guard that we start executing on the first PCAaron Patterson2021-10-201-0/+1
| | | | | | | Methods with optional parameters don't always start executing at the first PC, but we compile all methods assuming that they do. This commit adds a guard to ensure that we're actually starting at the first PC for methods with optional params
* Always use `ret` to return to the interpreterAaron Patterson2021-10-201-1/+0
| | | | | | | | | | | | | | | | | | | | | Always using `ret` to return to the interpreter means that we never have to check the VM_FRAME_FLAG_FINISH flag. In the case that we return `Qundef`, the interpreter will execute the cfp. We can take advantage of this by setting the PC to the instruction we can't handle, and let the interpreter pick up the ball from there. If we return a value other than Qundef, the interpreter will take that value as the "return value" from the JIT and push that to the SP of the caller The leave instruction puts the return value on the top of the calling frame's stack. YJIT does the same thing for leave instructions. However, when we're returning back to the interpreter, the leave instruction _should not_ put the return value on the top of the stack, but put it in RAX and use RET. This commit pops the last value from the stack pointer and puts it in RAX so that the interpreter is happy with SP.
* Code review for expandarray and testsKevin Newton2021-10-201-1/+1
|
* Implement expandarrayKevin Deisz2021-10-201-0/+5
|
* Remove seven YJIT counters that are no longer used.Noah Gibbs2021-10-201-7/+0
|
* Convert yjit static stat variables to countersNoah Gibbs2021-10-201-1/+3
|
* Add a macro for tweaking default call thresholdAlan Wu2021-10-201-1/+5
| | | | | For use in development for writing `test.rb` and running with `make run`.
* Use builtin_inline_p to avoid pushing a frame for primitive C methods (#63)Maxime Chevalier-Boisvert2021-10-201-1/+0
| | | | | | | | | | | | | * Use builtin_inline_p to skip a frame of C methods * Fix bugs in primitive cfunc call code * Remove if (push_frame) {} * Remove if (push_frame) {} * Push Aaron's fix to avoid hardcoding insn lengths Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
* Implement send with blocksAlan Wu2021-10-201-26/+26
| | | | | | | | | | | | | | | | | | | | | | | | | * Implement send with blocks Not that much extra work compared to `opt_send_without_block`. Moved the stack over flow check because it could've exited after changes are made to cfp. * rename oswb counters * Might as well implement sending block to cfuncs * Disable sending blocks to cfuncs for now * Reconstruct interpreter sp before calling into cfuncs In case the callee cfunc calls a method or delegates to a block. This also has the side benefit of letting call sites that sometimes are iseq calls and sometimes cfunc call share the same successor. * only sync with interpreter sp when passing a block Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com> Co-authored-by: Aaron Patterson <aaron.patterson@shopify.com>
* Implement calls to methods with simple optional paramsAlan Wu2021-10-201-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | * Implement calls to methods with simple optional params * Remove unnecessary MJIT_STATIC See comment for MJIT_STATIC. I added it not knowing whether it's required because the function next to it has it. Don't use it and wait for problems to come up instead. * Better naming, some comments * Count bailing on kw only iseqs On railsbench: ``` opt_send_without_block exit reasons: bmethod 59729 (27.7%) optimized_method 59137 (27.5%) iseq_complex_callee 41362 (19.2%) alias_method 33346 (15.5%) callsite_not_simple 19170 ( 8.9%) iseq_only_keywords 1300 ( 0.6%) kw_splat 1299 ( 0.6%) cfunc_ruby_array_varg 18 ( 0.0%) ```
* Improve set instance variableAaron Patterson2021-10-201-0/+7
| | | | This commit improves the set ivar implementation.
* Merge pull request #114 from Shopify/yjit-dup-commentsMaxime Chevalier-Boisvert2021-10-201-1/+1
| | | YJIT: Avoid adding duplicate code comments
* YJIT: implement calls to ivar getter methodsAlan Wu2021-10-201-1/+3
|
* YJIT: Fancier opt_getinlinecacheAlan Wu2021-10-201-4/+4
| | | | | | | Make sure `opt_getinlinecache` is in a block all on its own, and invalidate it from the interpreter when `opt_setinlinecache`. It will recompile with a filled cache the second time around. This lets YJIT runs well when the IC for constant is cold.
* YJIT: add comments to disassemblyAlan Wu2021-10-201-0/+9
| | | | | | | | Introduce a new macro `ADD_COMMENT(cb, comment)` that records a comment for the current write position in the code block. Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com> Co-authored-by: Aaron Patterson <aaron.patterson@shopify.com>
* Collect statistics about binding allocations / local variable setAaron Patterson2021-10-201-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit collects statistics about how many binding objects are allocated as well as the number of local variables set on bindings. Statistics are output along with other YJIT stats. Here is an example of the output: ``` ***YJIT: Printing runtime counters from yjit.rb*** Number of Bindings Allocated: 195 Number of locals modified through binding: 0 opt_send_without_block exit reasons: ivar_get_method 7515891 (40.4%) se_cc_klass_differ 3081330 (16.6%) iseq_argc_mismatch 1564578 ( 8.4%) se_receiver_not_heap 1557663 ( 8.4%) ic_empty 1407064 ( 7.6%) optimized_method 995823 ( 5.4%) iseq_not_simple 819413 ( 4.4%) alias_method 706972 ( 3.8%) bmethod 685253 ( 3.7%) callsite_not_simple 225983 ( 1.2%) kw_splat 25999 ( 0.1%) ivar_set_method 902 ( 0.0%) cfunc_toomany_args 394 ( 0.0%) refined_method 42 ( 0.0%) cfunc_ruby_array_varg 29 ( 0.0%) invalid_cme 4 ( 0.0%) leave exit reasons: se_finish_frame 4067107 (100.0%) se_interrupt 24 ( 0.0%) getinstancevariable exit reasons: undef 121177 (100.0%) idx_out_of_range 5 ( 0.0%) opt_aref exit reasons: (all relevant counters are zero) compiled_iseq_count: 3944 main_block_code_size: 1.1 MiB side_block_code_size: 0.6 MiB vm_insns_count: 1137268516 yjit_exec_insns_count: 414015644 ratio_in_yjit: 26.7% avg_len_in_yjit: 7.5 total_exit_count: 55491789 most frequent exit op: opt_send_without_block: 18587628 (33.5%) opt_getinlinecache: 11075822 (20.0%) send: 4949300 (8.9%) leave: 4067131 (7.3%) defined: 3975196 (7.2%) setinstancevariable: 3567315 (6.4%) invokesuper: 2982163 (5.4%) getblockparamproxy: 2168852 (3.9%) opt_nil_p: 2104524 (3.8%) opt_aref: 2013858 (3.6%) ``` Running RailsBench allocates 195 binding objects but doesn't set any local variables.
* Fix GCC warningsAlan Wu2021-10-201-0/+5
| | | | Mostly unused and uninitialized warnings here and there
* Track interpreter return as an exit reason for leave instrMaxime Chevalier-Boisvert2021-10-201-0/+1
|
* Introduce yjit_guard_known_klass()Alan Wu2021-10-201-1/+1
|
* Get rid of dependency on rb_call_cacheAlan Wu2021-10-201-1/+1
|
* YJIT: hash specialization for opt_arefAlan Wu2021-10-201-2/+0
| | | | | Make it lazy and add a hash specialization in addition to the array specialization.
* Exit reason breakdown for opt_arefAlan Wu2021-10-201-0/+5
|
* YJIT: lazy polymorphic getinstancevariableAlan Wu2021-10-201-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | Lazily compile out a chain of checks for different known classes and whether `self` embeds its ivars or not. * Remove trailing whitespaces * Get proper addresss in Capstone disassembly * Lowercase address in Capstone disassembly Capstone uses lowercase for jump targets in generated listings. Let's match it. * Use the same successor in getivar guard chains Cuts down on duplication * Address reviews * Fix copypasta error * Add a comment
* Include ruby/ruby.h before vm_core.hAlan Wu2021-10-201-12/+1
| | | | | This is how vm.c does it, and if we don't follow it in yjit compilation units, rb_vm_t would have a conflicting size.
* Make Blocks depend on BOPSAaron Patterson2021-10-201-0/+1
| | | | | | When a BOP is redefined, the BOP redefinition callback will invalidate any blocks that depend on BOPS. This allows us to eliminate runtime checks for BOP redefinition.
* Yet Another Ruby JIT!Jose Narvaez2021-10-201-0/+91
Renaming uJIT to YJIT. AKA s/ujit/yjit/g.