aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
Commit message (Collapse)AuthorAgeFilesLines
* Remove `NODE_DASGN_CURR` [Feature #18406]Nobuyoshi Nakada2021-12-131-8/+4
| | | | | | | This `NODE` type was used in pre-YARV implementation, to improve the performance of assignment to dynamic local variable defined at the innermost scope. It has no longer any actual difference with `NODE_DASGN`, except for the node dump.
* Avoid Array allocation when appending to args array (#5211)John Hawthorn2021-12-071-12/+44
| | | | | | | | | | | | | | | | | | | | | | | * Use duparray when possible for argspush ARGSPUSH is the node we see with a single value pushed to the end of a splatted array. ARGSCAT is similar, but is used when multiple values are being concatenated to the list. Previously only ARGSCAT had an optimization where when all the values were static it would use duparray instead of newarray to create the intermediate array. This commit adds similar behaviour for ARGSPUSH, using duparray instead of putobject/newarray. * Replace duparray with putobject before concatarray When performing duparray/concatarray we know we'll never use the intermediate array being created by duparray, so we should be able to use it as a temporary object. This avoids an extra array allocation for NODE_ARGSPUSH (ex. [*foo, 1]) and NODE_ARGSCAT (ex. [*foo, 1, 2]).
* Add `nd_type_p` macroS.H2021-12-041-45/+45
|
* Assign temporary ID to anonymous ID [Bug #18250]Nobuyoshi Nakada2021-11-231-0/+1
| | | | | | | | Dumped iseq binary can not have unnamed symbols/IDs, and ID 0 is stored instead. As `struct rb_id_table` disallows ID 0, also for the distinction, re-assign a new temporary ID based on the local variable table index when loading from the binary, as well as the parser.
* Refactor hacky ID tables to struct rb_ast_id_table_tYusuke Endoh2021-11-211-16/+12
| | | | | | | | | The implementation of a local variable tables was represented as `ID*`, but it was very hacky: the first element is not an ID but the size of the table, and, the last element is (sometimes) a link to the next local table only when the id tables are a linked list. This change converts the hacky implementation to a normal struct.
* optimize `Struct` getter/setterKoichi Sasada2021-11-191-95/+0
| | | | | Introduce new optimized method type `OPTIMIZED_METHOD_TYPE_STRUCT_AREF/ASET` with index information.
* Optimize dynamic string interpolation for symbol/true/false/nil/0-9Jeremy Evans2021-11-181-12/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This provides a significant speedup for symbol, true, false, nil, and 0-9, class/module, and a small speedup in most other cases. Speedups (using included benchmarks): :symbol :: 60% 0-9 :: 50% Class/Module :: 50% nil/true/false :: 20% integer :: 10% [] :: 10% "" :: 3% One reason this approach is faster is it reduces the number of VM instructions for each interpolated value. Initial idea, approach, and benchmarks from Eric Wong. I applied the same approach against the master branch, updating it to handle the significant internal changes since this was first proposed 4 years ago (such as CALL_INFO/CALL_CACHE -> CALL_DATA). I also expanded it to optimize true/false/nil/0-9/class/module, and added handling of missing methods, refined methods, and RUBY_DEBUG. This renames the tostring insn to anytostring, and adds an objtostring insn that implements the optimization. This requires making a few functions non-static, and adding some non-static functions. This disables 4 YJIT tests. Those tests should be reenabled after YJIT optimizes the new objtostring insn. Implements [Feature #13715] Co-authored-by: Eric Wong <e@80x24.org> Co-authored-by: Alan Wu <XrXr@users.noreply.github.com> Co-authored-by: Yusuke Endoh <mame@ruby-lang.org> Co-authored-by: Koichi Sasada <ko1@atdot.net>
* compile.c: remove dead codeYusuke Endoh2021-11-181-1/+0
|
* compile.c: Fix typoYusuke Endoh2021-11-181-1/+1
|
* `Primitive.mandatory_only?` for fast pathKoichi Sasada2021-11-151-0/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Compare with the C methods, A built-in methods written in Ruby is slower if only mandatory parameters are given because it needs to check the argumens and fill default values for optional and keyword parameters (C methods can check the number of parameters with `argc`, so there are no overhead). Passing mandatory arguments are common (optional arguments are exceptional, in many cases) so it is important to provide the fast path for such common cases. `Primitive.mandatory_only?` is a special builtin function used with `if` expression like that: ```ruby def self.at(time, subsec = false, unit = :microsecond, in: nil) if Primitive.mandatory_only? Primitive.time_s_at1(time) else Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in)) end end ``` and it makes two ISeq, ``` def self.at(time, subsec = false, unit = :microsecond, in: nil) Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in)) end def self.at(time) Primitive.time_s_at1(time) end ``` and (2) is pointed by (1). Note that `Primitive.mandatory_only?` should be used only in a condition of an `if` statement and the `if` statement should be equal to the methdo body (you can not put any expression before and after the `if` statement). A method entry with `mandatory_only?` (`Time.at` on the above case) is marked as `iseq_overload`. When the method will be dispatch only with mandatory arguments (`Time.at(0)` for example), make another method entry with ISeq (2) as mandatory only method entry and it will be cached in an inline method cache. The idea is similar discussed in https://bugs.ruby-lang.org/issues/16254 but it only checks mandatory parameters or more, because many cases only mandatory parameters are given. If we find other cases (optional or keyword parameters are used frequently and it hurts performance), we can extend the feature.
* Fix script_lines in loaded iseq as nilNobuyoshi Nakada2021-10-291-1/+2
|
* suppress warnings for probable NULL dererefencesNobuyoshi Nakada2021-10-241-0/+1
|
* `RubyVM.keep_script_lines`Koichi Sasada2021-10-211-1/+1
| | | | | | | | | | | | | | `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 ```
* Simplify code for YJIT const cache in compile.cAlan Wu2021-10-201-24/+11
| | | | | | | | | | 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.
* Fix changes from rebaseNoah Gibbs2021-10-201-1/+1
|
* Simpler fix for -DUSE_EMBED_CI=0Alan Wu2021-10-201-2/+2
| | | | | Nobu pointed out that saving the old ci to a local is enough to keep it reachable.
* Revert "Fix use-after-free on USE_EMBED_CI=0"Alan Wu2021-10-201-12/+7
| | | | This reverts commit 1e0f2e4b09ca9443524acf4b50ffd50a80f330f3.
* Fix use-after-free on USE_EMBED_CI=0Alan Wu2021-10-201-7/+11
| | | | | The old code didn't keep old_operands[0] reachable while allocating. You can crash it by requiring erb under GC stress mode.
* YJIT: Fancier opt_getinlinecacheAlan Wu2021-10-201-2/+32
| | | | | | | 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.
* Refactor uJIT code into more files for readabilityMaxime Chevalier-Boisvert2021-10-201-1/+0
|
* MicroJIT: compile after ten callsAlan Wu2021-10-201-36/+6
|
* Implement the --disable-ujit command line optionAlan Wu2021-10-201-2/+2
|
* Avoid triggering GC while translating threaded codeAlan Wu2021-10-201-7/+20
|
* Avoid recompiling overlapping instruction sequences in ujitMaxime Chevalier-Boisvert2021-10-201-7/+15
|
* Generate multiple copies of native code for `pop`Alan Wu2021-10-201-1/+1
| | | | | | 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.
* Add new files, ujit_compile.c, ujit_compile.hMaxime Chevalier-Boisvert2021-10-201-8/+7
|
* Added shift instructionsMaxime Chevalier-Boisvert2021-10-201-6/+12
|
* Yeah, this actually works!Alan Wu2021-10-201-0/+5
|
* Cast to void pointer for `%p` in commented out code [ci skip]Nobuyoshi Nakada2021-10-201-4/+4
|
* Dump outer variables tables when dumping an iseq to binaryAaron Patterson2021-10-071-1/+54
| | | | | | | | 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]
* Using NIL_P macro instead of `== Qnil`S.H2021-10-031-1/+1
|
* Using RB_FLOAT_TYPE_P macroS-H-GAMELINKS2021-09-121-2/+2
|
* Using SYMBOL_P macroS-H-GAMELINKS2021-09-111-2/+2
|
* Remove unused argumentNobuyoshi Nakada2021-09-101-1/+1
|
* suppress GCC's -Wsuggest-attribute=format卜部昌平2021-09-101-2/+2
| | | | I was not aware of this because I use clang these days.
* Replace RBOOL macroS-H-GAMELINKS2021-09-051-2/+2
|
* Extract compile_attrasgn from iseq_compile_each0Nobuyoshi Nakada2021-09-011-84/+89
|
* Extract compile_kw_arg from iseq_compile_each0Nobuyoshi Nakada2021-09-011-32/+37
|
* Extract compile_errinfo from iseq_compile_each0Nobuyoshi Nakada2021-09-011-24/+30
|
* Extract compile_dots from iseq_compile_each0Nobuyoshi Nakada2021-09-011-23/+30
|
* Extract compile_colon3 from iseq_compile_each0Nobuyoshi Nakada2021-09-011-25/+32
|
* Extract compile_colon2 from iseq_compile_each0Nobuyoshi Nakada2021-09-011-42/+49
|
* Extract compile_match from iseq_compile_each0Nobuyoshi Nakada2021-09-011-34/+40
|
* Extract compile_yield from iseq_compile_each0Nobuyoshi Nakada2021-09-011-48/+46
|
* Extract compile_super from iseq_compile_each0Nobuyoshi Nakada2021-09-011-132/+140
|
* Extract compile_op_log from iseq_compile_each0Nobuyoshi Nakada2021-09-011-39/+46
|
* Extract compile_op_cdecl from iseq_compile_each0Nobuyoshi Nakada2021-09-011-66/+73
|
* Extract compile_op_asgn2 from iseq_compile_each0Nobuyoshi Nakada2021-09-011-104/+111
|
* Extract compile_op_asgn1 from iseq_compile_each0Nobuyoshi Nakada2021-09-011-134/+139
|
* Remove no longer used variable line_nodeNobuyoshi Nakada2021-08-311-258/+257
|