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:08 reportable6 left 00:10 reportable6 joined 00:33 linkable6 left 00:35 linkable6 joined 01:28 Merfont left 03:55 unicodable6 left, squashable6 left, nativecallable6 left, committable6 left, statisfiable6 left, releasable6 left, coverable6 left, linkable6 left, evalable6 left, benchable6 left, notable6 left, reportable6 left, quotable6 left, greppable6 left, sourceable6 left, bloatable6 left, shareable6 left, tellable6 left, bisectable6 left 03:56 quotable6 joined, releasable6 joined, squashable6 joined, unicodable6 joined, linkable6 joined, statisfiable6 joined 03:57 sourceable6 joined, benchable6 joined, committable6 joined 03:58 shareable6 joined, tellable6 joined, bisectable6 joined 04:56 greppable6 joined, coverable6 joined, notable6 joined 05:56 linkable6 left 05:57 evalable6 joined, nativecallable6 joined 05:58 linkable6 joined
nine Now that vrurg++ put it this way: what if we have a callsite where we call an unwrapped routine, dispatch accordingly but between this first and the next call at this callsite the routine actually gets wrapped? How do we detect that? 06:10
The answer is: the only way a routine object can get a WRAPPERS method is by getting mixed into. But mixing into an object changes the object's type and we have a guard on the callee's type. So that's how we end up back in the dispatcher which now deals with the wrappers. 06:12
07:11 reportable6 joined
Nicholas *, * good 07:20
Geth MoarVM: 4a3b98d546 | (Stefan Seifert)++ | src/spesh/optimize.c
Teach optimize_decont about UINT64 box type
07:27
MoarVM: ed3cdd382f | (Stefan Seifert)++ | src/spesh/facts.c
Fix spesh turning decont of a UIntLexRef into a decont_i

We wrongly assumed int_lex_ref as the type of the result of a getlex_u* op when gathering facts. This led us to making optimization decisions based on the wrong type.
08:57 bloatable6 joined
lizmat oooh..., that looks like an interesting fix performance wise! 09:18
nine I think there are still several optimizations that need to cover uint now 09:41
Geth MoarVM: scovit++ created pull request #1666:
Make rakudo available on the GNU Hurd
09:47
lizmat m: sub a(int $a, int $b) { }; a 42, 666 for ^10000000; say now - ENTER now # something I just noticed now 10:06
camelia 0.584606328
lizmat m: sub a(Int:D $a, int $b) { }; a 42, 666 for ^10000000; say now - ENTER now # Int:D int *much* faster
camelia 0.069507487
lizmat a factor of 8 ?
timo www.ui.perfetto.dev/ may be interesting at some point 10:14
lizmat: i'm willing to bet it's about boxing that we're not noticing is unnecessary 10:18
lizmat actually, the int int case does not inline: 10:22
a BB(1, 18 bytes) -> BB(2):
target has a :noinline instruction - ins: paramnamesused
timo huh, paramnamesused, that suggests we're not arg-speshing it 10:23
lizmat is just reporting :-) 10:24
m: 'sub a(int @a, int $b) { }; a (my int @ = 42), 666 for ^100000 # also does not inline 10:25
camelia ===SORRY!=== Error while compiling <tmp>
Unable to parse expression in single quotes; couldn't find final "'" (corresponding starter was at line 1)
at <tmp>:1
------> 3666 for ^100000 # also does not inlineā<EOL>
expectingā€¦
lizmat m: sub a(int @a, int $b) { }; a (my int @ = 42), 666 for ^100000 # also does not inline
camelia ( no output )
lizmat a BB(1, 46 bytes) -> BB(2):
target has a :noinline instruction - ins: sp_assertparamcheck
is that something that should be handled with new-disp dispatching ? 10:26
timo hm, good question 10:35
10:43 Merfont joined 11:24 Altai-man joined 12:08 TheAthlete joined, reportable6 left
jnthnwrthngtn No, that's pretty orthogonal to dispatching, it's about optimization of signature checking. If that op is still around, it means we didn't prove that, in the given specialization, the signature will always bind 12:43
timo and failing the bind at that point isn't a point where we could do a resumption into an error handler or something? 12:46
i wonder if we can perhaps have an sp_sp_assertparamcheck that takes info about the original callable and signature and all the arguments as parameters or something
so that inlining would be safe since all necessary info is kept available
so that inlining would be safe since all necessary info is kept available 12:47
sp_assertsp_aramcheck
13:58 discord-raku-bot left, discord-raku-bot joined
nine I'm surprised about int int not param speshing. E.g. I've tested int Int and that speshes (while int Int:D doesn't) 14:18
vrurg nine: Then something didn't work as expected. I have managed to get wrapped `proto` working by the proposed method: added the attribute to Routine then added a guarding on it in raku-meth-deferral resumption. Right after the guard on $track_method type. 14:19
And there is one more thing. Unless I'm misinterpreted the dumped programs, but it looks like unwrapping results in returning to the default multi-method dispatching path. 14:20
nine Oh, but I've tested something like sub foo(int $a, Int $b) { }; my int $a = 1; foo($a, 1) for ^2000000
sub foo(int $a, int $b) { my $x = $a; }; foo(2, 1) for ^20000000; speshes just fine? 14:23
vrurg nine: BTW, with regard to LibXML, there is missing 'unsigned' in error message of native_ref_store_u. And there is no difference in store and fetch messages, making it harder to track down. I can make a PR, but not sure when will have time for it.
nine As does 'sub foo(int $a, Int $b). It's really 'sub foo(int $a, Int:D $b) which tanks performance
vrurg: feel free :) 14:24
vrurg Unfudged S06-advanced/dispatching.t currently fails with 'Already set resume init args for this dispatcher'. This is a case where a multi-dispatch candidate gets wrapped with another multi-dispatch. Looks like delegating back to a dispatcher which is already was called/delegated to is not possible. Do I understand it correctly that because delegations do not recurse this wrapping will never work? 14:48
jnthnwrthngtn vrurg: Correct, we don't support the same resumable dispatcher occurring recursively 15:57
vrurg jnthnwrthngtn: any plans for this? I mean, we're not prohibiting that behaviour of wrapping. 16:01
jnthnwrthngtn We could explicitly prohibit it with a decent error 16:04
We could also have a multi-wrapper dispatcher that forces us to run the proto and do a resumption to actually going to the multi candidate, to "split" the dispatch at that point 16:05
e.g. "you can do this but you'll not get the optimization that avoids running the proto"
vrurg The latter is ok, I think. It's a rare and extremely specific case. 16:20
jnthnwrthngtn Yeah, I don't feel much like making the dispatch mechanism more complex for this, if we have an acceptable "user-space" solution 16:32
16:39 TheAthlete left 16:49 sena_kun_ joined, Altai-man left 17:09 reportable6 joined 17:36 sena_kun_ left 18:07 reportable6 left 19:10 reportable6 joined 19:34 squashable6 left 19:36 squashable6 joined 19:56 discord-raku-bot left, discord-raku-bot joined 20:10 MasterDuke left
vrurg jnthnwrthngtn: BTW, what would be the best way to find out if a recursive delegation took place? 20:12
20:39 MasterDuke joined
Geth MoarVM/master: 6 commits pushed by (Daniel Green)++, MasterDuke17++ 21:09
MoarVM: d968da8927 | (Daniel Green)++ | src/jit/compile.c
Use correct sizes in format string
MoarVM: 58d0d7567c | (Daniel Green)++ | src/strings/gb18030_codeindex.h
Remove impossible logic
MoarVM: 0b2bda31fc | MasterDuke17++ (committed using GitHub Web editor) | 2 files
Merge pull request #1664 from MasterDuke17/fix_more_things_found_by_lgtm.com
vrurg MasterDuke: would you, pls, merge github.com/MoarVM/MoarVM/pull/1665? It holds me back from updating moar. 21:27
Geth MoarVM: 72b313b2f2 | (Vadim Belman)++ | src/disp/program.c
Make it possible turn dispatcher debugger with compiler options

Sometimes it is better than editing the source.
MoarVM: 74bbbccabf | MasterDuke17++ (committed using GitHub Web editor) | src/disp/program.c
Merge pull request #1665 from vrurg/disp-debug-trigger
vrurg MasterDuke++
21:59 discord-raku-bot left, discord-raku-bot joined