| Age | Commit message (Collapse) | Author |
|
CI passed on SetIvar but broke some larger Ruby tests. Needs further investigation and testing.
* Revert "ZJIT: Fix rebase issue with tests"
This reverts commit 37248c51233d827ca56471661175c56e31c3b14f.
* Revert "ZJIT: Inline attr_accessor/attr_writer to SetIvar (#14629)"
This reverts commit 40bb47665d3ff57e0f2eb5a9fd9e0109617015c9.
|
|
|
|
|
|
* ZJIT: Incorporate bb0-prologue and PC check into HIR
* Fix an outdated comment
* Use shallow clone for LoadPC and EntryPoint
* Reproduce the actual HIR graph to pass validation
* Fill out param types for jit_entry_block
* Add Type::from_cptr
* Add a TODO comment about Const::CPtr printing
|
|
The validation is relevant only for traceable userland ruby objects ruby
code could interact with. ZJIT's use of rb_vm_method_cfunc_is()
allocates a CC imemo and was failing this validation when it was
actually fine. Relax the check.
|
|
|
|
## Context
#14409
https://github.com/ruby/ruby/pull/14409#discussion_r2350238583
>You may have noticed that this doesn't produce a New range instruction. For that you probably need to use a local variable (makes it harder for the bytecode compiler to reason about, but the JIT sees through it). If you have time, please rewrite these tests.
https://github.com/ruby/ruby/pull/14409#discussion_r2350240389
>There's some code above to do this for you: see arguments_likely_fixnums and coerce something or other
## Changes
### Refactor tests
Modify tests force the usage of `NewRangeFixnum` instruction and make tests names more consistent.
### Refactor optimize ranges
Didn't found `arguments_likely_fixnums` to be applicable unless we enable profiling for `NewRange` and change the criteria of when the optimization fires. But there were other ways to clean up the code.
Simplify the logic and move it to `type_specialize`. Deleted the standalone `optimize_ranges` function.
|
|
The stack layout is incompatible with the way we reify the stack for
generating fallback SendWithoutBlock: the receiver is an embedded VALUE
in the bytecode, not on the stack. Since we don't expect these to be
overridden often, instead of fussing about with the stack layout, just
hope for the best and PatchPoint/SideExit.
Fix https://github.com/Shopify/ruby/issues/760
|
|
* ZJIT: Compile sendforward with dynamic dispatch
* Reload locals only if it has blockiseq
* Add a test case of ... with other args
|
|
* ZJIT: Support variadic C calls
This reduces the `dynamic_send_count` in `liquid-render` by ~21%
* ZJIT: Reuse gen_push_frame
* ZJIT: Avoid optimizing variadic C call when tracing is enabled
|
|
|
|
|
|
|
|
|
|
Previously, the included test crashed or turned into an infinite
loop due to the missing check.
|
|
ZJIT: Support invokeblock insn
Basically like other send-ish insns, except that it doesn't pop the receiver.
|
|
|
|
|
|
Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
|
|
* failing test for ObjToString optimization with GuardType
* profile ObjToString receiver and rewrite with guard
* adjust integration tests for objtostring type guard optimization
* Implement new GuardTypeNot HIR; objtostring sends to_s directly on profiled nonstrings
* codegen for GuardTypeNot
* typo fixes
* better name for tests; fix side exit reason for GuardTypeNot
* revert accidental change
* make bindgen
* Fix is_string to identify subclasses of String; fix codegen for identifying if val is String
|
|
This allows for more precise tracking of stats programmatically
which is particularly useful for our nightly benchmarking suite.
- Define rust function
- Expose to C
- Wrap with Ruby API
- Add a test
|
|
|
|
Similar to YJIT's --yjit-stats=quiet, this option allows ZJIT to collect
statistics and make them available via the Ruby API without printing them
at exit. This is useful for programmatic access to stats without the
output noise.
- Added print_stats field to Options struct
- Modified option parsing to support --zjit-stats=quiet
- Added rb_zjit_print_stats_p primitive to check if stats should be printed
- Updated zjit.rb to only register at_exit handler when print_stats is true
- Update the help text shown by `ruby --help` to indicate that
--zjit-stats now accepts an optional =quiet parameter.
- Added test for --zjit-stats=quiet option
|
|
|
|
|
|
Co-authored-by: Max Bernstein <ruby@bernsteinbear.com>
|
|
ZJIT: Add patchpoint for TracePoint activation
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
|
|
* ZJIT: Support compiling ISEQs for opt_pc = 0
* Test send with optional arguments
|
|
ZJIT: Handle opt_case_dispatch insn
|
|
ZJIT: Remove JITed code after TracePoint is enabled
|
|
* Failing optimization tests for NewRangeFixnum
* NewRangeFixnum general idea
* Use gen_prepare_call_with_gc on gen_new_range_fixnum; add additional hir tests
* Remove unused NewRange rewrite trigger when neither range is Fixnum literal
* Remove misleading 'profiled' name in range optimization tests
* Adjustments as per review comments
* Include new_range_fixnum tests
* remove non-ASCII character from comments as per PR review
* remove non-ASCII character from comments as per PR review
|
|
Specialize monomorphic `GetIvar` into:
* `GuardType(HeapObject)`
* `GuardShape`
* `LoadIvarEmbedded` or `LoadIvarExtended`
This requires profiling self for `getinstancevariable` (it's not on the operand
stack).
This also optimizes `GetIvar`s that happen as a result of inlining
`attr_reader` and `attr_accessor`.
Also move some (newly) shared JIT helpers into jit.c.
|
|
This was fixed in https://github.com/ruby/ruby/pull/14308
Thanks, Stan, for noticing.
Fixes https://github.com/Shopify/ruby/issues/703
|
|
|
|
|
|
Depending on the user's warning level, getting certain global variables
may lead to calling `Warning#warn`, which can be redefined by the user.
This fixes another `bootstraptest/test_yjit.rb` failure.
|
|
|
|
|
|
|
|
|
|
|
|
* ZJIT: Add Ractor mode PatchPoint for ivar get/set
* ZJIT: Only add single ractor patchpoint to class/module receivers
* ZJIT: Improve Ractor mode patch point comments
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
---------
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
|
|
* ZJIT: Refactor stats implementations
* s/num_send_dynamic/dynamic_send_count/
|
|
|
|
Just removing some unneeded tests, outdated comments...etc.
|
|
Previously, we only spilled the arguments necessary for the particular
send. In case the callee raises and a rescue resumes the ISEQ, that
did not present a complete stack state. E.g. in `[1, (raise rescue 2)]`
the raise send only spills `self`, when `1` also needs to be spilled.
Spill the whole stack. Adjust parsing for `opt_aref_with` since the
key argument for the send now needs to be described by the frame state
of the send.
This changes the contract for `Insn::SendWithoutBlock` to use arguments
from the interpreter stack as described by its frame state.
|
|
* ZJIT: Add RubyVM::ZJIT.stats_enabled?
* ZJIT: Allow querying a single ZJIT stat
|
|
|
|
Co-authored-by: Alan Wu <alansi.xingwu@shopify.com>
Co-authored-by: Max Bernstein <ruby@bernsteinbear.com>
Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
|
|
gen_prepare_call_with_gc() was not enough because of the rb_funcall()
usage in range_init().
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
Co-authored-by: Max Bernstein <rubybugs@bernsteinbear.com>
|