summaryrefslogtreecommitdiff
path: root/yjit_codegen.c
AgeCommit message (Collapse)Author
2021-10-20Implement expandarrayKevin Deisz
2021-10-20Implement splatarrayKevin Newton
2021-10-20Use push and pop in jit_rb_obj_not to avoid corrupting typesJohn Hawthorn
2021-10-20Add assertions of types in jit_guard_known_klassJohn Hawthorn
2021-10-20Implement opt_divKevin Deisz
2021-10-20Implement opt_multKevin Deisz
Basically the same thing as opt_mod, but for multiplying.
2021-10-20Implement swap instructionMaxime Chevalier-Boisvert
2021-10-20Add FLONUM detectionJohn Hawthorn
2021-10-20Support guards against symbols and integersJohn Hawthorn
This adds guards
2021-10-20Allow chaining on immediate guardJohn Hawthorn
In jit_guard_known_klass whenever we encounter a new class should recompile the current instruction. However, previously once jit_guard_known_klass had guarded for a heap object it would not recompile for any immediate (special const) objects arriving afterwards and would take a plain side-exit instead of a chain guard. This commit uses jit_chain_guard inside jit_guard_known_klass instead of the plain side exit, so that we can recompile for any special constants arriving afterwards.
2021-10-20Implement opt_neqJohn Hawthorn
2021-10-20Add tests, comments, and an assert for invokesuperAlan Wu
2021-10-20Add opt_size and opt_lengthJohn Hawthorn
2021-10-20Use an st_table for optimized method codegenJohn Hawthorn
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-20Handle non-material empty singleton class properlyAlan Wu
As an optimization, multiple objects could share the same singleton class. The optimization introduced in 6698e433934d810b16ee3636b63974c0a75c07f0 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-20Disable invokesuper codegen for now. Add testAlan Wu
The added test fails with SystemStackError with --yjit-call-threshold=1.
2021-10-20Fix bug in generic case for gen_checktypeAlan Wu
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-20Simplify known class check for singletonsJohn Hawthorn
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-20Delay and be selective about when to discard local typesAlan Wu
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-20Improve opt_not by expanding cfunc codegenAlan Wu
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-20Add invokebuiltin_delegate_leaveJohn Hawthorn
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-20Implement invokebuiltin_delegateJohn Hawthorn
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-20Fix compiler warningMaxime Chevalier-Boisvert
2021-10-20Implement topn instructionAaron Patterson
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-20Better commentsJohn Hawthorn
2021-10-20Avoid looping on invokesuper on module included multiple timesJohn Hawthorn
2021-10-20Check for refinements in gen_invokesuperJohn Hawthorn
2021-10-20Guard against implicitly forwarded blockJohn Hawthorn
2021-10-20Add invokesuperJohn Hawthorn
2021-10-20Implement gen_getlocalJohn Hawthorn
This extracts the generation code from getlocal_wc1, since this is the same just with more loops inside vm_get_ep.
2021-10-20Can't add comments to the outlined code blockMaxime Chevalier-Boisvert
2021-10-20Add duparray to YJIT codegenJohn Hawthorn
2021-10-20Fix check for leaf invokebuiltinJohn Hawthorn
Also added a comment when inlining a leaf builtin
2021-10-20Use builtin_inline_p to avoid pushing a frame for primitive C methods (#63)Maxime Chevalier-Boisvert
* 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-20Add concatstrings to yjit codegen (#58)John Hawthorn
* Add ETYPE_TRUE and ETYPE_FALSE * Implement checktype * Implement concatstrings * Update deps
2021-10-20Add newhash and newarray instructions to yjit codegen (#48)John Hawthorn
* 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-20Disable extra T_OBJECT check added because of NokogiriMaxime Chevalier-Boisvert
2021-10-20Guard for T_OBJECT at compile time (#53)John Hawthorn
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-20Implement opt_freeze and opt_uminus (#49)John Hawthorn
2021-10-20Increase default YJIT call threshold to 10. Add exec mem size arg. (#52)Maxime Chevalier-Boisvert
2021-10-20Merge pull request #50 from jhawthorn/detect_typeJohn Hawthorn
Detect types from putobject and getinlinecache
2021-10-20Add commentMaxime Chevalier-Boisvert
2021-10-20Add T_OBJECT check to getivarMaxime Chevalier-Boisvert
2021-10-20Implement opt_not with deferred compilation (#44)Maxime Chevalier-Boisvert
2021-10-20Avoid interrupt checks for forward branches (#41)Maxime Chevalier-Boisvert
2021-10-20Implement defined bytecode (#39)Maxime Chevalier-Boisvert
2021-10-20Implement opt_nil_p and opt_empty_b by delegating to send (#35)Maxime Chevalier-Boisvert
2021-10-20Implement setivar with a plain old function call (#34)Maxime Chevalier-Boisvert
* Implement setivar with a plain old function call * Remove return
2021-10-20Implement getblockparamproxyAlan Wu
* Implement getblockparamproxy * Parallel runner: wait for timeout thread to terminate after killing Or else the leak cheaker could sees the thread as running and cause test failures in test-tool. * Add a comment, use jne * Comment about where 0x3 comes from
2021-10-20Deletate to opt_send_without_block for opt_ltlt (#33)Maxime Chevalier-Boisvert