aboutsummaryrefslogtreecommitdiffstats
path: root/yjit
Commit message (Collapse)AuthorAgeFilesLines
* YJIT: add top C function call counts to `--yjit-stats` (#9047)Maxime Chevalier-Boisvert2023-11-272-1/+97
| | | | | * YJIT: gather call counts for individual cfuncs Co-authored by Takashi Kokubun
* YJIT: record `num_send_cfunc` stat (#9022)Maxime Chevalier-Boisvert2023-11-232-3/+5
| | | | | | | | | * YJIT: record num_send_cfunc stat Also report num_send_known_cfunc as percentage of num_send_cfunc * Rename num_send_known_cfunc => num_send_cfunc_inline Name seems more descriptive of what we do with out custom codegen
* YJIT: Apply patches ignoring page_end_reserve (#9015)Takashi Kokubun2023-11-231-6/+7
|
* YJIT: Fix jmp_ptr_bytes on x86_64 (#9016)Takashi Kokubun2023-11-231-1/+1
|
* YJIT: Avoid a register spill on arm64 (#9014)Takashi Kokubun2023-11-221-1/+1
|
* YJIT: Skip dump-disasm if it fails to create a file (#8968)Takashi Kokubun2023-11-211-5/+9
|
* Don't try compacting ivars on Classes that are "too complex"Aaron Patterson2023-11-201-1/+1
| | | | | Too complex classes use a hash table to store ivs, and should always pin their IVs. We shouldn't touch those classes in compaction.
* YJIT: Print a disasm path to stderr (#8967)Takashi Kokubun2023-11-201-1/+1
| | | YJIT: Print a perf map path to stderr
* YJIT: make --yjit-max-versions=N option undocumented (#8962)Maxime Chevalier-Boisvert2023-11-201-2/+1
| | | | Not useful for the vast majority of end users to change this option.
* YJIT: shrink `Context` down to 15 bytes (#8911)Maxime Chevalier-Boisvert2023-11-131-20/+95
| | | | | * WIP context refactoring * Refactor to remove Context.temp_mapping
* YJIT: Fix `clippy::useless_vec` in a testAlan Wu2023-11-101-1/+1
|
* YJIT: Take cargo --fix for unnecessary calls to into()Alan Wu2023-11-102-9/+9
|
* YJIT: Auto fix for clippy::unnecessary_castAlan Wu2023-11-102-3/+3
|
* YJIT: Auto fix for clippy::clone_on_copyAlan Wu2023-11-103-21/+21
|
* YJIT: Panic with more info when global invalidation patching failsAlan Wu2023-11-101-1/+3
|
* YJIT: Invoke PosMarker callbacks only with solid positionsAlan Wu2023-11-103-6/+58
| | | | | | | | | | | | | | | | | | | Previously, PosMarker callbacks ran even when the assembler failed to assemble its contents due to insufficient space. This was problematic because when Assembler::compile() failed, the callbacks were given positions that have no valid code, contrary to general expectation. For example, we use a PosMarker callback to record VM instruction boundaries and patch in jumps to exits in case the guest program starts tracing, however, previously, we could record a location near the end of the code block, where there is no space to patch in jumps. I suspect this is the cause of the recent occurrences of rare random failures on GitHub Actions with the invariants.rs:529 "can rewrite existing code" message. `--yjit-perf` also uses PosMarker and had a similar issue. Buffer the list of callbacks to fire, and only fire them when all code in the assembler are written out successfully. It's more intuitive this way.
* YJIT: Fix comment typos [ci skip]Edwin Garcia2023-11-101-2/+2
|
* YJIT: Disable code GC (#8865)Takashi Kokubun2023-11-082-6/+30
| | | | Co-authored-by: Alan Wu <alansi.xingwu@shopify.com> Co-authored-by: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>
* Refactor rb_shape_transition_shape_capa outJean Boussier2023-11-083-36/+22
| | | | | | | | | | | | | | | | Right now the `rb_shape_get_next` shape caller need to first check if there is capacity left, and if not call `rb_shape_transition_shape_capa` before it can call `rb_shape_get_next`. And on each of these it needs to checks if we got a TOO_COMPLEX back. All this logic is duplicated in the interpreter, YJIT and RJIT. Instead we can have `rb_shape_get_next` do the capacity transition when needed. The caller can compare the old and new shapes capacity to know if resizing is needed. It also can check for TOO_COMPLEX only once.
* YJIT: Fix assert in OOM scenarioAlan Wu2023-11-071-1/+1
| | | | | | | | | | | We still need to do `jit.record_boundary_patch_point = false` when gen_outlined_exit() returns `None` and we return with `?`. Previously, we tripped the assert at codegen.rs:1042. Found with `--yjit-exec-mem-size=3` on the lobsters benchmark. Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com> Co-authored-by: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>
* YJIT: Use u32 for CodePtr to save 4 bytes eachAlan Wu2023-11-0714-161/+175
| | | | | | | | | | | | | | | | We've long had a size restriction on the code memory region such that a u32 could refer to everything. This commit capitalizes on this restriction by shrinking the size of `CodePtr` to be 4 bytes from 8. To derive a full raw pointer from a `CodePtr`, one needs a base pointer. Both `CodeBlock` and `VirtualMemory` can be used for this purpose. The base pointer is readily available everywhere, except for in the case of the `jit_return` "branch". Generalize lea_label() to lea_jump_target() in the IR to delay deriving the `jit_return` address until `compile()`, when the base pointer is available. On railsbench, this yields roughly a 1% reduction to `yjit_alloc_size` (58,397,765 to 57,742,248).
* YJIT: Inline basic Ruby methods (#8855)Takashi Kokubun2023-11-073-4/+59
| | | | | | | * YJIT: Inline basic Ruby methods * YJIT: Fix "InsnOut operand made it past register allocation" checktype should not generate a useless instruction.
* YJIT: handle out of shape situation in gen_setinstancevariable (#8857)Jean byroot Boussier2023-11-071-1/+5
| | | | | | If the VM ran out of shape, `rb_shape_transition_shape_capa` might return `OBJ_TOO_COMPLEX_SHAPE`. Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
* YJIT: implement two-step call threshold (#8839)Maxime Chevalier-Boisvert2023-11-032-3/+20
| | | | | | | | | | | | | | | | | | | * YJIT: implement two-step call threshold Automatically switch call threshold to a larger value for larger, production-sized apps, while still allowing smaller apps and command-line programs to start with a lower threshold. * Update yjit/src/options.rs Co-authored-by: Alan Wu <XrXr@users.noreply.github.com> * Make the new variables constants * Check that a custom call threshold was not specified --------- Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
* YJIT: Delete some dead code and enable lintsAlan Wu2023-11-032-21/+6
|
* YJIT: Always define method codegen table at boot (#8807)Takashi Kokubun2023-11-022-99/+89
|
* updating bindgenAaron Patterson2023-10-241-0/+11
|
* YJIT: Skip printing stats at exit if --yjit-disable (#8727)Takashi Kokubun2023-10-201-1/+1
|
* YJIT: remove unused `--yjit-greedy-versioning` command-line option (#8713)Maxime Chevalier-Boisvert2023-10-192-15/+1
|
* YJIT: Return Option from asm.compile() for has_dropped_bytes()Alan Wu2023-10-197-176/+175
| | | | | | | | | So that we get a reminder to check CodeBlock::has_dropped_bytes(). Internally, asm.compile() already checks it, and this patch just propagates it out to the caller with a `#[must_use]`. Code GC logic moved out one level in entry_stub_hit(), so the body can freely use `?`
* YJIT: Add RubyVM::YJIT.enable (#8705)Takashi Kokubun2023-10-192-41/+47
|
* YJIT: Enable the dead_code lint and delete some dead codeAlan Wu2023-10-192-82/+6
|
* YJIT: Add a live ISeq counter Alan Wu2023-10-181-0/+6
| | | | | | | It's an estimator for application size and could be used as a compilation heuristic later. Co-authored-by: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com> Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
* Revert "shape.h: Make attr_index_t uint8_t"Katherine Oelsner2023-10-182-5/+5
| | | | This reverts commit e3afc212ec059525fe4e5387b2a3be920ffe0f0e.
* YJIT: Add --yjit-perf (#8697)Takashi Kokubun2023-10-187-8/+105
| | | Co-authored-by: Alan Wu <alansi.xingwu@shopify.com>
* Bump rustix from 0.38.2 to 0.38.19 in /yjit/bindgendependabot[bot]2023-10-181-9/+9
| | | | | | | | | | | | | Bumps [rustix](https://github.com/bytecodealliance/rustix) from 0.38.2 to 0.38.19. - [Release notes](https://github.com/bytecodealliance/rustix/releases) - [Commits](https://github.com/bytecodealliance/rustix/compare/v0.38.2...v0.38.19) --- updated-dependencies: - dependency-name: rustix dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
* YJIT: Fix clippy::redundant_localsAlan Wu2023-10-171-3/+1
| | | | | | > note: `#[deny(clippy::redundant_locals)]` on by default On Rust 1.73.0.
* YJIT: Remove call to compile() on empty AssemblerAlan Wu2023-10-171-4/+1
|
* YJIT: Add a few missing counters for send fallback (#8681)Takashi Kokubun2023-10-172-3/+6
|
* YJIT: Lookup IDs on boot instead of binding to themAlan Wu2023-10-176-222/+57
| | | | | | | | | | Previously, the version-controlled `cruby_bindings.inc.rs` file contained the build-time artifact `id.h`, which nobu mentioned hinders the goal of having fewer magic numbers in the repository. Lookup the IDs YJIT needs on boot. It costs cycles, but it's fine since YJIT only uses a handful of IDs at the moment. No perceptible degradation to boot time found in my testing.
* YJIT: Count cold_iseq_entry by default (#8654)Takashi Kokubun2023-10-141-5/+0
|
* YJIT: Fallback opt_getconstant_path for const_missing (#8623)Takashi Kokubun2023-10-132-9/+22
| | | | | | | * YJIT: Fallback opt_getconstant_path for const_missing * Fix a comment [ci skip] * Remove a wrapper function
* YJIT: Fix argument clobbering in some block_arg+rest_param calls (#8647)Alan Wu2023-10-132-42/+60
| | | | | | | | | | | | Previously, for block argument callsites with some specific argument count and callee local variable count combinations, YJIT ended up writing over arguments that are supposed to be collected into a rest parameter array unmodified. Detect when clobbering would happen and avoid it. Also, place the block handler after the stack overflow check, since it writes to new stack space. Reported-by: Takashi Kokubun <takashikkbn@gmail.com>
* YJIT: port call threshold logic from Rust to C for performance (#8628)Maxime Chevalier-Boisvert2023-10-124-67/+29
| | | | | | | | | | | | | | | | | * Port call threshold logic from Rust to C for performance * Prefix global/field names with yjit_ * Fix linker error * Fix preprocessor condition for rb_yjit_threshold_hit * Fix third linker issue * Exclude yjit_calls_at_interv from RJIT bindgen --------- Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
* shape.h: Make attr_index_t uint8_tJean Boussier2023-10-112-5/+5
| | | | | | | | | | Given `SHAPE_MAX_NUM_IVS 80`, we transition to TOO_COMPLEX way before we could overflow a 8bit counter. This reduce the size of `rb_shape_t` from 32B to 24B. If we decide to raise `SHAPE_MAX_NUM_IVS` we can always increase that type again.
* YJIT: Allow --yjit-trace-exits on release builds (#8619)Takashi Kokubun2023-10-101-21/+0
|
* Refactor rb_shape_transition_shape_capa to not accept capacityJean Boussier2023-10-102-7/+3
| | | | | This way the groth factor is encapsulated, which allows rb_shape_transition_shape_capa to be smarter about ideal sizes.
* YJIT: Simplify linker flavor checkAlan Wu2023-10-051-5/+3
| | | | | By not allowlisting every OS that could have a GNU flavor linker, it's also a bigger tent
* YJIT: shink local types from 8 to 4 bytes (#8597)Maxime Chevalier-Boisvert2023-10-051-24/+79
| | | | | | | * Shink local types from 8 to 4 bytes, context from 21 to 17 bytes Use repr(packed) * Add comment about Type being limited to 4 bits
* YJIT: Run bindgenAlan Wu2023-10-051-1/+0
|