summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Run cargo test on CirrusTakashi Kokubun2022-08-301-0/+1
|
* Normalize the YJIT Cirrus workflow a littleTakashi Kokubun2022-08-301-2/+1
|
* [rubygems/rubygems] Let `Dir.tmpdir` use the standard pathDavid Rodríguez2022-08-301-2/+0
| | | | | | | | | | | | | | | We're not fully in control of this folder, even when running our own tests, because MJIT creates some temp folders there when invoking GC. This bite tests running in ruby-core when making the behavior of `FileUtils.rm_rf` more strict, because these extra files could not be removed. Since this was originally added due to some failures on systems with non standard permissions on tmp folders, but I can no longer reproduce those, I'll remove it. https://github.com/rubygems/rubygems/commit/d2f21596ee
* Undefine `ruby_debug_log` macro before the function definitionNobuyoshi Nakada2022-08-301-0/+1
| | | | Fix up 27173e3735ff.
* Check only symbol flag bits (#6301)Takashi Kokubun2022-08-291-1/+2
| | | | | * Check only symbol flag bits * Check all 4 bits
* Skip a couple of chroot spec failluresTakashi Kokubun2022-08-291-2/+5
| | | | | I don't come up with a way to fix it right away. We'd need some experiments on a pull request.
* Update to ruby/spec@b8a8240Benoit Daloze2022-08-294-7/+8
|
* Update to ruby/mspec@37151a0Benoit Daloze2022-08-291-1/+2
|
* Fixed width immediates (https://github.com/Shopify/ruby/pull/437)Kevin Newton2022-08-2912-48/+110
| | | | | | | | | | | There are a lot of times when encoding AArch64 instructions that we need to represent an integer value with a custom fixed width. For example, the offset for a B instruction is 26 bits, so we store an i32 on the instruction struct and then mask it when we encode. We've been doing this masking everywhere, which has worked, but it's getting a bit copy-pasty all over the place. This commit centralizes that logic to make sure we stay consistent.
* A64: Only clear icache when writing out new code ↵Alan Wu2022-08-294-2/+25
| | | | | | | | | | | | (https://github.com/Shopify/ruby/pull/442) Previously we cleared the cache for all the code in the system when we flip memory protection, which was prohibitively expensive since the operation is not constant time. Instead, only clear the cache for the memory region of newly written code when we write out new code. This brings the runtime for the 30k_if_else test down to about 6 seconds from the previous 45 seconds on my laptop.
* TBZ and TBNZ for AArch64 (https://github.com/Shopify/ruby/pull/434)Kevin Newton2022-08-293-0/+171
|
* Stop saying it's temp checks (https://github.com/Shopify/ruby/pull/441)Takashi Kokubun2022-08-291-12/+1
|
* LDRH and STRH for AArch64 (https://github.com/Shopify/ruby/pull/438)Kevin Newton2022-08-293-0/+298
|
* Remove ir_ssa.rs as we aren't using it and it's now outdatedMaxime Chevalier-Boisvert2022-08-293-1263/+1
|
* Avoid randomizing the order of test-all on arm64 ↵Takashi Kokubun2022-08-291-1/+1
| | | | | | (https://github.com/Shopify/ruby/pull/440) for now
* Respect RUBY_TESTOPTS on test-all (https://github.com/Shopify/ruby/pull/435)Takashi Kokubun2022-08-292-1/+5
| | | | | | | | * Respect RUBY_TESTOPTS on test-all * Increase the Cirrus timeout * Increase the CSV test timeout
* Update yjit.mdMaxime Chevalier-Boisvert2022-08-291-4/+5
| | | Add VMIL paper, update supported CPUs.
* Add --yjit-dump-disasm to dump every compiled code ↵Takashi Kokubun2022-08-296-41/+91
| | | | | | | | | | | | | | | | (https://github.com/Shopify/ruby/pull/430) * Add --yjit-dump-disasm to dump every compiled code * Just use get_option * Carve out disasm_from_addr * Avoid push_str with format! * Share the logic through asm.compile * This seems to negatively impact the compilation speed
* Various AArch64 optimizations (https://github.com/Shopify/ruby/pull/433)Kevin Newton2022-08-294-6/+27
| | | | | | | | | | * When we're storing an immediate 0 value at a memory address, we can use STUR XZR, Xd instead of loading 0 into a register and then storing that register. * When we're moving 0 into an argument register, we can use MOV Xd, XZR instead of loading the value into a register first. * In the newarray instruction, we can skip looking at the stack at all if the number of values we're using is 0.
* Run tests with --yjit-call-threshold=1 on arm64 ↵Takashi Kokubun2022-08-291-41/+8
| | | | (https://github.com/Shopify/ruby/pull/426)
* Fix and re-enable String to_s, << and unary plus ↵Noah Gibbs2022-08-291-14/+7
| | | | (https://github.com/Shopify/ruby/pull/429)
* Use shorter syntax for the same pattern ↵Alan Wu2022-08-291-42/+42
| | | | (https://github.com/Shopify/ruby/pull/425)
* Better variable name, no must_use on ccall ↵Kevin Newton2022-08-292-3/+2
| | | | (https://github.com/Shopify/ruby/pull/424)
* Run test-all with RUBY_YJIT_ENABLE=1 on CI ↵Takashi Kokubun2022-08-291-1/+2
| | | | (https://github.com/Shopify/ruby/pull/418)
* Instruction enum (https://github.com/Shopify/ruby/pull/423)Kevin Newton2022-08-294-793/+960
| | | | | | | | | | | | | | | | | | | | | | | | | | * Remove references to explicit instruction parts Previously we would reference individual instruction fields manually. We can't do that with instructions that are enums, so this commit removes those references. As a side effect, we can remove the push_insn_parts() function from the assembler because we now explicitly push instruction structs every time. * Switch instructions to enum Instructions are now no longer a large struct with a bunch of optional fields. Instead they are an enum with individual shapes for the variants. In terms of size, the instruction struct was 120 bytes while the new instruction enum is 106 bytes. The bigger win however is that we're not allocating any vectors for instruction operands (except for CCall), which should help cut down on memory usage. Adding new instructions will be a little more complicated going forward, but every mission-critical function that needs to be touched will have an exhaustive match, so the compiler should guide any additions.
* A64 Linux reports aarach64 in RUBY_PLATFORMAlan Wu2022-08-291-1/+1
| | | | This should fix a version string test
* More work toward instruction enum (https://github.com/Shopify/ruby/pull/421)Kevin Newton2022-08-294-73/+403
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Operand iterators There are a couple of times when we're dealing with instructions that we need to iterate through their operands. At the moment this is relatively easy because there's an opnds field and we can work with it directly. When the instructions become enums, however, the shape of each variant will be different so we'll need an iterator to make sense of the shape. This commit introduces two new iterators that are created from an instruction. One iterates over references to each operand (for instances where they don't need to be mutable like updating live ranges) and one iterates over mutable references to each operand (for instances where you need to mutate them like loading values in arm64). Note that because iterators can't have generic items (i.e., be associated with lifetimes) the mutable iterator forces you to use the `while let Some` syntax as opposed to the for-loop like we did with instructions. This commit eliminates the last reference to insn.opnds, which is going to make it much easier to transition to an enum. * Consolidate output operand fetching Currently we always look at the .out field on instructions whenever we want to access the output operand. When the instructions become an enum, this is not going to be possible since the shape of the variants will be different. Instead, this commit introduces two functions on Insn: out_opnd() and out_opnd_mut(). These return an Option containing a reference to the output operand and a mutable reference to the output operand, respectively. This commit then uses those functions to replace all instances of accessing the output operand. For the most part this was straightforward; when we previously checked if it was Opnd::None we now check that it's None, when we assumed there was an output operand we now unwrap.
* Use VALUE for callinfos that are on the heap ↵Alan Wu2022-08-291-1/+4
| | | | | | | | | | | (https://github.com/Shopify/ruby/pull/420) Yet another case of `jit_mov_gc_ptr()` being yanked out during the transition to the new backend, causing a crash after object movement. The intresting wrinkle with this one is that not all callinfos are GC'ed objects, so the old code had an implicit assumption. https://github.com/ruby/ruby/blob/b0b9f7201acab05c2a3ad92c3043a1f01df3e17f/yjit/src/codegen.rs#L4087-L4095
* Avoid marking op_type on gen_defined (https://github.com/Shopify/ruby/pull/419)Takashi Kokubun2022-08-292-2/+2
|
* Use VALUE for block_iseq (https://github.com/Shopify/ruby/pull/417)Takashi Kokubun2022-08-291-1/+1
| | | | Co-authored-by: Alan Wu <alansi.xingwu@shopify.com>
* Fix a bus error on regenerate_branch (https://github.com/Shopify/ruby/pull/408)Takashi Kokubun2022-08-295-22/+52
| | | | | | * Fix a bus error on regenerate_branch * Fix pad_size
* Even more prep for instruction enum (https://github.com/Shopify/ruby/pull/413)Kevin Newton2022-08-293-340/+367
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Mutate in place for register allocation Currently we allocate a new instruction every time when we're doing register allocation by first splitting up the instruction into its component parts, mapping the operands and the output, and then pushing all of its parts onto the new assembler. Since we don't need the old instruction, we can mutate the existing one in place. While it's not that big of a win in and of itself, it matches much more closely to what we're going to have to do when we switch the instruction from being a struct to being an enum, because it's much easier for the instruction to modify itself since it knows its own shape than it is to push a new instruction that very closely matches. * Mutate in place for arm64 split When we're splitting instructions for the arm64 backend, we map all of the operands for a given instruction when it has an Opnd::Value. We can do this in place with the existing operand instead of allocating a new vector each time. This enables us to pattern match against the entire instruction instead of just the opcode, which is much closer to matching against an enum. * Match against entire instruction in arm64_emit Instead of matching against the opcode and then accessing all of the various fields on the instruction when emitting bytecode for arm64, we should instead match against the entire instruction. This makes it much closer to what's going to happen when we switch it over to being an enum. * Match against entire instruction in x86_64 backend When we're splitting or emitting code for x86_64, we should match against the entire instruction instead of matching against just the opcode. This gets us closer to matching against an enum instead of a struct. * Reuse instructions for arm64_split When we're splitting, the default behavior was previously to split up the instruction into its component parts and then reassemble them in a new instruction. Instead, we can reuse the existing instruction.
* Only check lowest bit for _Bool type (https://github.com/Shopify/ruby/pull/412)Alan Wu2022-08-291-2/+3
| | | | | | | | | | | | * Only check lowest bit for _Bool type The `test AL, AL` got lost during porting and we were generating `test RAX, RAX` instead. The upper bits of a `_Bool` return type is unspecified and we were failing `TestClass#test_singleton_class_should_has_own_namespace` due to interpreterting the return value incorrectly. * Enable test_class for test-all on x86_64
* Build output operands explicitly (https://github.com/Shopify/ruby/pull/411)Kevin Newton2022-08-291-65/+116
| | | | | | | | | | | | | | | | | | When we're pushing instructions onto the assembler, we previously would iterate through the instruction's operands and then assign the output operand to it through the push_insn function. This is easy when all instructions have a vector of operands, but is much more difficult when the shape differs in an enum. This commit changes it so that we explicitly define the output operand for each instruction before it gets pushed onto the assembler. This has the added benefit of changing the definition of push_insn to no longer require a mutable instruction. This paves the way to make the out field on the instructions an Option<Opnd> instead which is going to more accurately reflect the behavior we're going to have once we switch the instructions over to an enum instead of a struct.
* Instruction builders for backend IR (https://github.com/Shopify/ruby/pull/410)Kevin Newton2022-08-293-197/+246
| | | | | | | | | Currently we use macros to define the shape of each of the instruction building methods. This works while all of the instructions share the same fields, but is really hard to get working when they're an enum with different shapes. This is an incremental step toward a bigger refactor of changing the Insn from a struct to an enum.
* Fix issue with expandarray, add missing jl, enable tests ↵Maxime Chevalier-Boisvert2022-08-294-1/+14
| | | | (https://github.com/Shopify/ruby/pull/409)
* Allow aarch64 to build YJITTakashi Kokubun2022-08-291-2/+2
|
* Temporarily disable rb_str_concat, add CI tests ↵Maxime Chevalier-Boisvert2022-08-292-3/+10
| | | | | | (https://github.com/Shopify/ruby/pull/407) Make sure we can load the test-all runner and run test_yjit.rb
* Port jit_rb_str_concat to new backend, re-enable cfunc lookup ↵Noah Gibbs (and/or Benchmark CI)2022-08-292-52/+45
| | | | (https://github.com/Shopify/ruby/pull/402)
* YJIT: Implement concatarray in yjit (https://github.com/Shopify/ruby/pull/405)Maple Ong2022-08-294-0/+46
| | | | | | | | | | | | | | | | * Create code generation func * Make rb_vm_concat_array available to use in Rust * Map opcode to code gen func * Implement code gen for concatarray * Add test for concatarray * Use new asm backend * Add comment to C func wrapper
* Use bindgen for old manual extern declarations ↵Alan Wu2022-08-295-207/+337
| | | | | | | | | | | (https://github.com/Shopify/ruby/pull/404) We have a large extern block in cruby.rs leftover from the port. We can use bindgen for it now and reserve the manual declaration for just a handful of vm_insnhelper.c functions. Fixup a few minor discrepencies bindgen found between the C declaration and the manual declaration. Mostly missing `const` on the C side.
* Optimize bitmask immediates (https://github.com/Shopify/ruby/pull/403)Kevin Newton2022-08-291-77/+18
|
* AArch64 Ruby immediates (https://github.com/Shopify/ruby/pull/400)Kevin Newton2022-08-291-14/+52
|
* Fix bugs in gen_opt_getinlinecacheMaxime Chevalier-Boisvert2022-08-291-8/+11
|
* Port opt_getinlinecache to the new backend ↵Zack Deveau2022-08-291-15/+24
| | | | (https://github.com/Shopify/ruby/pull/399)
* Fix test_rubyoptions.rb for arm64 (https://github.com/Shopify/ruby/pull/396)Takashi Kokubun2022-08-291-1/+1
|
* Enable skipdata on Capstone to allow embedded data without early stop to ↵Noah Gibbs2022-08-291-2/+4
| | | | disasm (https://github.com/Shopify/ruby/pull/398)
* Op::Xor for backend IR (https://github.com/Shopify/ruby/pull/397)Kevin Newton2022-08-296-2/+88
|
* Fix code invalidation while OOM and OOM simulation ↵Alan Wu2022-08-293-8/+17
| | | | | | | | | | | | | | | | | | | | (https://github.com/Shopify/ruby/pull/395) `YJIT.simulate_oom!` used to leave one byte of space in the code block, so our test didn't expose a problem with asserting that the write position is in bounds in `CodeBlock::set_pos`. We do the following when patching code: 1. save current write position 2. seek to middle of the code block and patch 3. restore old write position The bounds check fails on (3) when the code block is already filled up. Leaving one byte of space also meant that when we write that byte, we need to fill the entire code region with trapping instruction in `VirtualMem`, which made the OOM tests unnecessarily slow. Remove the incorrect bounds check and stop leaving space in the code block when simulating OOM.
* Port opt_aref and opt_aset to the new backend IR ↵Takashi Kokubun2022-08-291-66/+54
| | | | | | | | (https://github.com/Shopify/ruby/pull/387) * Port opt_aref and opt_aset to the new backend IR * Recompute memory operands