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:57 rakuUser left 01:03 reportable6 joined 01:11 frost joined 02:11 bisectable6 left, bloatable6 left, linkable6 left, unicodable6 left, greppable6 left, benchable6 left, tellable6 left, notable6 left, squashable6 left, releasable6 left, reportable6 left, sourceable6 left, coverable6 left, statisfiable6 left, shareable6 left, nativecallable6 left, committable6 left, quotable6 left, evalable6 left 02:12 sourceable6 joined, committable6 joined 02:13 linkable6 joined, notable6 joined 02:14 releasable6 joined 03:12 statisfiable6 joined, nativecallable6 joined, greppable6 joined 03:13 bisectable6 joined, quotable6 joined 03:14 shareable6 joined, evalable6 joined, bloatable6 joined 04:12 tellable6 joined 04:13 squashable6 joined 05:13 benchable6 joined 06:14 coverable6 joined 06:54 patrickb joined 07:12 unicodable6 joined
Nicholas good *able6, #moarvm 07:20
08:04 reportable6 joined 08:07 patrickb left 08:47 Kaiepi left, Kaiepi joined 08:53 Kaiepi left 08:58 Kaiepi joined
jnthnwrthngtn moarning o/ 09:33
Nicholas \o
09:58 evalable6 left, linkable6 left 10:16 nebuchadnezzar left 10:28 Kaipi joined 10:29 Kaiepi left
nine jnthnwrthngtn: you could have pleased that --rxtrace test by just turning --rxtrace into a noop ;) After all the test just made sure that it doesn't crash. We seem to have never promised anything more 10:45
timo yup, certainly underpromising we are, maybe not overdelivering any more this time 10:46
jnthnwrthngtn nine: Yes, but when I saw it had a negative effect on find_method I was especially keen to see it gone; that's a hot path on startup now, and startup time seems notably worse on new-disp
I was just glancing callgrind output and...hmm. Why is MVM_op_get_mark doing a bunch if branching when it could just store the mark in the MVM op info?
It accounts for 2.75% of CPU cycles on startup 10:47
timo someone smart™ could probably write a moar debugserver client that does essentially the same thing as rxtrace except perhaps with much better output; interactively introspectable output perhaps
jnthnwrthngtn *bunch of branching, although it's `if` all the way...
timo jnthnwrthngtn: i think i did that to make the op data shrink
but 2.75% is kind of astounding
jnthnwrthngtn We call it while doing inline cache building 10:48
timo i would have assumed it'd come from verifying frames
are those two bits like, in a row?
jnthnwrthngtn A lot from there also
timo we don't actually have many different marks at all, perhaps we'll want to store the mark in a thinner field than two whole bytes 10:49
jnthnwrthngtn We don't have to store the string even, we could just have an integer in the op info and use it to index a table of string constants
And there's few of them so it can just be 8 bits 10:50
nine Every single caller of MVM_op_get_mark looks at the second character. So instead of a full string, all we really need is 1 byte
jnthnwrthngtn Or less
hah :) Even simpler
timo we have like start, middle, end, maybe one more?
jnthnwrthngtn but...is that really true?
I thought some of validation would care about the first...
timo the validator should be at least storing the first byte
to compare against the next ops 10:51
nine Oh, sorry, the validator actually looks at cur_mark[0], too
timo if not, we'd be letting through some very suspect bytecode. which i guess would only really show up in fuzzing tests
nine But still, it's way less than 256 different options
jnthnwrthngtn Indeed. Anyway, it's almost 20 million (!) cycles spent there on startup, so if anybody fancies going after those... :) 10:52
timo so, callgrind counts instruction fetch, right? without cachegrind, we don't really get to find out if a memory access for an array of the values is faster or not
measuring is hard :) 10:54
nine I'd just map those 2 bytes to 1 byte internally. 3 bits for the type, 5 bits for the id is more than enough.
jnthnwrthngtn timo: yes, true 10:55
10:58 linkable6 joined 11:02 nebuchadnezzar joined
jnthnwrthngtn Hurrah, today I think we'll finally be rid of the legacy invoke protocol 11:15
11:16 tealecloud joined
Nicholas "Wake up, time to die!" 11:18
also, I keep thinking that there's some verison of Logan's Run (the film? the book?) where there are cuts to coundowns "10" "9" "8" etc (days to go), in the context of extops 11:19
jnthnwrthngtn I suspect we're as low as we're going to get on extops until the point we decide to make the final push to be rid of them 11:24
I've done all that I need for the sake of new-disp by now
11:26 Kaipi left 11:39 Kaiepi joined
Nicholas jnthnwrthngtn: in 36ff5d15a6020faa92a590dc569bf8144785f58c you write "the extops are now free of all things that are to go away as part of new-disp." but you don't seem to change any actual extops code. 11:53
this doesn't quite seem consistent to my poor befuddled brain 11:54
jnthnwrthngtn Nicholas: There was a change in src/vm/moar/ops/perl6_ops.c 11:56
Nicholas oh yes. There. I missed that. Cofnused it with the NQP code hunk above. 11:57
11:59 evalable6 joined 12:02 reportable6 left 12:03 reportable6 joined
jnthnwrthngtn I think next is 1) elimiante last usage of hllize, 2) eliminate hllize impl, 3) a replacement for nqp::isinvokable that doesn't depend on the old invoke protocol 12:05
Nicholas to check - lunch has already happened? 12:06
and beer fridge is in good shape?
jnthnwrthngtn Yes, just had lunch. Beer fridge is...OK, although I think restocking shall soon be required. 12:11
12:23 Kaipi joined 12:24 Kaiepi left
jnthnwrthngtn 1 is done. 3 is getting there. Might need a rebootstrap to do 2, and I may see if having done 3 lets me get rid of other invoke spec usages before the rebootstrap 12:56
Geth MoarVM/new-disp: a9d912b89a | (Jonathan Worthington)++ | 5 files
Add HLL-configurable lang-isinvokable dispatcher

Which will come to replace the isinvokable op, which is hopefully the final thing that currently depends on the invocation spec mechanism.
  (Since isinvokable implementations boil down to type guards, we can
expect that they'll naturally optimize away under specialization in many cases; we never got around to writing the specialization logic for isinvokable, and now get the same effect "for free" by it being a dispatcher.)
13:02
dogbert11 jnthnwrthngtn: something tells me you're using more than four fingers when typing on the keyboard :) 13:03
dogbert11 learned to type in class several times but still falls back to using two or four fingers 13:04
jnthnwrthngtn All 8 fingers, thumb for spaces :) 13:09
And shift done by whichever hand is not typing the letter to uppercase.
timo there's a software called KMonad that lets you hella program your keyboard even if it's just a boring old usb one 13:10
jnthnwrthngtn Though curiously always the same thumb, which means my space bar is worn on one side and like new on the other one
timo so you can have the typical qmk features like one key being one thing when tapped and another when held
like having shift on each side's middle finger for example 13:11
or putting all modifiers on the home row with this mechanism
lizmat sounds like what MacOS has: keeping a letter down, gives you a menu of accented versions of that letter
timo tapping the shift key to get a left or right parenthesis
lizmat éëèêęėē
timo not sure if KMonad also supports "tapdances" out of the box 13:12
like, hold-then-tap a key for something different from tap-then-hold or tap-tap, etc etc
MasterDuke when i was programming in racket and closure i did the 'tap shift to get left or right parens' thing
timo with a 100% keyboard these things aren't "needed", but the less your hand has to travel away from home row, the faster and more ergonomic you can be, at least that's the theory
MasterDuke don't know why i don't still have that enabled
timo where did you get that from? 13:13
13:13 Ven_de_Thiel joined
MasterDuke i'm trying to remember now, i don't think it was kmonad 13:13
timo maybe it was a specific editor for the language 13:15
that's kind of a natural place to put that kind of functionality
prose / chat doesn't have all that many parenthesis unless you like smileys :) :) :) :) :) :) :) :) :) :) :) :) :) :) :) :) :) :) :) :)
MasterDuke no, it was some sort of systemwide linux utility
xcape, pretty sure that was it 13:18
13:19 frost left
timo neat 13:21
duckduckgo has enormous trouble finding "xcape"
huh
okay, i searched for just xcape first, found mostly thigns called "xscape", then i used the "search for \"xcape\" only" link, which did not find xcape, only pages that mention xcape in passing, like the "alternatives to" page for karabiner or something, and then i added Linux to the search to get "\"xcape\" linux" which did not find the page, but "xcape linux" gives it as the first result 13:23
github.com/ItayGarin/ktrl - "You can think of ktrl as an attempt to re-implement QMK as a Linux daemon." 13:24
MasterDuke ha. i have no memory of how i first found it
timo probably not by knowing its name :D 13:27
getting the first and second byte of an op's mark in two separate functions may help give us a smaller and faster op_get_mark implementation than the one with a bunch of ifs, even without going the route of a table / array to hold the data 13:32
Geth MoarVM/new-disp: 2e93ba07a7 | (Jonathan Worthington)++ | src/core/interp.c
Make deprecated multi-dispatch cache op throw

Now that NQP is rebootstrapped and doesn't use it.
13:36
nine jnthnwrthngtn: oh, you already replaced that hllize MAST::Op? 13:42
I was just gonna push that change 13:43
jnthnwrthngtn Yes
nine I'll remove hllize from MoarVM 13:44
Or rather, already have. Just running tests again
Geth MoarVM/new-disp: 587d0a2aa3 | (Jonathan Worthington)++ | 12 files
Eliminate hllize/hllizefor ops

As well as the HLL mapping implementation that they depended on, which seems to get rid of the final use of legacy invocation too.
13:45
jnthnwrthngtn More than that...
jnthnwrthngtn Oh :)
Altai-man yay
jnthnwrthngtn Darn, I didn't know you were working on that.
Altai-man congrats, jnthnwrthngtn 13:46
nine jnthnwrthngtn: oh, you already replaced that hllize MAST::Op?
I was just gonna push that change
jnthnwrthngtn Yes
fwiw, I'm now ripping out ->invoke and similar
nine I'll remove hllize from MoarVM 13:47
Or rather, already have. Just running tests again 13:48
Geth MoarVM/new-disp: 587d0a2aa3 | (Jonathan Worthington)++ | 12 files
Eliminate hllize/hllizefor ops

As well as the HLL mapping implementation that they depended on, which seems to get rid of the final use of legacy invocation too.
jnthnwrthngtn More than that...
jnthnwrthngtn Oh :)
Darn, I didn't know you were working on that.
fwiw, I'm now ripping out ->invoke and similar
Geth MoarVM/new-disp: 569fe17f4a | (Stefan Seifert)++ | 2 files
Remove now unused legacy hllize configuration keys
jnthnwrthngtn Ah, I had missed that
nine++
nine So not all work was in vain ;) 13:49
Geth MoarVM/new-disp: 7f6e90bf93 | (Jonathan Worthington)++ | 9 files
Remove isinvokable and setinvokespec ops

The latter needs to become a no-op for now, until the next time we do an NQP rebootstrap.
13:53
jnthnwrthngtn Thanks for doing the vast majority of the hllize replacement work :)
nine It was a really good exercise for understanding dispatchers :) 13:55
jnthnwrthngtn: feels good to remove/disable that code, doesn't it? 14:00
jnthnwrthngtn Indeed :) 14:04
At one point the amount of stuff that needed reworking felt overwhelming.
Nicholas Am I doing something wrong. My NQP is at dac798be72a32d32e8eab582a78cd2e8a37a0c60 but +++ Compiling gen/moar/stage1/NQPP6QRegex.moarvm 14:07
fails with
MoarVM op 'setinvokespec' is unknown as a core or extension op at gen/moar/stage1/QAST.nqp:1847 (gen/moar/stage1/QAST.moarvm:check_ret_val)
... 14:08
nine Yet in the end, it's always the same old "do one step after another" that gets you there
MasterDuke Nicholas: same here. did a pull and successfull build in moarvm, and then a pull in nqp, but get that error 14:12
ah, fine after that most recent nqp commit 14:13
Geth MoarVM/new-disp: d4a09e34e8 | (Jonathan Worthington)++ | 13 files
Remove legacy invocation leftovers
14:14
MasterDuke in my scrollback, stage parse on new-disp has gone from 50s to 46.7s (don't know how far back the 50s was though) 14:16
nine: btw, you were mentioned last night colabti.org/irclogger/irclogger_lo...08-31#l239 with a subsequent question 14:21
Geth MoarVM/new-disp: 4ba017ab2d | (Jonathan Worthington)++ | 2 files
Remove some now-unused arg handling functions
14:22
timo wasn't at some point "the way we do argument handling is unreasonably complex so the jit skips implementing some cases" a thing, and is that now fixable with the change in how arguments are passed? 14:27
it was related to autoboxing / autounboxing as i recall? plus optional parameters i guess?
MasterDuke that was prepargs, right?
timo no i think it was *param_* 14:29
MasterDuke ah
timo prepargs always came down to some kind of *invoke_* not being handled, since the stretch from prepargs to whatever-invoke-is-used was handled as one single thing
MasterDuke yep, i have two closed PRs for jitting param ops github.com/MoarVM/MoarVM/pulls?q=i...s%3Aclosed since it was more complicated than i'd realized 14:30
yep, i have two closed PRs for jitting param ops github.com/MoarVM/MoarVM/pulls?q=i...s%3Aclosed since it was more complicated than i'd realized 14:31
timo the way we invoke dispatchers is cool because it gets rid of these preparation steps
Geth MoarVM/new-disp: 5afaac7a0f | (Jonathan Worthington)++ | src/spesh/deopt.c
Update deopt to set up dispatch arg context
timo and we do invoke a lot of things via dispatchers now
jnthnwrthngtn Yes, I know there was some amount of JIT pain because it was spread over many ops before
timo github.com/MoarVM/MoarVM/blob/mast...rgs.c#L296 - returning structs from these functions was part of the issue i seem to recall 14:33
anyway, getting parameters out of the args "buffer" (which is now essentially zero-copy) still requires handling of boxing and autounboxing in cases of spec mismatches, right? 14:36
jnthnwrthngtn Yes 14:37
(And as before, spesh is able to optimize away the indirections there.) 14:46
Geth MoarVM/new-disp: 312e0593e4 | (Jonathan Worthington)++ | 8 files
Eliminate legacy args handling on callee side

This gets rid of the many bits of branching in args handling to decide between legacy and dispatch args handling, as well as making the frame data structure smaller.
14:54
timo :+1:
jnthnwrthngtn nine: I think that we can't yet be rid of `frame->args` (and prepargs and arg_*) because JIT of nativecalls relies on them. 14:55
Or at least, it seems that way to me. :) 14:56
nine So the time comes near to look at NativeCall in a dispatch world_
?
timo possibly, though it's not on the critical path towards new-disp going in master, so it's up to whom-ever when to actually implement that 14:57
MasterDuke rough numbers, but running `sloccount src\` on master and new-disp gives 284338 and 290159 respectively 14:59
jnthnwrthngtn nine: As timo said, it won't be a merge blocker, but it will mean we can't do that final bit of cleanup / frame shrinkage, yes 15:00
nine: I suspect there's some nice speedups possible
nine Speedups in NativeCall or in general due to the frame shrinkage? 15:01
jnthnwrthngtn nine: I was thinking the former, but the latter is probably slightly true also
timo oh, what makes frames shrink? less bytecode because we're no longer compiling the nativecall bodies? 15:03
jnthnwrthngtn timo: At the moment every ->work has an area allocated on the end of it for ->args 15:04
timo: So we'll do away with those registers needing to be allocated
timo oh, that's also still in nativecallinvoke, ok 15:06
ok, i now claim it *is* on the critical path :P 15:12
15:14 rakuUser joined
Geth MoarVM/new-disp: 0bf5a3b6fd | (Jonathan Worthington)++ | 15 files
Remove leftovers of the legacy method cache

Including its lazy deserialization, which going by the code comments removed along with it was a source of no small amount of pain.
15:23
Nicholas commit a8898a70e604abce75a7c85e066677d6c41e8cf4 - yes, it was such a sweet and lovely thing. 15:26
jnthnwrthngtn RIP
IT OUT!
15:27 linkable6 left
Nicholas you killed my [insert a better joke than I can think of right now] - prepare to die 15:27
15:27 squashable6 left
[Coke] Nicholas: "my dispatcher" seems apropos. 15:28
and almost scans.
Nicholas yes.
15:28 linkable6 joined
Nicholas but also, I still vaguely remember that code - "to the pain". and it's more "you killed my nemesis - prepare to be hugged" 15:29
jnthnwrthngtn Once ->args goes, ->cur_args_callsite goes with it, so every frame is two pointers smaller
nine No tear shed here over seen that one gone :)
Nicholas lizmat: commit a8898a70e604abce75a7c85e066677d6c41e8cf4 -- Note that deserialize_method_cache_lazy() is cruel and unforgiving. 15:30
it might be relevant for the weekly.
15:30 squashable6 joined
Nicholas and now commit 0bf5a3b6fdbb18db6225152709407a8582f146bd 15:30
15:30 linkable6 left
jnthnwrthngtn I think I've run out of stuff to rip out and have to resume fixing/optimizing again :) 15:30
Nicholas or language class? 15:31
jnthnwrthngtn Teacher has holiday today
Nicholas oh. That's sort of \o/ as that's good for us. Assuming you're still on a roll.
jnthnwrthngtn Oh, and that happens on Thursday, and it's only Wednesday, I think.
Nicholas oh I'm confused. I thought that it was Wednesday. But I'm not that good at rememberign these things 15:32
All mornings seem the same.
15:33 linkable6 joined
nine And since it's always morning... 15:36
jnthnwrthngtn It seems that t/spec/S32-io/dir.rakudo.moar and t/spec/S03-junctions/autothreading.t are both cases of the same thing 15:37
Nicholas all mornings are equal, but some mornings are more equal than others. And next week, oh great, school restarts, which means hardcore getting up early. 15:41
jnthnwrthngtn Hmm. This is a tricky one.
(In a nutshell: junction named args)
(To multis) 15:42
We use bind failure to mean "move along to the next candidate", but in the case of junction named args we'd like to auto-thread... 15:43
I guess it's possible to detect that we might hit such a situation (due to Any or narrower typed named args in the signature), and insert a "try autothreading on bind failure" thingy into the multi dispatch plan 15:54
Then we can skip over it if there's a callsame or whatever 15:55
But the dir one is weird because...why does it try to auto-thread there... 15:57
m: .say for dir(none(".","..")) 16:01
camelia none((".cpanm".IO ".local".IO ".npm".IO ".perlbrew".IO ".rcc".IO "Perlito".IO "evalbot".IO "log".IO "nqp-js".IO "p1".IO "p2".IO "perl5".IO "std".IO ".bashrc".IO "mbox".IO ".cpan".IO "dalek-queue".IO "rakudo-j-inst-1".IO "rakudo-j-1".IO "rakudo-j-inst-…
jnthnwrthngtn I...don't know that we expect that to auto-thread at all 16:02
oops
m: .say for ".".IO.dir(test => none(".",".."))
camelia none((".".IO), ("..".IO))
Nicholas forgive my naive teddy-bear level understanding, but I thought that none() was something to do with junctions, and that junctions thread, but, I don't remember enough about junctions to know whether none is (sort of like) xor (which can't short-circuit) whereas and and or can... 16:04
jnthnwrthngtn m: .say for dir(test => none(".", ".."))
camelia none((".".IO), ("..".IO))
jnthnwrthngtn That's the evaluation I meant to run before
Yes, none is a kind of jucntion 16:05
I guess there's two things here: 1) I've busted threading over junctions that are passed as named args, 2) unrelatedly, I've discovered that the `test` argument to `dir` is of type Any, whereas it may be more useful were it of type Mu 16:06
(2 is a question for master, not new-disp)
Well, it's related in that both cases trigger the thing I need to fix, I'm just a bit surprsied about `dir` 16:07
lizmat: Dunno if you have opinions on ^^
Nicholas because if it were Mu, the juntion would be passed to it as-is, rather than the calling code having to iterate over the junction, pass the "bits" down to lots of calls, and then build a junction return result frmo the calls? Beacuse docs.raku.org/images/type-graph-Mu.svg 16:12
jnthnwrthngtn Yes 16:13
And more importantly, it'd apply the junction against the filename in question
Which would give useful results
nine jnthnwrthngtn: a call to &return should happen even in inlined frames, right? It's just that there should be a local handler for the control exception which will put the result into some register and let us continue 16:17
jnthnwrthngtn Yes 16:18
I think we also try to rewrite those throws into gotos
nine If it's &return that was inlined 16:21
If our inlinee just calls &return, there will be a throw
jnthnwrthngtn Yes, then it should all happen through exception handling 16:22
nine Apparently it just can't find the handler
The plot thickens as timo++ likes to say. 16:31
FH (0), i.e. the inlinees frame handler that should catch this control exception ends at the sp_dispatch_o r8(3), lits(raku-rv-decont), ... op which is the one that dispatches to &return.
If I add some code _after_ the return in the sub, the error goes away 16:32
jnthnwrthngtn ooh, is it gonna be another inclusive/exclusive bug?
nine exactly
jnthnwrthngtn You know, maybe the current discrepancy in semantics between positionals and named args with regards to multiple dispatch and junctions is just crazy and I shouldn't even try to replicate it 16:33
When there's a far easier solution
Which is to just handle it like positional ones: if there's no match, it's a failover at the end 16:34
Then I "just" have to make multi-junction-failover deal in named args too 16:35
timo the funniest thing about junctions in named arguments is 1) ordering 16:48
nine That MVM_EX_CAT_RETURN handler may be a bit hard to reach: {start_offset = 4294967295, end_offset = 4294967295, category_mask = 32, action = 1, block_reg = 19, goto_offset = 4294967295, label_reg = 19, inlinee = 0} 16:50
Maybe it's not an off-by-one error but rather it's shy cousin, the off-by-4-odd-billion 16:52
timo inflation, eh? 16:53
my history teacher told us that at one point they were getting wheelbarrows full of pointers and before giving them out to people they would write a bunch of zeroes at the end with sharpie 16:54
lizmat jnthnwrthngtn: looks like changing the sig for :test to Mu would be the easiest thing, no? 17:01
jnthnwrthngtn lizmat: Yes, it'd need doing in the sub and method
lizmat oddly, the method version already has Mu 17:02
timo interesting since one of the results jonathan showed was the method version 17:03
nine I think it's indeed an off-by-one error, when setting up the control flow graph. We remove the active handler and then process the instruction 17:09
Or something like that 17:12
lizmat github.com/rakudo/rakudo/commit/21a7117dbe # jnthnwrthngtn
jnthnwrthngtn Neat
Geth MoarVM/new-disp: 99bf756123 | (Jonathan Worthington)++ | 4 files
Additions for guarding with named args also

  * A way to get the total number of arguments, both positional and named,
   which can then be accessed as a flat view in order to access both the
   prim spec and value
  * Liberalize dispatch program construction and compilation to allow for
   guards to be placed on named args
This works out fine because dispatch programs are always relative to a given callsite shape, and names - and their order - form part of the shape.
17:29
jnthnwrthngtn Seems we're down to 1 failing spectest file :) 17:40
(With a push I'm about to do)
Yup, only t/spec/S05-modifier/counted-match.t remains failing 17:42
So 1 spectest, 1 test, and reinstating inlining for Raku multis/methods.# 17:43
And...all the stuff the ecosystem needs :)
And...the thing nine++ is hutning.
Home time o/ 17:44
17:46 evalable6 left, linkable6 left, linkable6 joined 17:47 evalable6 joined
lizmat jnthnwrthngtn ++ 17:58
[Coke] I think we still have the nativecall failures on windows when running with TEST_JOBS > 1
I will do a run today to check
(doing it now) 18:02
I haven't done a windows build in a few weeks.
18:02 reportable6 left 18:12 tealecloud left
[Coke] several compiler warnings on windows about casting 18:13
will try to grab those also
gist.github.com/coke/65fafa7206e21...bdd8a57a20 - (right now just the warnings) 18:19
(one of those is in 3rdparty, I know) 18:28
Yup, ativecall tests still failing when run concurrently (and it seems sporadic) 18:35
(that is, while many tests fail each run, I don't think it's the same ones each time) 18:37
also pseudostash.t fails (but I think that's failing everywhere for me, on master, on osx..>)
Nicholas it is, but I can't remember why it's failing
18:44 tealecloud joined 18:49 tealecloud left
[Coke] yup, definitely not the same tests failing each time. 18:53
Maybe it's some first-come, first-win thing. 18:54
would precomp be involved in any of those tests?
lizmat perhaps of helper test libraries ? 18:56
[Coke] though I guess if it was precomp, it would get better over multiple runs, or at least be consistent which ones failed once they had a bad run. 18:58
lizmat yeah, one would expect gthat
*that
[Coke] Happy to try debugging as time permits. last time I was unable to get a failing run into a debugger since it required the concurrency issues.
anyone has any suggestions, all ears. 18:59
timo .o( activecall ) 19:06
19:16 discord-raku-bot left 19:17 MasterDuke left 19:22 MasterDuke joined, gfldex left 19:24 Ven_de_Thiel left
lizmat . 19:24
nine I have got a fix and it's truly wonderful! But I do not have enough space in this line to describe it.
lizmat there's more lines -) 19:25
nine Actually I would have hade enough space as it's really just the deletion of 2 lines of code, very much akin to github.com/MoarVM/MoarVM/commit/29...7fe83daea1 19:26
It's the "why" that will take more :)
lizmat correclty :-) 19:28
vrurg nine: A Great Fermat Fix... 19:31
19:39 gfldex joined
nine :) 19:41
Better commit it right away
19:46 tbrowder left, tbrowder joined 19:52 discord-raku-bot joined 19:54 linkable6 left
Geth MoarVM/new-disp: 4cb37ce1c0 | (Stefan Seifert)++ | src/spesh/graph.c
Fix return in inlined frame not getting cought

When a frame containing an explicit return was inlined, but the &return sub was not inlined into said frame, the control exception thrown by that return was not getting cought. This led to errors like inifinite loops in JITed code or
  "return outside a routine".
... (10 more lines)
19:55
20:05 reportable6 joined
timo damn when do we fail to inline &return? 20:12
jnthnwrthngtn
.oO( *sigh* Is there a distribution that's basically Ubuntu but without snaps? )
20:13
Nicholas I'm roughly aware of what snaps are, but what's the pain with them?
nine Or why it should be like Ubuntu ;) 20:14
Nicholas and I don't know if the answer is "go upstream - Debian" or if there's some downstream Ubuntu derivative with naps purged.
nine timo: MVM_SPESH_NODELAY=1 is good at creating such edge cases
MasterDuke i use kubuntu on my laptop and don't seem to run into them 20:16
jnthnwrthngtn Nicholas: It was updating Chrome automatically, and doing so in such a way that it suddenly starts to SIGABRT on new tabs, so I told it "no, don't do that", and now it gives me 14 days of warnings that it's going to update Chrome before doing the same bloody thing. That and the kubectl one keeps losing its config files.
*Chromium I guess
I mean, I guess I can find another way to install these things, I just wish the answer was still "apt" 20:17
nine++ # another nice fix
MasterDuke i pretty much just always use apt 20:18
nine jnthnwrthngtn: do you have any memory about why there was a distinction between control and catch handlers in the cfg builder? Those were two fixes that were really just removing the 2 halfs of that distiction 20:20
timo maybe because most handlers don't catch control? or the default resume behavior perhaps? 20:21
nine The distinction was there to restrict which handler blocks got edges drawn to. But that would require that we actually know which type of exceptions the covered code could throw, which we don't in the case of invocations. 20:22
japhb jnthnwrthngtn: Linux Mint is basically Ubuntu with no snaps (and a generally friendlier disposition). I get Chromium and FF via normal apt updates. 20:25
jnthnwrthngtn japhb: Ah, that's good to know; thanks. 20:26
japhb (Actually, I usually use the panel tray icon, because Mint's updater pays attention to what type of update it is (security, kernel, misc, ...) and has a helpful "look at the changelogs before deciding" view)
But it's all apt underneath.
(And I still do apt installs on the command line, because why not?) 20:27
When I installed the first version of Mint after Ubuntu went all in on snaps, the installer had a big warning that's like "WE'VE TURNED OFF SNAP. IF YOU WERE EXPECTING SNAP, GO READ THE BLOG POST ABOUT IT." 20:28
jnthnwrthngtn nine: Actually having read the commit more carefully now I'm not sure how nice of a fix it is... 20:30
nine: Initially, we kept every exception handler alive by adding an edge from the entry BB 20:31
That meant that we could never ever remove one
At some point, I noticed that if you, for example, killed an entire branch (due to constant folding), then we couldn't delete any handlers inside of that. 20:32
nine jnthnwrthngtn: interesting timing. I was just going through it again because I got doubts
jnthnwrthngtn Yeah, my "nine++" was actually before reading the code and just skimming the message :)
Nicholas neuralize it with rebase? :-) 20:33
jnthnwrthngtn Anyway, I think for catch handlers, inlining restrictions meant we'd never ever see enough to eliminate them in realistic situations anyway
nine I think the real bug is still there and just verified it. We're missing edges from the blocks covered by the handler. My commit just works around that
jnthnwrthngtn But with control exceptions many of them are thrown in a lightweight way.
That we can rewrite into gotos
Anyway, the goal was to add edges to the handler from every covered BB
If all *those* go away, then the handler is covering nothing 20:34
Such is the theory
MasterDuke are there any plans for future control exception optimizations? i know tux thinks next/last/etc are what's currently slow about his test-t 20:35
jnthnwrthngtn And yes, missing edges - perhaps thanks to inlining - may be related, although I think we *also* refuse to throw away blocks inside an inlinee
It's possible we're losing them in some other way
Or that there's a construction bug in the graph in the first place, but that seems less likely
Anyway, I think the catch handler opt-out was because a more accurate set of edges didn't stand to win us anything 20:36
nine For one, the cfg builder only considers dispatch_* ops, but not the spesh versions thereof
jnthnwrthngtn Oh?
I'm sure I remember teaching graph.c about runkfunk and runbytecode 20:37
nine You did for variable arguments, but not for handlers
jnthnwrthngtn Hm, handlers, or just BB terminators? 20:38
nine github.com/MoarVM/MoarVM/blob/new-...aph.c#L728
jnthnwrthngtn I may be confusing my CFG implementations, but I thought the handler edge insertion was driven by BB boundaries (e.g. "end of covered region BB means edge")
nine BB terminators are fine
jnthnwrthngtn Oh, we're trying to be clever and only put edges where we think we need 'em, huh... :) 20:39
Yeah, I forgot that; the last project I worked on where I did a fresh CFG and similar impl, I didn't do that, just shoved 'em on ever block in the try region :) 20:40
*every
I wonder if that simplicity loses us anything 20:41
Or rather, if trying to be clever wins us anything
nine That seems actually be the real cause of the bug :)
jnthnwrthngtn Yay. Did you make it add the edges unconditionally, or add the extra ops? 20:43
Geth MoarVM/new-disp: e3f77ed4f4 | (Stefan Seifert)++ | src/spesh/graph.c
Revert "Fix return in inlined frame not getting cought"

This reverts commit 4cb37ce1c0e4fc1f24fa4f89f2ed49bf7c2e2f72.
20:44
MoarVM/new-disp: 42d3b8af4d | (Stefan Seifert)++ | src/spesh/graph.c
Fix return in inlined frame not getting cought

When a frame containing an explicit return was inlined, but the &return sub was not inlined into said frame, the control exception thrown by that return was not getting cought. This led to errors like inifinite loops in JITed code or
  "return outside a routine".
... (8 more lines)
nine Now the graph looks the way I like it to :)
Nicholas is this another commit/revert pair to "fix in post" ? 20:45
20:45 tealecloud joined
nine yes 20:45
jnthnwrthngtn Wow, somebody other than me did a spello. :)
Nicholas if it wasn't clear, this is actually a serious suggestion - I am assuming that new-disp will get rebased. And at that point, take out the adjacent pairs of commit/oops.
nine oops 20:46
jnthnwrthngtn Nicholas: It's a good idea, now whoever does the rebase just needs to remember :) 20:48
20:50 tealecloud left 20:56 linkable6 joined
jnthnwrthngtn For some reason I thought t/02-rakudo/18-pseudostash.t was going to be tricky to debug. Turns out...if I read the comment in the test it told me pretty much what'd need changing! 21:06
So, clean `make test` 21:07
And one failing file in `make spectest`
That one *does* look like an awkward debug; if anybody fancies some golfing...
[Coke] is it just straight golfing with a new-disp rakudo? I can throw some cycles at that. 21:11
which test?
jnthnwrthngtn t/spec/S05-modifier/counted-match.t 21:13
[Coke] ... I do not think all these things I put in this glass make a manhattan. blech. 21:16
ah. perhaps I used 5x too many bitters, which is.. yup. That's it. 21:18
jnthnwrthngtn I'm...guessing it tastes bitter?
jnthnwrthngtn knows almost nothing about making cocktails 21:19
MasterDuke heh. i was going to make a manhattan this evening, but my vermouth is getting a bit old
i do however love angostura, so i go heavy on the bitters
[Coke] does booze expire? :)
MasterDuke not most, but since vermouth is just fortified wine it can 21:20
[Coke] drinking a manhattan in honor of a friend, and I'm afraid I've just ruined this one. Ah well, will try again.
vrurg In a couple of hundred years everything would expire...
MasterDuke easy solution though, just add 4x more bourbon and hope you don't have to drive anywhere soon
[Coke] HA 21:21
... ok, manhattan & coke, that has taken the edge off the bitters.
MasterDuke well, they've drunk wine from ancient greece/rome that wasn't terrible because it was completely sealed
21:30 Altai-man_ joined
vrurg MasterDuke: really? I've only heard of non-drinkable findings. 21:32
[Coke] ok, I can get the test failing, will golf a bit. 21:33
MasterDuke hm, i could have sworn i'd read of something found that was tried relatively recently (past year or so), but now i can't find the article. dunno, maybe i'm mistaken 21:37
[Coke] "aa" ~~ m:nth(any(1))/./; "aa" ~~ m:nth(any(1))/./; 21:40
japhb wonders what the oldest find was where someone went "Hey, I wonder what that tastes like!"
[Coke] the strings can be different, but there has to be two consecutive matches against junctions. 21:41
any junctions seem to trigger it.
that is, any kind of junctions, not specifically any() junction. :)
guessing maybe something is getting accidentally reused when junctions are involved? 21:43
MasterDuke well, i know they've definitely tasted honey found in pyramids
timo i'd try to taste the background radiation of the universe if that made any sense 21:44
MasterDuke wouldn't that be easy? just stick your tongue out?
[Coke] Nah, it's all gone locally. 21:46
dogbert11 the assertion triggered when running t/spec/S32-io/io-cathandle.t with MVM_SPESH_NODELAY and a small nursery is github.com/MoarVM/MoarVM/blob/new-...eopt.c#L32 21:53
22:02 Altai-man_ left 22:06 Altai-man left
Geth MoarVM/new-disp: 5d1dc330b7 | (Jonathan Worthington)++ | 3 files
Ensure args proc setup/cleanup gets inlined

It doesn't account for many cycles, so removing the calling overhead is worth it.
22:09
MasterDuke jnthnwrthngtn: the change in find_method_qualified, that's faster? istr a large speedup when compiling custom operators a long time ago by switching to nqp::findmethod
jnthnwrthngtn MasterDuke: nqp::findmethod will usually be faster now, *but* it'll be faster when there's a monomorphic or polymorphic site; this one is clearly megamorphic in any non-trivial application 22:11
(highly variable in both type and name) 22:12
MasterDuke *only* be faster when there's a monomorphic or polymorphic site?
jnthnwrthngtn Yes 22:13
MasterDuke ah, interesting
jnthnwrthngtn There's something in place to handle megamorphic in method name but relatively stable in type already in place...
Which helps with, for example, the protoregex site
Startup time is going to be...an interesting battle.
We've saved deserializing big method caches (yay) 22:14
But have gained deserializing some full meta-objects that we maybe didn't have to before, and the callgrind output (under MVM_6model_get_how) pretty much confirms it 22:15
No less than 25% of current startup time is underneath that
MasterDuke btw, not new-disp related, but as i mentioned to timo yesterday, github.com/faster-cpython/ideas/is...dated-desc has a bunch of stuff about improving startup for python that might provide inspiration
and other non-startup things 22:16
timo i haven't checked in a little while, but at some point we executed a boatload of empty class and role bodies upon startup. like, all the exception classes for example 22:19
[Coke] jnthnwrthngtn: does that :nth golf help? (I didn't feel like I trimmed much.) 22:24
jnthnwrthngtn [Coke]: Kinda in that it shows that it's not dependent on other stuff in the test file etc. 22:29
Too tired to dig more into it today, I think
afk for a bit
23:06 linkable6 left, evalable6 left 23:08 linkable6 joined 23:09 evalable6 joined 23:24 tealecloud joined 23:28 tealecloud left