summaryrefslogtreecommitdiff
path: root/compile.c
AgeCommit message (Collapse)Author
2021-10-24suppress warnings for probable NULL dererefencesNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/5015
2021-10-21`RubyVM.keep_script_lines`Koichi Sasada
`RubyVM.keep_script_lines` enables to keep script lines for each ISeq and AST. This feature is for debugger/REPL support. ```ruby RubyVM.keep_script_lines = true RubyVM::keep_script_lines = true eval("def foo = nil\ndef bar = nil") pp RubyVM::InstructionSequence.of(method(:foo)).script_lines ``` Notes: Merged: https://github.com/ruby/ruby/pull/4913
2021-10-20Simplify code for YJIT const cache in compile.cAlan Wu
Since opt_getinlinecache and opt_setinlinecache point to the same cache struct, there is no need to track the index of the get instruction and then store it on the cache struct later when processing the set instruction. Setting it when processing the get instruction works just as well. This change reduces our diff.
2021-10-20Fix changes from rebaseNoah Gibbs
2021-10-20Simpler fix for -DUSE_EMBED_CI=0Alan Wu
Nobu pointed out that saving the old ci to a local is enough to keep it reachable.
2021-10-20Revert "Fix use-after-free on USE_EMBED_CI=0"Alan Wu
This reverts commit 1e0f2e4b09ca9443524acf4b50ffd50a80f330f3.
2021-10-20Fix use-after-free on USE_EMBED_CI=0Alan Wu
The old code didn't keep old_operands[0] reachable while allocating. You can crash it by requiring erb under GC stress mode.
2021-10-20YJIT: Fancier opt_getinlinecacheAlan Wu
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.
2021-10-20Refactor uJIT code into more files for readabilityMaxime Chevalier-Boisvert
2021-10-20MicroJIT: compile after ten callsAlan Wu
2021-10-20Implement the --disable-ujit command line optionAlan Wu
2021-10-20Avoid triggering GC while translating threaded codeAlan Wu
2021-10-20Avoid recompiling overlapping instruction sequences in ujitMaxime Chevalier-Boisvert
2021-10-20Generate multiple copies of native code for `pop`Alan Wu
Insert generated addresses into st_table for mapping native code addresses back to info about VM instructions. Export `encoded_insn_data` to do this. Also some style fixes.
2021-10-20Add new files, ujit_compile.c, ujit_compile.hMaxime Chevalier-Boisvert
2021-10-20Added shift instructionsMaxime Chevalier-Boisvert
2021-10-20Yeah, this actually works!Alan Wu
2021-10-20Cast to void pointer for `%p` in commented out code [ci skip]Nobuyoshi Nakada
2021-10-07Dump outer variables tables when dumping an iseq to binaryAaron Patterson
This commit dumps the outer variables table when dumping an iseq to binary. This fixes a case where Ractors aren't able to tell what outer variables belong to a lambda after the lambda is loaded via ISeq.load_from_binary [Bug #18232] [ruby-core:105504] Notes: Merged: https://github.com/ruby/ruby/pull/4942
2021-10-03Using NIL_P macro instead of `== Qnil`S.H
Notes: Merged: https://github.com/ruby/ruby/pull/4925 Merged-By: nobu <nobu@ruby-lang.org>
2021-09-12Using RB_FLOAT_TYPE_P macroS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/4821
2021-09-11Using SYMBOL_P macroS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/4798
2021-09-10Remove unused argumentNobuyoshi Nakada
2021-09-10suppress GCC's -Wsuggest-attribute=format卜部昌平
I was not aware of this because I use clang these days. Notes: Merged: https://github.com/ruby/ruby/pull/4815
2021-09-05Replace RBOOL macroS-H-GAMELINKS
Notes: Merged: https://github.com/ruby/ruby/pull/4791
2021-09-01Extract compile_attrasgn from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_kw_arg from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_errinfo from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_dots from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_colon3 from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_colon2 from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_match from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_yield from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_super from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_op_log from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_op_cdecl from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_op_asgn2 from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-09-01Extract compile_op_asgn1 from iseq_compile_each0Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4795
2021-08-31Remove no longer used variable line_nodeNobuyoshi Nakada
2021-08-31Extract compile_block from iseq_compile_each0Nobuyoshi Nakada
And constify `node` argument of `iseq_compile_each0`.
2021-08-31Constify line_node in iseq_compile_each0Nobuyoshi Nakada
2021-08-21Allow tracing of optimized methodsJeremy Evans
This updates the trace instructions to directly dispatch to opt_send_without_block. So this should cause no slowdown in non-trace mode. To enable the tracing of the optimized methods, RUBY_EVENT_C_CALL and RUBY_EVENT_C_RETURN are added as events to the specialized instructions. Fixes [Bug #14870] Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com> Notes: Merged: https://github.com/ruby/ruby/pull/4739 Merged-By: jeremyevans <code@jeremyevans.net>
2021-08-15Show verbose error messages when single pattern match failsKazuki Tsujimoto
[0] => [0, *, a] #=> [0] length mismatch (given 1, expected 2+) (NoMatchingPatternError) Ignore test failures of typeprof caused by this change for now.
2021-07-29Fix use-after-free on -DUSE_EMBED_CI=0Alan Wu
On -DUSE_EMBED_CI=0, there are more GC allocations and the old code didn't keep old_operands[0] reachable while allocating. On a Debian based system, I get a crash requiring erb under GC stress mode. On macOS, tool/transcode-tblgen.rb runs incorrectly if I put GC.stress=true as the first line. Notes: Merged: https://github.com/ruby/ruby/pull/4662 Merged-By: XrXr
2021-07-15Add pattern matching pin support for instance/class/global variablesJeremy Evans
Pin matching for local variables and constants is already supported, and it is fairly simple to add support for these variable types. Note that pin matching for method calls is still not supported without wrapping in parentheses (pin expressions). I think that's for the best as method calls are far more complex (arguments/blocks). Implements [Feature #17724] Notes: Merged: https://github.com/ruby/ruby/pull/4502
2021-07-06Store the dup'd CDHASH in the object list during IBF loadAaron Patterson
Since b2fc592c304 nothing was holding a reference to the dup'd CDHASH during IBF loading. If a GC happened to run during IBF load then the copied hash wouldn't have anything to keep it alive. We don't really want to keep the originally loaded CDHASH hash, so this patch just overwrites the original hash with the copied / modified hash. [Bug #17984] [ruby-core:104259] Notes: Merged: https://github.com/ruby/ruby/pull/4630
2021-06-23Check type of instruction - can be INSN or ADJUSTeileencodes
If the type is ADJUST we don't want to treat it like an INSN so we have to check the type before reading from `insn_info.events`. [Bug #18001] [ruby-core:104371] Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org> Notes: Merged: https://github.com/ruby/ruby/pull/4601
2021-06-18Add a cache for class variableseileencodes
Redo of 34a2acdac788602c14bf05fb616215187badd504 and 931138b00696419945dc03e10f033b1f53cd50f3 which were reverted. GitHub PR #4340. This change implements a cache for class variables. Previously there was no cache for cvars. Cvar access is slow due to needing to travel all the way up th ancestor tree before returning the cvar value. The deeper the ancestor tree the slower cvar access will be. The benefits of the cache are more visible with a higher number of included modules due to the way Ruby looks up class variables. The benchmark here includes 26 modules and shows with the cache, this branch is 6.5x faster when accessing class variables. ``` compare-ruby: ruby 3.1.0dev (2021-03-15T06:22:34Z master 9e5105c) [x86_64-darwin19] built-ruby: ruby 3.1.0dev (2021-03-15T12:12:44Z add-cache-for-clas.. c6be009) [x86_64-darwin19] | |compare-ruby|built-ruby| |:--------|-----------:|---------:| |vm_cvar | 5.681M| 36.980M| | | -| 6.51x| ``` Benchmark.ips calling `ActiveRecord::Base.logger` from within a Rails application. ActiveRecord::Base.logger has 71 ancestors. The more ancestors a tree has, the more clear the speed increase. IE if Base had only one ancestor we'd see no improvement. This benchmark is run on a vanilla Rails application. Benchmark code: ```ruby require "benchmark/ips" require_relative "config/environment" Benchmark.ips do |x| x.report "logger" do ActiveRecord::Base.logger end end ``` Ruby 3.0 master / Rails 6.1: ``` Warming up -------------------------------------- logger 155.251k i/100ms Calculating ------------------------------------- ``` Ruby 3.0 with cvar cache / Rails 6.1: ``` Warming up -------------------------------------- logger 1.546M i/100ms Calculating ------------------------------------- logger 14.857M (± 4.8%) i/s - 74.198M in 5.006202s ``` Lastly we ran a benchmark to demonstate the difference between master and our cache when the number of modules increases. This benchmark measures 1 ancestor, 30 ancestors, and 100 ancestors. Ruby 3.0 master: ``` Warming up -------------------------------------- 1 module 1.231M i/100ms 30 modules 432.020k i/100ms 100 modules 145.399k i/100ms Calculating ------------------------------------- 1 module 12.210M (± 2.1%) i/s - 61.553M in 5.043400s 30 modules 4.354M (± 2.7%) i/s - 22.033M in 5.063839s 100 modules 1.434M (± 2.9%) i/s - 7.270M in 5.072531s Comparison: 1 module: 12209958.3 i/s 30 modules: 4354217.8 i/s - 2.80x (± 0.00) slower 100 modules: 1434447.3 i/s - 8.51x (± 0.00) slower ``` Ruby 3.0 with cvar cache: ``` Warming up -------------------------------------- 1 module 1.641M i/100ms 30 modules 1.655M i/100ms 100 modules 1.620M i/100ms Calculating ------------------------------------- 1 module 16.279M (± 3.8%) i/s - 82.038M in 5.046923s 30 modules 15.891M (± 3.9%) i/s - 79.459M in 5.007958s 100 modules 16.087M (± 3.6%) i/s - 81.005M in 5.041931s Comparison: 1 module: 16279458.0 i/s 100 modules: 16087484.6 i/s - same-ish: difference falls within error 30 modules: 15891406.2 i/s - same-ish: difference falls within error ``` Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org> Notes: Merged: https://github.com/ruby/ruby/pull/4544
2021-06-18Enable USE_ISEQ_NODE_ID by defaultYusuke Endoh
... which is formally called EXPERIMENTAL_ISEQ_NODE_ID. See also ff69ef27b06eed1ba750e7d9cab8322f351ed245. https://bugs.ruby-lang.org/issues/17930 Notes: Merged: https://github.com/ruby/ruby/pull/4558
2021-06-18Make it possible to get AST::Node from Thread::Backtrace::LocationYusuke Endoh
RubyVM::AST.of(Thread::Backtrace::Location) returns a node that corresponds to the location. Typically, the node is a method call, but not always. This change also includes iseq's dump/load support of node_ids for each instructions. Notes: Merged: https://github.com/ruby/ruby/pull/4558