Welcome to the main channel on the development of MoarVM, a virtual machine for NQP and Rakudo (moarvm.org). This channel is being logged for historical purposes.
Set by lizmat on 24 May 2021.
00:02 reportable6 left 00:03 reportable6 joined 02:01 greppable6 left, nativecallable6 left, coverable6 left, shareable6 left, releasable6 left, bisectable6 left, reportable6 left, committable6 left, evalable6 left, linkable6 left, sourceable6 left, statisfiable6 left, bloatable6 left, quotable6 left, benchable6 left, notable6 left, unicodable6 left, tellable6 left, squashable6 left 02:02 notable6 joined, bisectable6 joined, reportable6 joined, committable6 joined 02:03 benchable6 joined, shareable6 joined 02:04 greppable6 joined, quotable6 joined, statisfiable6 joined, tellable6 joined 03:03 evalable6 joined 03:04 unicodable6 joined, sourceable6 joined, squashable6 joined 04:03 linkable6 joined 05:04 nativecallable6 joined 06:02 reportable6 left 06:03 releasable6 joined 06:05 reportable6 joined 07:03 bloatable6 joined, coverable6 joined
Nicholas good *, #moarvm 08:05
I'm no longer sure which spectests are "expected to fail" on new-disp (versus what might be problems from high load on a shared machine) 08:06
but t/spec/S02-types/num.rakudo.moar and t/spec/S02-types/range.t both seem to reliably end up failing with: No such method '&postcircumfix:<{ }>' for invocant of type 'List' 08:07
08:15 lizmat_ joined 08:16 TempIRCLogger__ joined 08:17 Geth left, lizmat_ left, Geth joined 08:18 lizmat joined
lizmat jnthnwrthngtn: fwiw, test-t feels a bit slower after the last new-disp commits 08:29
startup time seems to have gone down a bit, between .135 - .161 now for me 08:30
jnthnwrthngtn: one data point. restarting my local copy of the IRC log server with new-disp, I get: 08:37
Cannot unbox a P6opaque (MAST::VOID) type object 08:38
when doing "use RandomColor"
(during compilation)
09:07 brrt joined
Nicholas good *, brrt 09:11
brrt good * Nicholas 09:16
(70% of the reason for coming here is the habitual greetings :-)) 09:17
lizmat brrt Nicholas o/ 09:18
brrt ohai lizmat 09:21
jnthnwrthngtn Nicholas: I'm only aware of require.t causing bother 09:43
lizmat: Curious; the profile I did of it came out with a shorter time, better inline rate, etc. 09:44
lizmat I only checked wallclock time
jnthnwrthngtn I'd have kinda expected that to follow 09:45
Good you see a (slight) startup improvement also; I saw a few seconds of `make spectest`
*off 09:46
09:58 brrt left
Nicholas not quite "reliably", but at least mostly, and it seems to be MVM_SPESH_NODELAY=1 10:04
jnthnwrthngtn There will be a MoarVM talk at this year's VMIL: 2021.splashcon.org/home/vmil-2021#program 10:06
urgh, on my office machine I can get lots of spectest failure with nodelay + blocking 10:08
Wonder what's caused that.
lizmat weekly: 2021.splashcon.org/details/vmil-20...g-language 10:09
notable6 lizmat, Noted! (weekly)
MasterDuke that graalvm talk looks interesting also 10:11
jnthnwrthngtn OK, can confirm it's the HEAD commit on new-disp that is to blame but...how... 10:12
Hm, and also, it isn't happening every time. oh, that may be hash randomization... 10:13
MasterDuke oh, little pricier than i'd prefer though...
Nicholas sorry, yes, already had assumed that randomisation
that randomisation was why it wasn't 100% reliably unhappy 10:14
jnthnwrthngtn Hm, and also, it isn't happening every time. oh, that may be hash randomization...
this isn't the terminal I meant to up-arrow + enter in :D
Yeah, it is reliable with hash randomization turned off 10:17
Geth MoarVM/new-disp: bc95088a24 | (Jonathan Worthington)++ | src/spesh/inline.c
Tweak sp_guardhll deopt index during inlining
jnthnwrthngtn That fixes at least the num.t case and quite possibly the rest of them 10:41
Nicholas building the whole thing to find out...
jnthnwrthngtn So, what was I meant to do next... 10:42
Nicholas coffee!
jnthnwrthngtn Already just got a fresh cup :)
Nicholas well you crossed out all the blockers on github.com/rakudo/rakudo/wiki/Raku...isp-branch 10:43
so it' snot obvious, but IIRC there were about 3 modules that did things 10:44
and lizmat reported something else this morning
jnthnwrthngtn I suspect what lizmat reported is going to be the thing I just fixed
MasterDuke it might be worth actually making the pull request about now so we get the CI runs
jnthnwrthngtn Will we, though, or will it be confused 'cus it needs simultaneous merge over all 3 repos? 10:45
Nicholas I suspect the latter. Also, what does the CI do that we can't (collectively) do manually? and have been doing already manually
MasterDuke arg, right. we'll at least get confirmation that moarvm builds, but the nqp and rakudo parts won't work 10:46
jnthnwrthngtn Goodness, a blocking+nodelay spectest on this machien is not so fast as at home...
.oO( this machien runs like a dog... )
Yeah, the fix seems to deal with all the spectest fallout 10:55
Currently adding a megamorphic handler for nqp::can/nqp::findmethod/nqp::tryfindmethod, since we regularly get blowups in mergesubstates 10:56
(When compiling anything non-trivial) 10:57
lizmat jnthnwrthngtn: alas, the MAST::VOID problem has not gone away: gist.github.com/lizmat/2c3336a3398...776b082051 11:19
dogbert17 lizmat, does test-t run faster now 11:23
jnthnwrthngtn lizmat: It's possible 8cb07b51 in Rakudo is to blame 11:24
lizmat dogbert17: no noticeable difference for me
11:25 linkable6 left
lizmat jnthnwrthngtn: want me to revert that locally and see if that fixes it ? 11:25
dogbert17 not even after the fix jnthn did 30 mins ago?
lizmat no :-(
dogbert17 darn 11:26
lizmat rebuilding with: $ perl Configure.pl --force-rebuild --gen-moar=new-disp --gen-nqp=new-disp --make-install;
that should give me the latest, no ?
11:27 linkable6 joined
dogbert17 just ran a stresstest with MVM_SPESH_NODELAY=1 MVM_SPESH_BLOCKING=1 and a small nursery (32k). The only failure was t/spec/S11-modules/require.t 11:27
I guess nine++ is looking at that one 11:28
jnthnwrthngtn lizmat: Yes, please
lizmat ok, rebuilding :-)
dogbert17 Nicholas: should one be worried if running a raku script under valgrind, with new-disp, looks ok but throws valgrind errors when MoarVM is built with --no-optimize? 11:35
11:36 brrt joined
dogbert17 hello brrt 11:36
brrt hello dogbert17 11:37
lizmat jnthnwrthngtn: indeed,. reverting 8cb07b51 fixes the MAST::VOID issue 11:38
11:39 linkable6 left 11:42 linkable6 joined
jnthnwrthngtn OK, hmm 11:42
Intersting all of spectest doesn't manage to tickle that 11:43
Geth MoarVM/new-disp: 3a961fa96f | (Jonathan Worthington)++ | src/disp/boot.c
Don't always guard on type/name in lang-find-meth

Otherwise, it's not possible for a language's dispatcher to handle megamorphic cases.
MoarVM/new-disp: e1acd103fc | (Jonathan Worthington)++ | src/disp/program.c
Relax existence requirement on DP lookup tables

We can install a lookup table at a callsite in order to handle megamorphic dispatches. However, the mechanism that existed so far always made lack of entry in the table a reason for the dispatch to be rejected. This is not useful for writing dispatchers where lack of an entry is acceptable. Dispatchers that want the current semantics can obtain them simply by adding a guard.
jnthnwrthngtn That and the matching NQP change might just get a bit more off stage parse 12:00
12:02 reportable6 left
jnthnwrthngtn lizmat: Hopefully the change just pushed to Rakudo HEAD will fix the issue you ran into 12:18
well, rakudo/new-disp
lizmat ok, will do a rebuild :) 12:19
Nicholas "this week" is so last week. It's not even "this morning" any more. It's an acceleraptor
lizmat jnthnwrthngtn: confirmed this fixed the issue 12:31
MAST::VOID issue
jnthnwrthngtn Yay 12:38
Geth MoarVM/new-disp: 5e982bfc98 | (Jonathan Worthington)++ | src/disp/syscall.c
Add syscall to check if code is marked as stub
jnthnwrthngtn Nice, exposed more constants in raku-invoke (where all invocations bottom out) and it gives some improvements across a bunch of microbenchmarks 12:56
Did this in NQP's dispatchers a while back and forgot to add it into Rakudo's ones 12:57
Pushed it to Rakudo. Might help test-t. 13:02
.tell sena_kun For Test::Base I've opened github.com/tokuhirom/p6-Test-Base/pull/2 13:09
tellable6 jnthnwrthngtn, I'll pass your message to sena_kun
lizmat 1.419 / .785 13:12
jnthnwrthngtn What were yesterday's numbers?
lizmat 1.451
.766 13:13
so, feels a bit faster for the non-race case, but definitely in noise territory
afk for a few hours&
Nicholas jnthnwrthngtn: OK, on 8cb07b51f14e1e0702bc51d4d4742476e8aca666 (which is yesterday) t/spec/S11-modules/require.t is the only spectest failure 13:14
(as in, a build that was started about an hour ago) 13:15
so your fix this morning got us back to your single known failure 13:16
jnthnwrthngtn OK, good
.oO( why is it my failure? :D )
Guess I should deal with DateTime::Timezones at last, before painting any more go faster stripes on things... 13:17
Nicholas as in "the single failure known to you". Pedant! :-)
the knowledge is yours. It might be possible to palm the failure off on someone else. 13:18
jnthnwrthngtn nine++ was looking at it; I struggled to repro it in a way that I got useful info 13:19
13:23 brrt left
Nicholas jnthnwrthngtn: not a massively scientific number, but "this morning" under ASAN Stage parse was about 400s. It's now 375s. Meaning (I think) that more got JITted 13:38
but the numbers have flapped up and down
ASAN and NODELAY make it all meaningless. And then there's hash randomisation on top 13:39
jnthnwrthngtn Hm, seems the DateTime::Timezones problem is a different one than I first thought... 13:44
dogbert17 jnthnwrthngtn: is that good or bad? 13:54
jnthnwrthngtn Bad in that I think the thing I originally thought it was will be a problem at some point too 14:09
I thought the case was going to be wrapped multi candidate that does callwith, but it's actually wrapped proto with callwith 14:11
They need distinct handling 14:12
14:23 evalable6 left, linkable6 left 14:25 linkable6 joined, evalable6 joined
jnthnwrthngtn Hm, seems I have a fix for DateTime::Timezones 14:28
But it breaks at least one spectest :(
14:59 patrickb joined
jnthnwrthngtn Figured it out. \o/ 14:59
dogbert17 jnthnwrthngtn++ 15:00
jnthnwrthngtn So that's one of our remaining ecosystem failures sent a PR, and one fixed. 15:02
timo \o/ 15:05
15:06 reportable6 joined
Nicholas and one last one to put on the wiki? 15:10
-bash: o/: No such file or directory
that appeared to be the wrong window :-) 15:11
jnthnwrthngtn Nicholas: Yeah, I guess so. Though we've put in so many opts and other tweaks we might have "won" some more ecosystem problems 15:24
15:28 patrickb left
[Coke] There's no blockers ATM; while that list may grown and shrink before next release, anything stopping us from doing the merge/rename? 15:29
jnthnwrthngtn [Coke]: I'd like to see another round of Blin results; a lot happened since the last one 15:33
My latest Rakudo push is the last place I know we were not exposing an opportunity to spesh that it had before. 15:45
15:49 patrickb joined
[Coke] Sure; let's do blin, get the results in the wiki. good plan 15:56
16:03 patrickb left 16:05 brrt joined
Geth MoarVM/new-disp: 7ac7b89741 | (Timo Paulssen)++ | src/spesh/worker.c
keep "skip" value around between loop iterations

fixes "skip:0" lines showing up everywhere in the log
nine I asked why caller_deopt_idx wasn't set when it's the mechanism that's supposed to protect us from the "we have moved into/out of an inline since the MVMContext was taken" situation. 16:16
Well apparently at the time the MVMContext was created and the call stack was snapshotted, the REQUIRE_IMPORT callframe didn't have a spesh candidate. But later, when we apply the traversals it suddenly has one. 16:17
jnthnwrthngtn Hmm. OSR? 16:18
nine Looks like. Disabling OSR gets rid of the failure
And there are 2 osrpoints in the function's bytecode 16:20
timo do we poison osr when a mvmcontext was taken or do we somehow fix up mvmcontext when an osr has happened in the mean time?
i guess we can probably have a "which candidate was it at the time" in the snapshotted call stack 16:21
lizmat latest numbers" 1.389 / .781 16:24
jnthnwrthngtn I don't think we prevent OSR in such a situation, no 16:26
lizmat: ooh, does that mean at least for the non-race case, we're within startup time difference of master?
nine Preventing OSR for a frame that has caller_info_needed set in its extra is easy and works. Is it good enough as a fix? 16:27
timo does it prevent 99% of all osrs?
lizmat jnthnwrthngtn: I'd say, yes
nine caller_info_needed is set by exceptions and MVMContext 16:28
16:32 [Coke] left
timo i see a tiny opportunity to improve returning native values; in this example we have a NumLexRef and we go via the container-fallback code for the raku-rv-decont dispatcher. we don't get "isrwcont" for the known type of NumLexRef, so the code would get one less branch 16:33
but also, the raku-rv-decont dispatcher could learn about the *LexRef and other native refs
jnthnwrthngtn nine: I think it will be, yes 16:34
nine Doesn't seem to affect stage parse time
jnthnwrthngtn I think I just spotted one more spesh regression
We used to log return types and insert guards
We no longer do
lizmat timo: having native values not being containerized would be cool 16:35
timo that's not a thing i can promise
lizmat timo: it's basically blocking using natives for hot code
timo when it's a LexRef, that is definitely a rw container, meaning we do have to re-containerize
lizmat if any subs / blocks are involved
timo this in particular is multi method wrap(numarray:D:) 16:40
Geth MoarVM/new-disp: a7c0cc8d2b | (Stefan Seifert)++ | src/spesh/osr.c
Fix frame walker getting confused when OSR outdates positions

When an MVMContext is created, we snapshot the current callstack, i.e. record the current positions within the frames in their extras. These positions are relative to the currently executing bytecode. OSR however replaces this bytecode with specialized one, invalidating the recorded positions. This can lead to the frame walker making wrong decisions with regards to whether we were ... (5 more lines)
timo sum isn't huge, but can't be inlined into its caller in this case because it's got getlexref for $sum 16:48
Nicholas oh my, "I" had not finished the previous build yet... 17:15
Geth MoarVM/new-disp: 508299f952 | (Jonathan Worthington)++ | src/jit/graph.c
JIT of iscoderef
MoarVM/try-return-type-guards: 7ae62af9ed | (Jonathan Worthington)++ | 6 files
[WIP] Bring back return type guards

We log the types that things return, with the intention of using those to add speculative guards that might be used during specialization. While this does speed some things up, it also causes some huge slowdowns, so needs further investigation.
jnthnwrthngtn That's a bit of a mystery. I see some benchmarks half in time with that, but others double in time; test-t tanks too. 17:29
I thought it was because of overlapping type data with the following op, mitigated that, and it didn't help 17:30
I thought it was because of overlapping type data with the following op, mitigated that, and it didn't help 17:31
home time & 17:35
17:37 linkable6 left, evalable6 left 17:54 squashable6 left 17:56 squashable6 joined 18:02 reportable6 left 18:07 brrt left 18:39 linkable6 joined
Nicholas So t/spec/S02-types/isDEPRECATED.rakudo.moar is (mostly) failing for me on new-disp. "not ok 4". 18:45
And on master. "not ok 13" 18:46
"not ok 4" is expected "t/spec/S02-types/isDEPRECATED.rakudo.moar, lines 31,32" got "t/spec/S02-types/isDEPRECATED.rakudo.moar, lines 18,31"
little of this makes sense to me.
lizmat those are tests to see if the "is DEPRECATED" trait reports the correct line numbers 18:47
for the currently active deprecations
in core
jnthnwrthngtn Just profiled test-t with the try-return-type-guards branch and it has a huge number of deopts 18:49
Nicholas OK, the "mostly" seems to be that if I delete all of lib/.precomp it passes, and then on the re-run(s) it fails 18:50
lizmat Nicholas: yeah, I think we still have some gremlins in the precomp selection stuff 19:00
jnthnwrthngtn OK, I figured out the problem with the return type logging 19:08
Turns out that values from the recording of the dispatch program were also getting logged
These of course have nothing to do with the actual call 19:09
And in some cases where the result of the dispatch is not a call, but a value, they produce utterly bogus stats
That said, we probably shouldn't be guarding on such weak type counts.
19:48 squashable6 left 19:50 squashable6 joined 20:03 reportable6 joined
MasterDuke it looks like we can't jit anything that involves (un)locking a mutex (assuming it's not all hidden behind a function call)? 20:18
sort of related question, is there any real downside to jitting all ops? i.e., would it be better to not jit ops that are very infrequently called, and (almost) never in hot code? or is there an extra benefit to having everything jitted so you're not spending time in the interpreter? 20:42
lizmat it takes effort to jit? 20:53
jnthnwrthngtn MasterDuke: Depends what you mean; having ops JITted unblocks JIT of those things around them 20:54
So even if they aren't that hot, it can be worth it.
It's not always worth trying to JIT things better than "call a function" though (as it can blow up the generated code size) 20:55
MasterDuke so i'm looking at the spesh log of compiling CORE.c.setting. there are a bunch of unjitted ops that only prevent 1-<small number> of functions being jitted
jnthnwrthngtn Then it depends how common those are 20:56
MasterDuke i.e., 'loadlib' prevents 'name' from being jitted
jnthnwrthngtn I addes iscoderef earlier today and that turns out to be important because one of the dispatchers uses it
MasterDuke if 'name' is called only infrequently, might it still be worth jitting 'loadlib'? 20:57
i also wonder how easily it would be to measure jitting it vs not. do a whole bunch of these ops and then see if there's a measurable difference, either good or bad? 20:58
jnthnwrthngtn It must be at least somewhat frequent because it's getting specialized 20:59
Anything that's called < 100 times or so won't be
MasterDuke i generate two metrics. ops -> the functions that they prevent from being jitted. and functions -> the ops that prevent them from being jitted 21:00
so two categories of ops seem most helpful to jit, those where there are a large number of functions they block, and those where the functions they block are especially hot 21:02
the first is easy to spot. the second requires more inside knowledge 21:03
gist.github.com/MasterDuke17/d3d42...80b1ddcab3 shows the op->function data 21:05
something like 'setdebugtypename' is just a function call, so you think it would most-likely be good to jit it? 21:08
21:13 [Coke] joined
timo setdebugtypename could one day™ become a syscall and jitting to a c function could be for free then 21:19
jnthnwrthngtn I figure a bunch of ops today should eventually become syscalls 21:24
wow, how'd this happen... 21:49
(gdb) p STABLE(coderef_facts->value.o)->debug_name
$4 = 0x555555725540 "NQPMu"
(gdb) p STABLE(coderef_facts->type)->debug_name
$5 = 0x5555555efd10 "BOOTCode"
MasterDuke i assume this is entirely coincidental to our just talking about setdebugname? 21:50
jnthnwrthngtn Yes :) 21:52
MasterDuke ha
jnthnwrthngtn Figured this'd be the perfect time for rr, but...it crashes :/ 21:57
timo if your program crashes, rr will also report a crash
so it might just look like it crashed
jnthnwrthngtn No, rr replay itself crashed, turns out that I needed to run the zen workaround script 21:59
timo oops ok
jnthnwrthngtn Seems whatever it does only sticks until a reboot 22:09
MasterDuke yeah, you can do a kernel module or boot params instead if you want something more permanent 22:18
timo React Router is being mean to me :| 22:27
Geth MoarVM/new-disp: 9c1416d07e | (Jonathan Worthington)++ | src/spesh/codegen.c
Add sp_guardhll to codegen debug
MoarVM/new-disp: 005061d0dc | (Jonathan Worthington)++ | src/spesh/inline.c
Correctly update guard deopt indice on inline

If there were to be multiple inline annotations, a pre and a post one, then we should respect the one the op has encoded in it.
MoarVM/new-disp: 229d37e80d | (Jonathan Worthington)++ | src/spesh/usages.c
Consider all kinds of deopt when adding usages
MasterDuke timo: i have a feeling that for all raku is a large language, javascript + frameworks + ecosystem is still *vastly* larger than raku + frameworks + ecosystem 22:33
Geth MoarVM/new-disp: b9204f6b35 | (Jonathan Worthington)++ | src/spesh/manipulate.c
Don't copy facts in version split

It's possible in odd situations (created by NODELAY, where the stats are liable to be dubious at best) to end up with facts being on a virtual regsister that aren't a subset of those added by the guard. In that case, we could end up with bogus combinations of the two. Just don't copy them; it seems there's little to no win anyway.
timo wouldn't surprise me, javascript has been growing at a strong pace for the last 500 years now
Geth MoarVM/new-disp: 36f4d79426 | (Jonathan Worthington)++ | 6 files
Reinstate adding speculative return type guards

We were logging return types, however due to changes to how dispatch works, were completely ignoring them in the specializer. Change that. We need to do things a little differently, because dispatch is a varargs op, so we can't just calculate the offset before it trivially. Instead, use a post-log annotation. However, that can collide with a log ... (12 more lines)
jnthnwrthngtn For the first time, I just observed a stage parse on new-disp lower than that of the one I last measured on master.
MasterDuke ooo, going to give it a try myself then 22:38
22:38 evalable6 joined
timo sweet 22:38
MasterDuke 44.5 here. don't remember what my last master time was, somewhere around 42-44 i think 22:42
Geth MoarVM/new-disp: 1a494f5788 | (Jonathan Worthington)++ | 3 files
Don't double-check REPR in sp_guardsf

We will always have either knowledge or guards to make sure it is.
[Coke] updating to latest os x (was a major rev back), will report out once my tooling is back in place. 23:41