summaryrefslogtreecommitdiff
path: root/yjit/src
Commit message (Collapse)AuthorAgeFilesLines
* YJIT: Simplify using the BITS associated constantAlan Wu2023-03-171-8/+8
| | | | All the integer types have it.
* YJIT: make type info more specific in gen_fixnum_cmp and gen_opt_mod (#7555)Maxime Chevalier-Boisvert2023-03-171-3/+3
|
* YJIT: Delete --yjit-global-constant-state (#7559)Alan Wu2023-03-172-35/+5
| | | | | It was useful for evaluating 6068da8937d7e4358943f95e7450dae7179a7763 but I think we should remove it now to make the logic around invalidation more straight forward.
* YJIT: Add and use Branch::assert_layout()Alan Wu2023-03-171-0/+14
| | | | | | This assert would've caught a bug I wrote while developing ruby/ruby#7443 so I figured it would be good to commit it as it could be helpful in the future.
* YJIT: Rest and block_arg support (#7557)Jimmy Miller2023-03-172-9/+3
| | | | | | | | | * YJIT: Rest and block_arg support * Update bootstraptest/test_yjit.rb --------- Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
* YJIT: Support entry for multiple PCs per ISEQ (GH-7535)Takashi Kokubun2023-03-175-32/+261
|
* YJIT: Use raw pointers and shared references over `Rc<RefCell<_>>`Alan Wu2023-03-175-637/+965
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `Rc` and `RefCell` both incur runtime space costs. In addition, `RefCell` has given us some headaches with the non obvious borrow panics it likes to throw out. The latest one started with 7fd53eeb46db261bbc20025cdab70096245a5cbe and is yet to be resolved. Since we already rely on the GC to properly reclaim memory for `Block` and `Branch`, we might as well stop paying the overhead of `Rc` and `RefCell`. The `RefCell` panics go away with this change, too. On 25 iterations of `railsbench` with a stats build I got `yjit_alloc_size: 8,386,129 => 7,348,637`, with the new memory size 87.6% of the status quo. This makes the metadata and machine code size roughly line up one-to-one. The general idea here is to use `&` shared references with [interior mutability][1] with `Cell`, which doesn't take any extra space. The `noalias` requirement that `&mut` imposes is way too hard to meet and verify. Imagine replacing places where we would've gotten `BorrowError` from `RefCell` with Rust/LLVM miscompiling us due to aliasing violations. With shared references, we don't have to think about subtle cases like the GC _sometimes_ calling the mark callback while codegen has an aliasing reference in a stack frame below. We mostly only need to worry about liveness, with which the GC already helps. There is now a clean split between blocks and branches that are not yet fully constructed and ones that are "in-service", so to speak. Working with `PendingBranch` and `JITState` don't really involve `unsafe` stuff. This change allows `Branch` and `Block` to not have as many optional fields as many of them are only optional during compilation. Fields that change post-compilation are wrapped in `Cell` to facilitate mutation through shared references. I do some `unsafe` dances here. I've included just a couple tests to run with Miri (`cargo +nightly miri test miri`). We can add more Miri tests if desired. [1]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html
* YJIT: Remove exit for rest and send combo (#7546)Jimmy Miller2023-03-161-5/+0
|
* YJIT: add stats to keep track of when branch direction is known (#7544)Maxime Chevalier-Boisvert2023-03-162-0/+12
| | | This measures the impact of changes made by @jhawthorn last year.
* YJIT: Eliminate unnecessary mov for trampolines (#7537)Takashi Kokubun2023-03-151-1/+4
|
* YJIT: Use assert_disasm! in an A64 test to avoid unused warningAlan Wu2023-03-151-0/+6
| | | I kept getting unused warnings for this macro on A64 macOS.
* YJIT: use u16 for insn_idx instead of u32 (#7534)Maxime Chevalier-Boisvert2023-03-155-35/+37
|
* YJIT: Assert that we have the VM lock while markingAlan Wu2023-03-152-6/+19
| | | | | Somewhat important because having the lock is a key part of the soundness reasoning for the `unsafe` usage here.
* Make EC required on JIT state (#7520)Aaron Patterson2023-03-151-14/+17
| | | | | | | | | | | | * Make EC required on JIT state Lets make EC required on the JITState object so we don't need to `unwrap` it. * Minor nitpicks --------- Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
* YJIT: Introduce no_gc attribute (#7511)Takashi Kokubun2023-03-142-13/+16
|
* YJIT: Implement throw instruction (#7491)Takashi Kokubun2023-03-141-0/+35
| | | | | | | * Break up jit_exec from vm_sendish * YJIT: Implement throw instruction * YJIT: Explain what rb_vm_throw does [ci skip]
* YJIT: Allow testing assembler with disasm (#7470)Takashi Kokubun2023-03-142-2/+86
| | | | | | | | | | | * YJIT: Allow testing assembler with disasm * YJIT: Drop new dependencies * YJIT: Avoid address manipulation * YJIT: Introduce assert_disasm! macro * YJIT: Update the comment about assert_disasm
* YJIT: Merge add/sub/and/or/xor and mov on x86_64 (#7492)Takashi Kokubun2023-03-131-23/+90
|
* YJIT: Handle rest+splat where non-splat < required (#7499)Jimmy Miller2023-03-132-23/+58
|
* YJIT: Bump SEND_MAX_DEPTH to 20 (#7469)Takashi Kokubun2023-03-102-3/+5
| | | | | * YJIT: Bump SEND_MAX_DEPTH to 20 * Fix a test failure
* YJIT: upgrade type in `guard_object_is_string` (#7489)Maxime Chevalier-Boisvert2023-03-092-35/+49
| | | | | | | | | * YJIT: upgrade type in guard_object_is_string Also make logic more in line with other guard_xxx methods * Update yjit/src/core.rs * Revert changes to Type::upgrade()
* YJIT: Merge x86_merge into x86_split (#7487)Takashi Kokubun2023-03-091-31/+12
|
* Another fix for 262254dc7dTakashi Kokubun2023-03-091-1/+1
| | | | Koichi might want to adjust his editor configuration.
* Revert an unneeded diff in 262254dc7dTakashi Kokubun2023-03-091-3/+3
|
* rename `defined_ivar` to `definedivar`Koichi Sasada2023-03-102-9/+9
| | | | because non-opt instructions should contain `_` char.
* YJIT: Optimize `cmp REG, 0` into `test REG, REG` (#7471)Takashi Kokubun2023-03-091-2/+31
|
* Add defined_ivar as YJIT instruction as wellOle Friis Østergaard2023-03-082-159/+200
| | | | | | | | | | This works much like the existing `defined` implementation, but calls out to rb_ivar_defined instead of the more general rb_vm_defined. Other difference to the existing `defined` implementation is that this new instruction has to take the same operands as the CRuby `defined_ivar` instruction.
* Remove MJIT's builtin function compilerTakashi Kokubun2023-03-071-8/+0
|
* YJIT: Add comments to peek and x86_mergeTakashi Kokubun2023-03-072-0/+4
|
* YJIT: Merge lea and mov on x86_64 when possibleTakashi Kokubun2023-03-072-3/+55
|
* YJIT: Handle splat+rest for args pass greater than required (#7468)Jimmy Miller2023-03-073-8/+44
| | | | | | | | | | | For example: ```ruby def my_func(x, y, *rest) p [x, y, rest] end my_func(1, 2, 3, *[4, 5]) ```
* YJIT: Protect strings from GC on String#<< (#7466)Takashi Kokubun2023-03-071-0/+3
| | | | | | | | Fix https://github.com/Shopify/yjit/issues/310 [Bug #19483] Co-authored-by: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com> Co-authored-by: Jimmy Miller <jimmy.miller@shopify.com>
* YJIT: Handle special case of splat and rest lining up (#7422)Jimmy Miller2023-03-073-29/+53
| | | | | | | | | | | | | | | | If you have a method that takes rest arguments and a splat call that happens to line up perfectly with that rest, you can just dupe the array rather than move anything around. We still have to dupe, because people could have a custom to_a method or something like that which means it is hard to guarantee we have exclusive access to that array. Example: ```ruby def foo(a, b, *rest) end foo(1, 2, *[3, 4]) ```
* YJIT: Bump SEND_MAX_DEPTH to 10 (#7452)Takashi Kokubun2023-03-071-2/+2
|
* YJIT: fix CI issue reported by Koichi caused by small stack patch (#7442)Maxime Chevalier-Boisvert2023-03-031-0/+8
| | | | | Includes small reproduction produced by Kokubun. http://ci.rvm.jp/results/trunk-yjit@ruby-sp2-docker
* YJIT: Fix a cargo test warning on x86_64 (#7428)Takashi Kokubun2023-03-031-0/+1
|
* YJIT: shrink stack_size/sp_offet to u8/i8 (#7426)Maxime Chevalier-Boisvert2023-03-023-13/+13
|
* YJIT: Delete stale `frozen_bytes` related code (#7423)Alan Wu2023-03-024-48/+0
| | | | | | | | | | | | | | The code and comments in there have been disabled by comments for a long time. The issues that the counter used to solve are now solved more comprehensively by "runningness" [tracking][1] introduced by Code GC and [delayed deallocation][2]. Having a single counter doesn't fit our current model where code pages that could be touched or not are interleaved, anyway. Just delete the code. [1]: e7c71c6c9271b0c29f210769159090e17128e740 [2]: a0b0365e905e1ac51998ace7e6fc723406a2f157
* YJIT: Fix cfunc splatJimmy Miller2023-03-021-16/+8
| | | Follow-up for cb8a040b7906c09d9d3ac3d3fe853f633005024f.
* YJIT: Properly deal with cfunc splat when no args needed (#7413)Jimmy Miller2023-03-011-11/+17
| | | | | | | | | | Related to: https://github.com/ruby/ruby/pull/7377 Previously it was believed that there was a problem with a combination of cfuncs + splat + send, but it turns out the same issue happened without send. For example `Integer.sqrt(1, *[])`. The issue was happened not because of send, but because of setting the wrong argc when we don't need to splat any args.
* YJIT: reject large stacks so we can use i8/u8 stack_size and stack_offset ↵Maxime Chevalier-Boisvert2023-03-012-0/+21
| | | | | | | (#7412) * Reject large stacks so we can use i8/u8 stack_size and stack_offset * Add rejection test for iseq too long as well
* YJIT: Use a boxed slice for outgoing branches and cme dependencies (#7409)Takashi Kokubun2023-03-013-30/+50
| | | | | YJIT: Use a boxed slice for outgoing branches and cme dependencies
* YJIT: Compress BranchGenFn and BranchShape (#7401)Takashi Kokubun2023-02-282-157/+127
| | | | | | | | | | * YJIT: Compress BranchGenFn and BranchShape * YJIT: Derive Debug for Branch * YJIT: Capitalize BranchGenFn names Co-authored-by: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com> Co-authored-by: Alan Wu <alansi.xingwu@shopify.com>
* YJIT: Use a boxed slice for gc_obj_offsets (#7397)Takashi Kokubun2023-02-283-11/+24
| | | | | | | | | * YJIT: Use a boxed slice for gc_obj_offsets * YJIT: Stop using Option * YJIT: s/add_counter/incr_counter_by/ Co-authored-by: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>
* Update Rust bindgenMatt Valentine-House2023-02-281-2/+2
|
* YJIT: add defer_empty_count statMaxime Chevalier-Boisvert2023-02-282-0/+6
| | | | Count how often we defer from a block that is empty
* Update YJIT-bindgenMatt Valentine-House2023-02-271-3/+3
|
* YJIT: Detect and reject `send(:alias_for_send, :foo)`Alan Wu2023-02-271-15/+10
| | | | | | | | | | | | | | | | | Previously, YJIT failed to put the stack into the correct shape when `BasicObject#send` calls an alias method for the send method itself. This can manifest as strange `NoMethodError`s in the final non-send receiver, as [seen][1] with the kt-paperclip gem. I also found a case where it makes YJIT fail the stack size assertion while compiling `leave`. YJIT's `BasicObject#__send__` implementation already rejects sends to `send`, but didn't detect sends to aliases of `send`. Adjust the detection and reject these cases. Fixes [Bug #19464] [1]: https://github.com/Shopify/yjit/issues/306
* YJIT: Reject __send__ with splat to cfunc for nowAlan Wu2023-02-272-0/+7
| | | | | | | | | | `make test-spec` revealed this issue after applying an unrelated bug fix. A crashing case is included, though I suspect there are other scenarios where it misbehaves. Don't compile for now. Note that this is *not* an issue on the 3.2.x series; it has `send_args_splat_non_iseq` which already rejects all splats to cfuncs, including sends with splats.
* YJIT: Generate Block::entry_exit with block entry PCAlan Wu2023-02-241-2/+2
| | | | | | | | | | | | | | | | Previously, when Block::entry_exit is requested from any instruction that is not the first one in the block, we generated the exit with an incorrect PC. We should always be using the PC for the entry of the block for Block::entry_exit. It was a simple typo. The bug was [introduced][1] while we were refactoring to use the current backend. Later, we had a chance to spot this issue while [preparing][2] to enable unused variable warnings, but didn't spot the issue. Fixes [Bug #19463] [1]: 27fcab995e6dde19deb91dc6e291bdb72100af68 [2]: 31461c7e0eab4963ccc8649ea8ebf27979132c0c