github.com/moarvm/moarvm | IRC logs at colabti.org/irclogger/irclogger_logs/moarvm Set by AlexDaniel on 12 June 2018. |
|||
timotimo | heck yeah! | 00:16 | |
i see Str being inlined into what used to be a smrt_strify | 00:17 | ||
jnthn | Well, that sounds nice :) | 00:18 | |
timotimo++ | |||
Though since we're just before a release (I think?), maybe a branch that we merge right afterwards (provided it passes tests)? | 00:19 | ||
timotimo | of course | ||
it'll hit .Str of NQPGrammar and NQP::Regex and friends! | |||
i'll extra-check what types are being optimized for | 00:20 | ||
it should also hit .Str on hash iterators | |||
ok, only NQP::Regex, NQPRegex, and NQP::Grammar at the moment | 00:22 | ||
jnthn | That could still be quite a win | 00:23 | |
Those are probably all over the grammar | |||
*compiler | |||
Well, probably the grammar too :) | |||
timotimo | OK, the hash iterator only gets strified with smrt_strify in SET_BLOCK_OUTER_CTX, which never gets speshed at all, in compile_node, which has barely any hits, and in local. also in !precompute_nfas | 00:35 | |
i wonder why type "int" returns -1 for "do you have a .Num method?", i.e. the cache doesn't consider itself authoritative? | 00:40 | ||
AlexDaniel | jnthn: btw have you seen this? github.com/rakudo/rakudo/issues/2623 | 00:52 | |
timotimo | Stage optimize : MoarVM oops: Spesh inline: unhandled case of return_o | 01:02 | |
well, that's not fun | |||
sounds like it's missing code-gen for automatic boxing on return | |||
would be nice if it didn't cause an oops, though :) | 01:03 | ||
01:17
MasterDuke left
|
|||
timotimo | i wonder how this case of return mismatch blew up but otherwise it never does? hmm. | 01:21 | |
maybe all rakudo ever does is return_o?! | 01:46 | ||
or maybe there's just one .Str or .Int that returns an object, which makes sense in rakudo land where Str is a thing | |||
02:05
MasterDuke joined,
MasterDuke left,
MasterDuke joined
|
|||
MasterDuke | timotimo: around? | 02:06 | |
timotimo | ya | 02:10 | |
MasterDuke | so i made a change for intify, but the optimize_coerce function isn't being called because of an intify, but a numify when the blow up happens | 02:12 | |
in fact, it doesn't get called because of an intify at all before the nqp build dies | |||
02:13
dogbert17 left
|
|||
MasterDuke | gist.github.com/MasterDuke17/a618b...d984af2d3e has my most recent change | 02:14 | |
and this is what happens gist.github.com/MasterDuke17/c1ea4...5d2f84f48f | 02:15 | ||
timotimo | ugh i wish i could just click and get the context of the original file in that diff | ||
MasterDuke | heh | 02:16 | |
timotimo | can you give me a diff with a higher -u number? | ||
sorry | |||
-U | |||
MasterDuke | should i just put the whole thing in also | ||
timotimo | like, 25 mybe? | ||
it's still useful to have the colors from the diff in the middle | |||
MasterDuke | -U10 good? | 02:17 | |
timotimo | 25 | ||
MasterDuke | gist updated | 02:18 | |
timotimo | Perl6-Optimizer's simplify_refs is the only case ever where it gets a return_o that hits an invoke_n/i/s | ||
ah! | |||
guess what | |||
the code i had in there was wrong | |||
if (is_strify && ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { | 02:19 | ||
MasterDuke | yay? | ||
timotimo | + else if (is_intify && ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) { | ||
these have to change | |||
if (is_strify && (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR)) { | |||
and | |||
else if (is_intify && (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT)) { | |||
i've done this mistake multiple times in the past, and if i don't better myself i'll do it again :( | 02:21 | ||
anyway, this could have caused issues | |||
MasterDuke | oh! i did at least once get into the intify branch during the nqp build, but it still dies with the same error | 02:23 | |
timotimo | well, it's good to know at least that it's not this problem | 02:24 | |
oh | 02:28 | ||
the first if in that function also seems to have that bug with & mixed with && | |||
MasterDuke | same error | 02:30 | |
timotimo | can you shoot the spesh log my way? | 02:32 | |
MasterDuke | for just the part that dies assume? | ||
timotimo | yeah, rxjump, right? | 02:34 | |
MasterDuke | hm, when run by itself with a spesh log it doesn't seem to want to die.... | 02:35 | |
ok, does first time with BLOCKING=1 | |||
timotimo | good | 02:36 | |
MasterDuke | gist.github.com/MasterDuke17/8eaff...c0c269fd1e | 02:38 | |
timotimo | huh, do i take the one or the other? | 02:39 | |
MasterDuke | the .zstd | ||
other was a typoo | 02:40 | ||
timotimo | OK, so | 02:43 | |
it's a smrt_intify | |||
it turns into an unbox_n, because it's called on a Num object | |||
the num register goes immediately into the position argument of bindpos_o | |||
MasterDuke | huh. why don't i see a smrt_intify in my stderr output? | 02:44 | |
timotimo | i'll leave that for you to figure out %) | ||
i'll probably go sleep real soon | |||
but yeah, look at line 1465451 | 02:45 | ||
that's the get_n that pulls the num out of the BOOTNum object it creates just above | |||
MasterDuke | ok. btw, is my is_intify branch correct? i really just need those two lines? | 02:46 | |
timotimo | it looks like it started as a smrt_numify on a VMArray, that got turned into elems + coerce_in | ||
i think it is | |||
do you have a clue how you'll be able to fix this problem? | |||
MasterDuke | not really. i haven't actually changed the numify branch at all, so i don't know why it's developed a problem | 02:47 | |
but i also haven't spent much time on it yet | |||
if i figure something out tonight i'll leave you a note | 02:49 | ||
timotimo | the smrt_intify turns into an unbox_n but no coerce_in, why? :\ | ||
we don't have an is_numify && (ss->can_box & ...) thing that'd build an unbox_i | 02:50 | ||
judging from the stderr output it looks like it's thinking it's got a smrt_numify when it actually has a smrt_intify? | |||
can you output all three is_...ify variables? | 02:51 | ||
MasterDuke | where? | ||
timotimo | if there's more than one that's 1, that'd be strange trouble | ||
hm, no, that can't actually happen though? | |||
how about this, set a conditional breakpoint in optimize_smart_coerce under the condition that is_intify is true, then see what path it takes | 02:52 | ||
oh | |||
} else if(ss->can_box & (MVM_STORAGE_SPEC_CAN_BOX_NUM | MVM_STORAGE_SPEC_CAN_BOX_INT)) { | |||
MVMuint16 register_type = | |||
ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT ? MVM_reg_int64 : MVM_reg_num64; | |||
these lines there | |||
this code isn't right any more | 02:53 | ||
it'll trigger for the num case, but there's nothing in it for handling unboxing to an int register | |||
it's only got logic for str vs int | 02:54 | ||
errr, str vs num | |||
as the target | |||
MasterDuke | hmm | ||
timotimo | it'll always generate an unbox_i or unbox_n depending on what kind of object is being smrt_strify'd or smrt_numify'd | 02:55 | |
MasterDuke | ah, intead of what is being done to it | ||
timotimo | and then if the object boxes a num, it'll generate a coerce_ns, otherwise a coerce_is if it's a smrt_strify, and a set or coerce_in otherwise | 02:56 | |
i think that's the exact point it goes wrong | |||
it just things "not strify must mean numify" | |||
thinks* | |||
MasterDuke | i'll play around there | ||
timotimo | i think register_type will alwaysā¢ be right | 02:57 | |
MasterDuke | hm, adding `else if (is_intify) new_ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_coerce_in : MVM_OP_set);` didn't fix anything | 03:00 | |
timotimo | i think it has to be ni rather than in? | 03:01 | |
MasterDuke | oh hey! nqp built | 03:03 | |
now to take out those prints which just slow things down... | |||
timotimo | sweet | ||
MasterDuke | timotimo++ | ||
03:10
MasterDuke_ joined
|
|||
MasterDuke_ | ugh, my laptop battery is just not working well at all | 03:10 | |
timotimo | d'oh | ||
03:10
MasterDuke left
|
|||
Geth | MoarVM/inline_smart_coerce_methodcalls: f30a806fc5 | (Timo Paulssen)++ | src/spesh/inline.c Teach Spesh Inline About Returning By Unboxing Needed whenever an inlinee has a return_o op that matches up to an invoke_i/n/s in the inliner. Interestingly, seems to only happen once during the entirety of rakudo's build process: in the ... (6 more lines) |
03:13 | |
MoarVM/inline_smart_coerce_methodcalls: a2f1cd4b50 | (Timo Paulssen)++ | 2 files Emit Deopt Annotations For smrt_strify/smrt_numify These have to be present so that these ops can be turned into a method call that's supposed to be inlinable. |
|||
MoarVM/inline_smart_coerce_methodcalls: 6d5a49b393 | (Timo Paulssen)++ | src/spesh/optimize.c Turn smrt_strify/_intify Into Method Calls and potentially inline them immediately. |
|||
timotimo | this will of course have to be changed a little when smrt_intify lands in master | ||
okay, time to get some sleep! | |||
03:15
MasterDuke_ left
|
|||
timotimo | .tell MasterDuke if you haven't seen it in the backlog yet, my new branch has just appeared, "inline_smart_coerce_methodcalls"; after smrt_intify lands (along with the rest of nqp-int) i'll make the necessary changes unless you want to do it yourself | 03:17 | |
yoleaux | timotimo: I'll pass your message to MasterDuke. | ||
03:19
robertle left,
robertle joined
03:24
MasterDuke joined,
MasterDuke left,
MasterDuke joined
|
|||
MasterDuke | timotimo++, passes spectest | 03:24 | |
yoleaux | 03:17Z <timotimo> MasterDuke: if you haven't seen it in the backlog yet, my new branch has just appeared, "inline_smart_coerce_methodcalls"; after smrt_intify lands (along with the rest of nqp-int) i'll make the necessary changes unless you want to do it yourself | ||
MasterDuke | nice. i'll work on cleaning up my branches and should be PRing them in the next couple days | 03:25 | |
03:32
AlexDani` joined
03:36
AlexDani` left,
AlexDani` joined,
AlexDaniel left,
AlexDani` is now known as AlexDaniel
03:49
robertle left,
robertle joined
03:51
martin__ joined
03:55
ufobat_ left
04:01
MasterDuke left
04:02
MasterDuke joined
04:04
MasterDuke left,
MasterDuke joined
06:49
domidumont joined
07:20
domidumont left
07:50
patrickb joined
07:51
martin__ is now known as ufobat
08:10
domidumont joined
08:25
zakharyas joined
09:16
robertle left
09:17
robertle joined
10:59
dogbert2_ joined
|
|||
Geth | MoarVM/jit-2op-form: dff6109658 | (Bart Wiegmans)++ | 4 files [JIT] Enfore input/output registers better Also do it for unary input/output operators (NOT). Remove register-moving code in most tiles. |
12:28 | |
12:31
brrt joined
|
|||
brrt | o | 12:32 | |
yoleaux | 06:55Z <AlexDaniel> brrt: some cool hardcore ideas from you? :) github.com/perl-gsoc-2019/ideas | ||
brrt | AlexDaniel: I've got a few ideas, for sure :-) | ||
.ask AlexDaniel how can I submit an idea? | |||
yoleaux | brrt: I'll pass your message to AlexDaniel. | ||
12:33
lucasb joined
|
|||
patrickb | brrt: Just add a pull request to that repo | 12:35 | |
There is a template file in there. | 12:36 | ||
12:41
zakharyas left
12:53
jpf1 left,
jpf1 joined
13:20
dogbert2_ left
13:23
patrickb left
|
|||
MasterDuke | ugh, my branches pass all tests and spectests, but they are not the cleanest series of commits. not looking forward to trying to tease some semblance of order out of them | 13:25 | |
brrt | MasterDuke: just put up a PR and we'll bully you into conformity :-P | 13:29 | |
MasterDuke | heh. i'm going to do a little cleanup, but not gonna be exhaustive about it | 13:43 | |
13:56
zakharyas joined
|
|||
Geth | MoarVM/jit-expr-float: 5 commits pushed by (Bart Wiegmans)++ | 15:06 | |
MoarVM/jit-expr-float: 14 commits pushed by (Bart Wiegmans)++ review: github.com/MoarVM/MoarVM/compare/1...22a8069b64 |
|||
brrt | rebase of jit-expr-float on top of jit-2op | 15:07 | |
the tl;dr - now the register allocator handles the conversion to two-opernds form, and tiles can be a bit dumber | |||
15:14
dalek left
15:15
dalek joined,
brrt left
15:18
robertle left,
robertle joined
15:33
lucasb left
15:34
[Coke] left
15:41
brrt joined
16:22
domidumont left
16:45
brrt left
17:03
lizmat left
|
|||
timotimo | wdtz.org/files/oopsla18-allmux-dietz.pdf | 17:05 | |
o_O | |||
"statically link together all programs from a given package to make it a lot smaller in total, and quite a bit faster, too" | 17:06 | ||
BTW is there a reliable API for figuring out what actual address a dynamically-resolved function will call so that our jit could skip one layer of indirection? | |||
As | 17:18 | ||
another example, for a set of 10 applications using Qt, the disk size of the multiplexed version is | 17:19 | ||
17% smaller than shared and 66% smaller than static, in aggregate, and the memory usage (when all | |||
10 run concurrently) is 40% less than shared and 63% less than static. | |||
17:28
patrickb joined
18:24
dogbert17 joined
18:25
patrickb left
|
|||
timotimo | hum. the JIT is in the same shared object as most of the functions it likes to put into code as calls, does that mean that maybe it already gets a "proper" address for the function rather than a forwarder stub? | 19:50 | |
19:55
robertle left,
robertle joined
19:56
robertle left
|
|||
timotimo | at least op_to_func gives a function pointer that looks very much like the final function itself | 19:56 | |
19:56
robertle joined
20:03
robertle left
20:05
lizmat joined
|
|||
timotimo | no opportunity for cheap speedups here :( | 20:07 | |
20:10
robertle joined
20:24
brrt joined
|
|||
brrt | timotimo: I'm not entirely sure what your question is | 20:25 | |
our state of the art is that we load the in-memory function pointer into the '.data' section of the code | 20:26 | ||
timotimo | right, this is all just about "is the function pointer that we get from our C code direct or indirect" | ||
20:29
AlexDani` joined
20:31
AlexDaniel left
|
|||
brrt | hehe, well, I don't exactly know that, tbh | 20:33 | |
you can't really be sure | |||
libraries can do what they want | |||
timotimo | well, i grabbed the pointer in gdb and disassembled it and at least in that case it looked direct | 20:34 | |
brrt | hmm. yes, they tend to | 20:36 | |
20:40
AlexDani` is now known as AlexDaniel
|
|||
timotimo | OK, so what other ops sometimes turn into a method call that we could theoretically spesh + inline | 20:41 | |
i believe decont does this for proxies | |||
20:43
zakharyas left
|
|||
brrt | oh, you're making invokish things actually invoke? | 20:44 | |
that's a good idea | |||
timotimo | yeah | 20:46 | |
hopefully :) | |||
got any suggestion where i should look next? | 20:51 | ||
brrt | anything marked invokish in oplist, I'd guess | 20:53 | |
exit | 20:54 | ||
20:54
brrt left
|
|||
timotimo | oh, hum. | 21:10 | |
i think i got the precedence of & and && right when i thought i had it wrong | |||
value & testbit && othercondition seems to actually correctly turn into (value & testbit) && othercondition | 21:11 | ||
21:19
robertle left
|
|||
timotimo | jnthn: do you think it's a good time to look into inlining FETCH and STORE for proxies? | 21:23 | |
jnthn | timotimo: Sure, why not... :) | 21:24 | |
timotimo | .o( am i going to regret this ... ) | ||
jnthn | Well, with the "but maybe merge after release" thing :) | ||
9 blockers in Rakudo is...already a lot to deal with | |||
timotimo | aye | 21:25 | |
i'm not sure i can help with any of them, though if you think one seems up my alley, feel free to ping | |||
i'm just experiencing a random spurt of spesh-focussed productivity | |||
do you have a clue if it's wrong that i had to give smrt_*ify a :deoptonepoint and a :deoptallpoint so that i get those annotations in the spesh graph? | 21:26 | ||
it seems like :invokish and/or :maycausedeopt should already cause them to appear | |||
but it seemed like they didn't | |||
AFK for a bit first | |||
jnthn | There's no implicit flags | ||
You'd have to spell those out | |||
Though I think you only need a deoptallpoint | 21:27 | ||
21:40
Kaiepi left
21:46
Kaiepi joined
21:59
MasterDuke left
|
|||
timotimo | OK! | 22:22 | |
hum. with code_pair, we'll be grabbing the code object at run time, not yet know it at spesh time ... | 22:38 | ||
perhaps we could actually log the invoked thing at the address of the op, even though it's not an actual invoke op | 22:39 | ||
otherwise it feels like a long way until inlining of store/fetch works :) | 22:40 | ||
jnthn | timotimo: Hm, ain't the code objects hung off the stable pointer? | 23:06 | |
Under invocation_spec | |||
23:12
MasterDuke joined
|
|||
timotimo | oh, do we actually have an STable per pair of fetch/store? | 23:12 | |
23:12
MasterDuke left,
MasterDuke joined
|
|||
timotimo | you're right, it does hang off of the STable | 23:13 | |
that makes it easier for sure | |||
jnthn | So if the type is known...:) | ||
timotimo | does that mean we generate a crapton of Proxy objects that all close over something else, that spesh would get kind of confused? | ||
i might be confused. | 23:14 | ||
jnthn | Yeah, I guess there's then another level of call | 23:20 | |
So an improvement is possible now, but not a full inlining of the two levels | 23:21 | ||
timotimo | oh, so it goes off to grab the actual proxy object itself which then has the closure | ||
the only way i was able to get spesh on decont able to stumble into the code path for code_pair was to actually put a literal nqp::decont into the source of my test code | 23:34 | ||
i'll just put an MVM_oops in and see if many test cases die ... | 23:40 |