Commit graph

196 commits

Author SHA1 Message Date
Noah Gibbs
e48fc07d11 Fix counter names 2021-10-20 18:19:41 -04:00
Noah Gibbs
7704a6990a Fix typo in comment 2021-10-20 18:19:41 -04:00
Noah Gibbs
a0790e6335 Break up callsite_not_simple into multiple cases. 2021-10-20 18:19:41 -04:00
Maxime Chevalier-Boisvert
0c1aa17556 Remove a few more uses of the global cb/ocb 2021-10-20 18:19:41 -04:00
Alan Wu
78b5e95e41 Add a slowpath for opt_getinlinecache
Before this change, when we encounter a constant cache that is specific
to a lexical scope, we unconditionally exit. This change falls back to
the interpreter's cache in this situation.

This should help constant expressions in `class << self`, which is popular
at Shopify due to the style guide.

This change relies on the cache being warm while compiling to detect the
need for checking the lexical scope for simplicity.
2021-10-20 18:19:41 -04:00
Maxime Chevalier-Boisvert
f1eb48cb23 Step 2 to remove the global cb/ocb objects. 2021-10-20 18:19:41 -04:00
Maxime Chevalier-Boisvert
c55d4cafc2 Pass the global cb through codegen functions 2021-10-20 18:19:41 -04:00
Alan Wu
c46bda6f19 Fix excessive invalidation for opt_getinlinecache
YJIT expects the VM to invalidate opt_getinlinecache when updating the
constant cache, and the invalidation used to happen even when YJIT can't
use the cached value.

Once the first invalidation happens, the block for opt_getinlinecache
becomes a stub. When the stub is hit, YJIT fails to compile the
instruction as the cache is not usable. The stub becomes a block that
exits for opt_getinlinecache which can be invalidated again. Some
workloads that bust the interpreter's constant cache can create an
invalidation loop with this behavior.

Check if the cache is usable become doing invalidation to fix this
problem.

In the test harness, evaluate the test script in a lambda instead of a
proc so `return` doesn't return out of the harness.
2021-10-20 18:19:41 -04:00
Alan Wu
6ef1609fab Correct margin for stack overflow test
In vm_push_frame(), the stack overflow test is done against a
decremented cfp. YJIT wasn't accounting for that in its stack overflow
tests.
2021-10-20 18:19:41 -04:00
John Hawthorn
7482744e04 Add jit_obj_info_dump 2021-10-20 18:19:41 -04:00
John Hawthorn
561882e96e Add comment explaining argc + 2 2021-10-20 18:19:41 -04:00
John Hawthorn
9951a9a8ec Implement invokebuiltin 2021-10-20 18:19:41 -04:00
John Hawthorn
82f60df5aa Implement generic setlocal 2021-10-20 18:19:41 -04:00
John Hawthorn
90de2dc703 Extract gen_get_ep 2021-10-20 18:19:41 -04:00
John Hawthorn
2ff26b9ec2 Fix opt_aset comptime_key check 2021-10-20 18:19:41 -04:00
Alan Wu
1f09eb66e6 Expand tabs 2021-10-20 18:19:41 -04:00
Maxime Chevalier-Boisvert
0ad9d1fa48 Update yjit_codegen.c 2021-10-20 18:19:41 -04:00
John Hawthorn
5e37f280d1 Remove vm_opt_aset 2021-10-20 18:19:41 -04:00
John Hawthorn
ba9d01b3cf Specialize based on types of opt_aset 2021-10-20 18:19:41 -04:00
Alan Wu
a71590e681 Don't store cfp->pc when doing iseq calls
We set it before calling routines and when we are exiting.
2021-10-20 18:19:41 -04:00
Alan Wu
1f6641681b No need to do ec->cfp = reg_cfp on exits
It's already up to date. We set it when we do iseq calls and it's set
properly on entry. If it's not set properly exceptions wouldn't work.
2021-10-20 18:19:40 -04:00
Alan Wu
bc7652998e Fix warnings about redefining YJIT_STATS
Follow up for ecb5b383a0c17550b9b27663005049ddac871edb. Now that
YJIT_STATS is defined in yjit.h, it shoudl be the only place that
defines it.
2021-10-20 18:19:40 -04:00
John Hawthorn
7d99e85601 Check for comptime fixnum in gen_fixnum_cmp 2021-10-20 18:19:40 -04:00
John Hawthorn
f1b7568f5a Check for comptime fixnums in opt_and and opt_or 2021-10-20 18:19:40 -04:00
John Hawthorn
cb9bc13fcb Check for comptime integers in opt_plus and opt_minus 2021-10-20 18:19:40 -04:00
John Hawthorn
fd10634b1a Move forward declaration up 2021-10-20 18:19:40 -04:00
Maxime Chevalier-Boisvert
bd8cfb351b Fix misplaced ivar_set_method exit counter 2021-10-20 18:19:40 -04:00
John Hawthorn
96fd8afbf4 Skip opt_case_dispatch 2021-10-20 18:19:40 -04:00
John Hawthorn
fc13ff14a2 Add comments to getspecial 2021-10-20 18:19:40 -04:00
Aaron Patterson
25f8431d46 only compile for T_OBJECT types 2021-10-20 18:19:40 -04:00
Aaron Patterson
5bc0343261 Refactor attrset to use a function
This new function will do the write barrier / resize the object / check
frozen for us
2021-10-20 18:19:40 -04:00
John Hawthorn
5092d6129a Fix opt_eq for overridden equality 2021-10-20 18:19:40 -04:00
John Hawthorn
44214e8ad9 Implement getspecial 2021-10-20 18:19:40 -04:00
Alan Wu
cbb0271dd6 Deduplicate side exits
Send instructions currently generate the exact same side exit twice.
Cache the exit the first time we generate it. Also add a comment
explaining what side exits do.

Closes GH-117.
2021-10-20 18:19:40 -04:00
Maxime Chevalier-Boisvert
11599e5e1e Add rb_darray_clear() for Kevin. Fix some warnings. 2021-10-20 18:19:40 -04:00
Aaron Patterson
f380856923 Add fixes for feedback 2021-10-20 18:19:40 -04:00
John Hawthorn
f30f299060 Use C_ARG_REGS earlier 2021-10-20 18:19:40 -04:00
John Hawthorn
9ebcd576f3 String and fixnum equality 2021-10-20 18:19:40 -04:00
John Hawthorn
6db5e80dd7 Use method dispatch for opt_eq 2021-10-20 18:19:40 -04:00
John Hawthorn
692f94ba0c Add jit_rb_obj_equal 2021-10-20 18:19:40 -04:00
Aaron Patterson
640b162b51 Exit when the object is frozen
Exit when the object is frozen, also add tests
2021-10-20 18:19:39 -04:00
Aaron Patterson
376f5ec1a1 Add a write barrier to ivar set
We need to fire the write barrier during ivar set.  This function
extracts the write barrier function then calls it.

Co-Authored-By: John Hawthorn <john@hawthorn.email>
2021-10-20 18:19:39 -04:00
eileencodes
307a4369e1 Implement setivar method calls 2021-10-20 18:19:39 -04:00
John Hawthorn
ce02aefabb Allow calling variadic cfuncs with many args
We have a check to ensure we don't have to push args on the stack to
call a cfunc with many args. However we never need to use the stack for
variadic cfuncs, so we shouldn't care about the number of arguments.
2021-10-20 18:19:39 -04:00
John Hawthorn
922aed92b5 Add codegen for rb_true and rb_false
These are used by .nil? and therefore opt_nil_p
2021-10-20 18:19:39 -04:00
John Hawthorn
fd34c831f6 Allow special case of expandarray with nil 2021-10-20 18:19:39 -04:00
Alan Wu
d098c5560b Shave a few instructions off of leave
The code path for leave that returns to the interpreter
(gen_leave() -> yjit_gen_leave_exit()) used to have the logic:

```
    cfp->sp++;
    cfp->sp[-1] = return_val;
    cfp->sp--;
    return return_val;
```

The SP changes it made was unnecessary and this change removes it.

After this change, `leave` doesn't adjust the `cfp->sp` of the caller
and only writes `cfp->sp[0]`. To accomodate this in the JIT-to-JIT
return case, return stubs have an `sp_offset` of 1.

The change removes sp adjustment from the JIT-to-JIT return case, too,
making it more efficient. Also, since the C method case of `send`
has an `sp_offset` of 1 after the call, this change enables block
version sharing.
2021-10-20 18:19:39 -04:00
Alan Wu
ed85e8a33a Use reg1 in GEN_COUNTER_INC to avoid clobbering RAX 2021-10-20 18:19:39 -04:00
John Hawthorn
c210fade27 Implement newrange 2021-10-20 18:19:39 -04:00
John Hawthorn
3ecc6befcd Implement invokesuper using cfp->ep[ME] check
This fixes and re-enables invokesuper, replacing the existing guards
with a guard on the method entry for the EP.
2021-10-20 18:19:39 -04:00