Граф коммитов

69045 Коммитов

Автор SHA1 Сообщение Дата
Alan Wu 6883aeda77 Add a macro for tweaking default call threshold
For use in development for writing `test.rb` and running with `make
run`.
2021-10-20 18:19:36 -04:00
John Hawthorn 71560f8804 Add opt_size and opt_length 2021-10-20 18:19:36 -04:00
John Hawthorn e4bf905a28 Use an st_table for optimized method codegen
We recently added the ability to optimize a known cfunc with custom code
generation for it.

Previously we performed this lookup with a switch statement on the
address of the c function being called. This commit swaps that out for a
hash lookup on the method definition. For now I've kept this limited
this to cfuncs, but it wouldn't take significant changes to make this
work for other method types.

This implemenation is similar to how the interpreter keeps track of
which BOPs (basic operations) are redefined

This has a few advantages:
- Doesn't the C function's symbol to be exported (they're often static)
- This could support VM_METHOD_TYPE_OPTIMIZED in the future.
- This could support VM_METHOD_TYPE_ISEQ in the future. Kernel#class
  would be a good candidate for this since to yjit it will just be a
  constant push as we already know the class through BBV.
- Slightly cleaner to declare
- Less tightly coupled to each method's implementation

And a couple minor trade-offs:
- The looser coupling could be seen as a disadvantage (I don't think so,
- If a cfunc is defined multiple times we would need to declare it on
  each definition. ex. BasicObject#== and BasicObject#equal?. This is
  rare compared to using an alias.
2021-10-20 18:19:36 -04:00
Maxime Chevalier-Boisvert 7030cae969 Try running with more YJIT options in CI to surface more bugs 2021-10-20 18:19:36 -04:00
Aaron Patterson b63fcafbc9 Make jumps dashed and falls solid 2021-10-20 18:19:36 -04:00
Aaron Patterson 089ad6dc78 Clean graph formatting 2021-10-20 18:19:36 -04:00
Aaron Patterson 46d5e10279 Add graphviz output
This adds a method to blocks to get outgoing ids, then uses the outgoing
ids to generate a graphviz graph.  Two methods were added to the Block
object.  One method returns an id for the block, which is just the
address of the underlying block.  The other method returns a list of
outgoing block ids.  We can use Block#id in conjunction with
Block#outgoing_ids to construct a graph of blocks
2021-10-20 18:19:36 -04:00
Maxime Chevalier-Boisvert f54e6e1310 Update comment 2021-10-20 18:19:36 -04:00
Aaron Patterson 30f20d7c38 Remove some MicroJIT vestiges
Just happened to run across this, so lets fix them
2021-10-20 18:19:36 -04:00
Alan Wu 0cd3b97e02 Handle non-material empty singleton class properly
As an optimization, multiple objects could share the same singleton
class. The optimization introduced in 6698e43393
wasn't handling this correctly so was generating guards that never pass
for the inputs we defer compilation to wait for. After generating
identical code multiple times and failing, the call site is falsely
recognized as megamorphic and it side exits. See disassembly for the
following before this commit:

    def foo(obj)
      obj.itself
    end

    o = Object.new.singleton_class
    foo(o)
    puts YJIT.disasm(method(:foo))

See also: comment in rb_singleton_class_clone_and_attach().
2021-10-20 18:19:36 -04:00
Alan Wu 89110590a3 Disable invokesuper codegen for now. Add test
The added test fails with SystemStackError with --yjit-call-threshold=1.
2021-10-20 18:19:36 -04:00
Alan Wu da20ff1644 Fix bug in generic case for gen_checktype
When checking for T_HASH, which is Qnil and when the type check succeeds
we were outputting to the stack a Qnil instead of a Qtrue.
2021-10-20 18:19:36 -04:00
John Hawthorn 7d252186fe Simplify known class check for singletons
Singleton classes should only ever be attached to one object. This means
that checking for the object should be the same as checking for the
class. This should be slightly faster by avoiding one memory acccess as
well as allowing us to skip checking if the receiver is a heap object.

This will be most common for calling class methods.
2021-10-20 18:19:36 -04:00
Alan Wu 8c68f112d8 Delay and be selective about when to discard local types
jit_rb_obj_not() wants to access the type information of the receiver,
but we were discarding type info of locals before jit_rb_obj_not() runs
unncessarily.

There are also cases we are unncessarily discarding local type info. For
example, ivar reader and setter methods can never change local
variables.
2021-10-20 18:19:36 -04:00
Alan Wu 936ee55562 Improve opt_not by expanding cfunc codegen
This commit improves opt_not by making it correct when TrueClass#!
and/or FalseClass#! is defined and genearting better code when the
receiver is a heap object.

guard_known_class() can now handle true, false, and nil, and we
introduce a codegen function reimplementing rb_obj_not(), used when we
know we are calling into rb_obj_not().

Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
Co-authored-by: Noah Gibbs <the.codefolio.guy@gmail.com>
2021-10-20 18:19:36 -04:00
John Hawthorn 78f64d14d4 Add invokebuiltin_delegate_leave
invokebuiltin_delegate can be run in place of
invokebuiltin_delegate_leave because there is always a leave instruction
afterwards (the interpreter takes advantage of this as well when
rewriting iseqs for tracing).
2021-10-20 18:19:36 -04:00
John Hawthorn b93f59ced0 Implement invokebuiltin_delegate
invokebuiltin_delegate is a special version of invokebuiltin used for
sending a contiguous subset of the current method's locals.

In some cases YJIT would already handle this for trivial cases it could
be inlined, implementing this OP allows it to work when the method isn't
inlinable (not marked as 'inline', does more than just call, not called
from yjit, etc).
2021-10-20 18:19:36 -04:00
Jean Boussier d416a15c86 Warn rather than raise when --yjit-stats is ignored 2021-10-20 18:19:36 -04:00
John Hawthorn f16ec70e4f Allow yjit.rb to work with frozen strings 2021-10-20 18:19:36 -04:00
Noah Gibbs d1d3d2c0aa If --yjit-stats is given without RUBY_DEBUG, that should be an error. 2021-10-20 18:19:36 -04:00
Maxime Chevalier-Boisvert 364cdda0f1 Fix compiler warning 2021-10-20 18:19:36 -04:00
Jean Boussier 3365e1d719 Allow to enable `--yjit-stats` via a env variable 2021-10-20 18:19:36 -04:00
Aaron Patterson 9043ad3d74 Implement topn instruction
This commit implements the topn instruction

Co-Authored-By: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>
Co-Authored-By: Noah Gibbs <noah.gibbs@shopify.com>
2021-10-20 18:19:36 -04:00
John Hawthorn 986b9b47d1 Better comments 2021-10-20 18:19:36 -04:00
John Hawthorn 0a3ee8b2e3 Avoid looping on invokesuper on module included multiple times 2021-10-20 18:19:36 -04:00
John Hawthorn 3fedf8329d Check for refinements in gen_invokesuper 2021-10-20 18:19:36 -04:00
John Hawthorn 0fb2926097 Guard against implicitly forwarded block 2021-10-20 18:19:36 -04:00
Maxime Chevalier-Boisvert ecd4487a48 Remove #define MAX_VERSIONS, now using command-line option 2021-10-20 18:19:36 -04:00
John Hawthorn 83c7f27ade Add invokesuper 2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 99341d4a18 Fix issue in yjit_free_block causing segfault
This addresses issue #55
2021-10-20 18:19:35 -04:00
John Hawthorn 67c2cdc59a Implement gen_getlocal
This extracts the generation code from getlocal_wc1, since this is the
same just with more loops inside vm_get_ep.
2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 5432f46f6a Can't add comments to the outlined code block 2021-10-20 18:19:35 -04:00
John Hawthorn ed636b59ed Add duparray to YJIT codegen 2021-10-20 18:19:35 -04:00
John Hawthorn d77c989ac7 Fix check for leaf invokebuiltin
Also added a comment when inlining a leaf builtin
2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 9a55fd37c9 Update README.md 2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 43acb9d7f0 Update README.md 2021-10-20 18:19:35 -04:00
Alan Wu cdc9cb6e97 Stylize macOS correctly
Yes, it's all very confusing.
2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 7dc497e158 Update README.md 2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert b1fab663eb Update README.md 2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 860589c7fa Use builtin_inline_p to avoid pushing a frame for primitive C methods (#63)
* Use builtin_inline_p to skip a frame of C methods

* Fix bugs in primitive cfunc call code

* Remove if (push_frame) {}

* Remove if (push_frame) {}

* Push Aaron's fix to avoid hardcoding insn lengths

Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
2021-10-20 18:19:35 -04:00
Aaron Patterson 9f46e6e64b Disable YJIT while running MJIT tests (#62)
Two JITs running at once may result in strange interactions.  Lets
disable YJIT while running the MJIT tests.
2021-10-20 18:19:35 -04:00
John Hawthorn ea33b0a9ba Add concatstrings to yjit codegen (#58)
* Add ETYPE_TRUE and ETYPE_FALSE

* Implement checktype

* Implement concatstrings

* Update deps
2021-10-20 18:19:35 -04:00
John Hawthorn eb6e5be038 Add newhash and newarray instructions to yjit codegen (#48)
* Implement gen_newarray

* Implement newhash for n=0

* Add yjit tests for newhash/newarray

* Fix integer size warning on clang

* Save PC and SP in newhash and newarray

Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert d01204a15d Disable extra T_OBJECT check added because of Nokogiri 2021-10-20 18:19:35 -04:00
John Hawthorn 546ca8167d Guard for T_OBJECT at compile time (#53)
Previously this could crash on Nokogiri when JITing the getivar
instruction because we would attempt to treat Nokogiri::XML::Document's
T_DATA as a T_OBJECT in calling rb_iv_index_tbl_lookup.

This commit also checks for T_OBJECT at compile time and emits the
rb_ivar_get fallback in that case.

Co-authored-by: HParker <HParker@github.com>
Co-authored-by: Dinah Shi <dinahshi@github.com>

Co-authored-by: HParker <HParker@github.com>
Co-authored-by: Dinah Shi <dinahshi@github.com>
2021-10-20 18:19:35 -04:00
John Hawthorn 9283fc1bb5 Implement opt_freeze and opt_uminus (#49) 2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert b415ceb92e Increase default YJIT call threshold to 10. Add exec mem size arg. (#52) 2021-10-20 18:19:35 -04:00
John Hawthorn 764740c661 Merge pull request #50 from jhawthorn/detect_type
Detect types from putobject and getinlinecache
2021-10-20 18:19:35 -04:00
Maxime Chevalier-Boisvert 844067f7ee Update README.md 2021-10-20 18:19:35 -04:00
John Hawthorn 6ecb007f6e Recommend installing libcapstone 2021-10-20 18:19:35 -04:00