00:02 reportable6 left 00:03 coleman-x left, coleman-x joined 00:04 reportable6 joined 00:22 evalable6 joined 00:52 ggoebel left 01:24 linkable6 joined 05:18 kjp_ is now known as kjp 06:02 reportable6 left 06:06 bartolin joined, japhb_ joined 06:10 jdv_ joined 06:14 timo left, lizmat left, MasterDuke left, harrow left, japhb left, ilogger2 left, Util left, bartolin_ left, raydiak left, jdv left 06:15 timo joined 06:16 lizmat joined, harrow joined 06:17 Util joined 06:20 raydiak joined 06:25 ilogger2 joined
Nicholas good *, #moarvm 06:37
unless you're big endian, in which case your morning is still a bit LTA 06:38
06:38 patrickb joined 06:50 harrow left 06:53 harrow joined 07:03 reportable6 joined 07:08 ggoebel joined 07:16 Kaipi joined, ggoebel_ joined 07:18 shareable6_ joined 07:21 shareable6 left, Kaiepi left, ggoebel left, tellable6 left, tellable6 joined 07:22 childlikempress joined, moon-child left, childlikempress is now known as moon-child 07:25 committable6_ joined, notable6_ joined 07:27 notable6 left, committable6 left 07:31 samcv_ joined 07:34 samcv left 08:17 jdv_ left, jdv joined
Nicholas nine: if "all" I am doing is defining MVM_LOG_DEOPTS 1, how do I know if a deopt was "recent"? 08:22
I can see what the most recent logged thing is before my breakpoint on MVM_exception_throw_adhoc is hit, but I don't know what that then tells me. 08:23
08:29 bloatable6 left, bisectable6 left 08:30 bloatable6 joined, bisectable6 joined 08:40 Kaipi left 08:42 Kaiepi joined, reportable6 left 08:43 reportable6 joined
nine  08:48
moon-child 08:49
nine Nicholas: what does it tell you?
Nicholas Deopt one requested by interpreter in frame 'raku-multi-plan' (cuid '198') Will deopt 4128 -> 4344 Completed deopt_one in 'raku-multi-plan' (cuid '198') 08:51
Breakpoint 1, MVM_exception_throw_adhoc (tc=0x10030b90,
(but in 5 lines, not 2)
nine That's not the same frame as your bisection result. Are there any deopts in 'val' at all? 08:52
May be worth a try to verify the jit-bisect result manually. Sometimes it's a bit off unfortunately :/ Disabling hash randomization may help getting a stable result 08:53
Nicholas can't see on in val
and I think that this is the same output as last night
and it's a different ppc64 machine.
can't see one in val
usign the first ppc64 machine to grind forwards trying to find the last good rakduo/nqp/MoarVM combo 08:54
commit 42b52ec9e392b00b9114b1c213ee4ae14ca4d789 was good
08:55 linkable6 left 09:05 ggoebel__ joined 09:07 jdv left, jdv joined 09:12 jdv_ joined 09:14 ggoebel_ left, jdv left, moon-child left, moon-child joined
jnthnwrthngtn Nicholas: I always disable hash randomization when doing spesh/JIT bissects, because it reliably makes them useless 09:34
(In fact, I'd probably have been better disabling it throughout the new-disp work and reenabling it before merge... :)) 09:36
nine I wonder if it'd have a measurable cost to make it possible to disable hash randomization via an environment variable? 09:41
jnthnwrthngtn I think it'd be tested on some hot paths, but it maybe possible to arrange things so not 09:42
lizmat it would be nice to have it environment variable settable 09:44
nine It'd be an MVM_LIKELY(tc->instance->hash_randomize) per hash we construct 09:46
lizmat that feels expensive?
jnthnwrthngtn Hmm, despite the vast improvement there are still 13754 attempts to transition a full dispatch cache in the p6-mqtt thing. 09:47
Nicholas it also needs to be a check on that (or similar) at the start of every string we feed into siphash
jnthnwrthngtn That'd be the most costly place, I guess? 09:49
nine Nicholas: does it? I don't see any checks for MVM_HASH_RANDOMIZE there?
Nicholas actually, not. but it's the setup of tc->instance->hashSecrets[0] and tc->instance->hashSecrets[1] that also needs to be changed to a fixed value (ie 0) if hash randomsiation is disabled 09:52
else one gets different results from MVM_string_hash_code for each run, and that will make different hash ordering
nine Yes. I didn't mention that because it's a one time thng 09:53
Nicholas true. I was confused. But it's still "don't forget..."
jnthnwrthngtn Ah, then maybe not too terribly costly 09:56
Should we worry about folks setting the env var instead of fixing their busted code/tests? :) 10:03
timo could require -DDEBUG for that perhaps
then it will be available mostly to devs, but normal users don't get the performance hit 10:04
dogbert17 m: &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; grep(Str) # correct? GH #4543 10:11
camelia ( no output )
timo m: &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; grep.(Str) 10:14
camelia ===SORRY!=== Error while compiling <tmp>
Calling grep() will never work with signature of the proto (Mu, |)
at <tmp>:1
------> od CALL-ME (|) { say "Got a call"; }} ; grep.(Str)
timo m: &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; &grep.(Str)
camelia ( no output )
timo feels a little strange to put a CALL-ME on a sub, though that's kind of what nativecall does 10:15
the normal way to do this would be with wrap though, right?
Geth MoarVM/hash_randomization_environment_variable: c6c7041781 | (Stefan Seifert)++ | 6 files
Support disabling hash randomization via environment variable

This makes it easier to debug and get useful results from e.g. jit-bisect.pl.
nine timo: what NativeCall used to do
dogbert17 c: 2021.09 &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; grep(Str)
committable6_ dogbert17, ¦2021.09: «Got a call␤»
jnthnwrthngtn Even if we reinstate paying attention to the mixed-in CALL-ME, it's not going to impact any callsites already bound to an outcome pre-mixin. 10:24
The immutability of the lexpad post-CHECK time really should be considered to extend to Routines installed into it at compile-time also.
However, we can't just forbid `does` on a Routine because that's a perfectly fine thing for a trait to be doing. 10:25
lizmat but does are at compile time, generally, no? 10:27
Geth MoarVM: 1420640ab2 | (Jonathan Worthington)++ | 3 files
Add a way to request non-installation of a DP

In some cases, we may know that we are only recording a new dispatch program because of a transient situation. For example, a megamorphic by type method dispatcher may end up in record mode because the class in question didn't have a cached flat method table yet. Once that situation is resolved, an already installed dispatch program could start to match. Thus provide a way for a dispatcher to indicate that it's not worth the installation of the current dispatch program, so we can hopefully avoid one cause of piling up a mass of programs at the callsite beyond the point we realize it's megamorphic.
jnthnwrthngtn lizmat: Yes, they are, and it's possible that the issue was golfed from such a situation too. 10:30
Hm, that plus a matching NQP commit are not quite so helpful as hoped... 10:32
lunch, bbl
lizmat jnthnwrthngtn: yeah, basicallt from 8.0 to 7.9 for MQTT::Client test 10:36
ah, missed the NQP one: with the NQP one, it's down to 7.8 for me 10:43
10:48 Altai-man joined
Nicholas OK, first (of many?) big endian bug appears in MoarVM between 720b1aa169de2fb508f7ae80e095b89fad30af4b and 649c9ccad21debf80fec48025b824bad07464785 10:52
actually, end is tigher than that. It's present at e9be25809ccfdf13b9db4beeba2a4f9cf0feb535 (which changes which op is reported as NYI) 10:53
nine So, just 12K lines of diff to comb :D
Nicholas I'm trying to get down to 1 commit 10:54
nine Lets hope it will be the actual commit introducing the broken code, not just a commit unlocking some previously broken optimization 10:56
Though even the latter can point us in the right direction
Nicholas even if it's the latter, it reduces the number of thigns to look for
remember, I don't udnerstand spesh. but I do understand C :-)
10:56 linkable6 joined
Nicholas OK, it's wierder still. It's commit edb9e5bc04c1232799c378779681ba9a4096a898 10:58
edb9e5bc04c1232799c378779681ba9a4096a898 / 27d0b9ff6e0e86bf8763daef7927a8216f6a145b / b21bf9a80e380b17f72cd34b63d40552b8c79ed3 is bad (gets a NYI) 10:59
10:59 linkable6 left
Nicholas edb9e5bc04c1232799c378779681ba9a4096a898^ / 27d0b9ff6e0e86bf8763daef7927a8216f6a145b / b21bf9a80e380b17f72cd34b63d40552b8c79ed3 is good 10:59
11:00 linkable6 joined
nine Huh...can't claim that the error is blatantly obvious to me. But then, if it were I'd probably have avoided it in the first place 11:02
Nicholas prior to that commit, only 1 line does new_operands[3].lit_ui32 = deopt_index;
which size *should* a deopt_index be?
nine why deopt_index? 11:04
Nicholas it's assigned to lit_ui32
I'm suspicious about alignment in unions
nine The commit does new_operands[2].lit_ui32 = MVM_disp_inline_cache_get_slot(...). And the latter does return an MVMuint32 11:05
And there are 4 other places that do exactly the same
Nicholas but only 1 is uncommented? 11:06
and I don't know if it is reachable
nine No? optimize_getlexstatic does exactly the same 11:07
sp_assertparamcheck's arguments are defined in oplist as r(int64) sslot uint32 and write_instructions in codegen.c reads ins->operands[i].lit_ui32 for MVM_operand_uint32 parameters. So assigning to lit_ui32 should be safe, shouldn't it? 11:13
11:13 ggoebel__ left
Nicholas well, I believe so 11:13
nine Nicholas: can it really be something as basic as GET_UI32 in interp.c? 11:19
Nicholas I really dobut it 11:20
new strangeness - I stuck a breakpoint on sp_assertparamcheck and ok is 1 both times
11:21 ggoebel__ joined
timo turned off jit before? 11:21
Nicholas timo: this is ppc64
timo ah, of course
you're debugging endianness issues
Nicholas JIT is "NYI" :-)
timo SMOP, surely 11:22
Nicholas FSA_SIZE_DEBUG and valigrind find an invalid write at interp.c:248 11:33
OP(extend_i16): 11:34
GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).i16;
before this spesh problem.
so, the real bug is earlier...
timo huh, is that not targeting a 64bit register?
Nicholas unavoidable lunch& 11:36
timo non-maskable interlunch 11:37
11:38 ggoebel__ left 12:03 reportable6 left, reportable6 joined 12:15 rypervenche left 12:29 japhb_ is now known as japhb, rypervenche joined 13:25 [Coke] is now known as CokeZero, CokeZero is now known as [Coke]
jnthnwrthngtn lizmat: Yeah, it's something. Also it's now pretty close to what it was before new-disp for me. 13:33
(A bit slower, but not by that much.)
nine jnthnwrthngtn: looks like Inline::Perl5's slow down doesn't have anything to do with the method cache or find_best_dispatchee no longer existing. Looks more like optimized NativeCall sub bodies are no longer used 13:35
Have to confirm the latter though. Profiler's too broken to tell from that
timo :o 13:36
jnthnwrthngtn Profiler's broken? In a way specific to nativecall, or? 13:37
(I've used it quite a bit recently)
nine Well for one running with --profile is super slow compared to before. I also don't get a call graph anymore 13:38
[Coke] build seems broken on windows again. Might be me trying to force a build of all 3 bits from one config line.
nine Have to change trains. May be a bit
jnthnwrthngtn nine: Odd, I was seeing much smaller profiler output
(For the things I tried)
Including finally being able to do CORE.setting
So I guess there's something different about this case 13:39
nine testing CSV's csp-ip5xs.pl 13:45
profile time seems to grow exponentially with the number of rows
[Coke] seeing many more warnings in moarvm build today, weird. 13:46
nine 16K rows take half a minute, 100K rows take noeth of half an hour 13:47
[Coke] (wonder if I accidentally deleted some lines yesterday.)
jnthnwrthngtn o.O 13:48
I'd guess perf would show up something of interest
Nicholas I'm really strugglign with this big endian stuff. 14:00
[Coke] updated compiler warnings: gist.github.com/coke/4626a2760c314...794c55f2ac
Nicholas In that, I end up with valgrind reporting garbage reads (or writes) with spesh enabled 14:01
but from interp.c and non spesh ops
jnthnwrthngtn Normal ops are executed in spesh code
Garbage as in uninitialized or out of bounds? 14:02
Nicholas but if I build the same version on x86_64 with (the same) paranoia, all is happy
jnthnwrthngtn oh, writes implies the latter
Nicholas ==1619710== Address 0x119f62d8 is not stack'd, malloc'd or (recently) free'd
==1619710== Invalid read of size 8
jnthnwrthngtn Can you breakpoint it and get the register index it's trying to read?
timo perhaps even `call MVM_dump_bytecode(tc)` 14:03
Nicholas no, I can't see how I can 14:04
valgrind reports different errors from a gdb run
so I'm not getting a SEGV when usign gdb
timo in theory, doesn't valgrind also expose a gdbserver interface? 14:06
can you also get it to complain with asan?
i think asan has an env var option that lets you abort() when such an access happens
jnthnwrthngtn This is odd, some inline caches reach full entries even though I don't think that should be possible any more... 14:11
Or rather, in a situation I think it shouldn't be possible 14:12
yeah, this is weird, it should be boring 14:17
A simple method call
With a huge variance in invocant type 14:18
oh 14:20
It's boot-boolify 14:22
It guards on type 14:23
nine Not kiddimg: they just told us that they have to reboot the train. The IT Crowd was far more visionary than I thought 14:39
jnthnwrthngtn Seems there is a little benefit in running latest dispatch program first (in order to get the megamorphic handler added most recently) 14:51
Nicholas I didn't know that ASAN had "UNKNWON" in its vocab: ==1629517==The signal is caused by a UNKNOWN memory access. 15:11
lizmat cosmic ray?
neutrino? 15:13
WIMP? 15:14
Geth MoarVM: f452513c57 | (Jonathan Worthington)++ | src/disp/inline_cache.c
Attempt latest dispatch program first

This means that for megamorphic sites that install a program to handle everything, we'll use that ahead of the rest. Rationale:
  * The dispatch programs we stacked up before installing the megamorphic
   one are liable to regularly fail, and so less efficient to attempt
... (7 more lines)
MoarVM: c7237e9c83 | (Jonathan Worthington)++ | 2 files
Translate dispatch ops used at megamorphic sites

So that we will be able to at least JIT compile the HOW access and hash lookup.
lizmat seems to gain another .1 on MQTT-Client test 15:30
jnthnwrthngtn Yeah, that's the kind of magnitude I saw now 15:31
How does it compare on your machine to the pre-new-disp measurement? 15:32
lizmat I don't think I have a proper local one
jnthnwrthngtn ah, ok, I was asking 'cus I don't on this box either 15:33
But I think we're probably within 10% now
lizmat yeah, feels like 15:34
jnthnwrthngtn Given this is one of the worst cases for the new-disp model (explosions of types all over the place), that's not too bad. 15:35
boot-boolify handles the megamorphic stuff quite badly 15:36
Figuring out a solution for that would likely help, I'm just not too sure what it'll look like yet
Probably pushing some amount of it out of the VM and into userspace 15:37
lizmat well, that's what you've been doing a lot of lately anyway, right?
jnthnwrthngtn Yup :)
lizmat so that would be a good thing, no?
jnthnwrthngtn I just need to decide how far to go with it, is all 15:38
lizmat right.... and I guess more userland stuff, means more warmup time
jnthnwrthngtn Do we toss the boolification spec entirely in MoarVM and do a full dispatch solution, for example.
Yes, there's that
Anyway, 10% slowdown is much more manageable than factor of 7 slowdown. 15:40
lizmat indeed :) 15:41
although 10% speedup would be better :-) 16:06
[Coke] :P 16:07
lizmat yeah, I know :-) 16:08
[Coke] ok. on windows today, I am getting failed to load library 'dynext\perl6_ops_moar.dll' at gen\moar\BOOTSTRAP\v6c.nqp:1134 (<ephemeral file>:)
moarvm and nqp appear to have built and installed...
ugh. nevermind. 16:10
timo the perils of using Configure.pl to build all three parts? 16:11
[Coke] (typo in the PATH setup, so while the --prefix was pulling from the right spot, trying to run the installed nqp later was not great.
jnthnwrthngtn lizmat: I suspect if we find a way to cache the derived regex languages between EVALs we'll gain at least that.
[Coke] timo: of NOT using, in this case. writing a .bat file to help me force all 3 to build at master 16:12
timo oh my 16:13
nine Really looks like NativeCall is not using the generated function bodies anymore. Except during BEGIN time (just to make it weird) 16:16
16:18 MasterDuke joined
nine No, it's not BEGIN vs. runtime either 16:20
[Coke] nope, fixed my typo, still can't build rakudo on head. wtf. 16:29
Geth MoarVM: 6cdb0846c5 | (Jonathan Worthington)++ | src/6model/reprs/ReentrantMutex.c
Fix segfault when GCing ReentrantMutex

We cannot clone a ReentrantMutex. In the event that we attempt to do so, an object is allocated, but then not initialized. That lack of initialization would lead to a NULL pointer dereference when we tried to GC the lock. (We don't need to take care of this anywhere else, because the clone never leaks out to userspace; an exception is thrown before it can.)
timo oh wow
16:31 coleman-x left
nine jnthnwrthngtn: when _do_ we fail to initialize a mutex? And can we actually recover in that situation? 16:33
jnthnwrthngtn nine: When we allocate the memory (in the GC), then call `copy_to`, and it throws 16:35
The GC still needs to clear up the allocation
hah, I wrote a Rakudo test to cover it, then realized that if I push it it'll SEGV unless I do version bumps... 16:36
nine Looks like the generated bodies that do get used are created by the CHECK phaser NativeCall exports: github.com/rakudo/rakudo/blob/mast...kumod#L792 16:41
But that should really be all of them. Without the CHECK phaser we don't call any generated bodies at all. With it only some 16:46
I really can't find a system in this 17:08
17:09 linkable6 left
timo is what jnthn just committed to rakudo about nativecall? 17:09
ah, no it's about the other exaple from earlier today
nine It's about why Inline::Perl5 is now twice as slow 17:10
timo i meant mixing CALL-ME into a proto
nine Ah, sorry, misread your sentence. Sounds like that, yes 17:11
jnthnwrthngtn What I just committed fixes a reported regression 17:16
17:23 patrickb left 17:34 Altai-man left
jnthnwrthngtn Time to go home, rest, etc. 17:34
18:03 reportable6 left 18:10 linkable6 joined
lizmat ... 18:57
19:04 reportable6 joined
jnthnwrthngtn Goodness, that was a filling dinner... 20:42
nine: I've been pondering what NativeCall might look like if really done to take advantage of new-disp. My rough idea: 20:47
1. Add a new dispatch terminal (along with value, constant, invoke bytecode, etc.) which is to invoke an FFI function.
2. Can add guards, decont Scalar containers, and add unboxings if needed as part of the dispatch program, so there's not much conversion work left in the final thing.
3. It specializes into guards and an op like `sp_nativecall`, which is what it then used on platforms where we can to JIT the native call.
Note that this means that the location we make a native call can end up, in the JIT case, with the C call itself emitted, so we're not even dependent on inlining of anything, nor any QAST generation, etc.
MasterDuke so i'm not terribly surprised, since that one was trickier, but reverting the jitting of scsetobj in github.com/MoarVM/MoarVM/pull/1552 got it farther. now nqp build but there's an error building rakudo i've never seen before 20:53
`NMAKE : fatal error U1077: 'C:\Strawberry\perl\bin\perl.exe' : return code '0xff` 21:03
i guess this means (at least) two of the ops are incorrect. ugh, another round of reverting to find out which one... 21:04
timo well that's super odd 21:41
we use perl for the exprjit compiler don't we? is that the part that asplode?
does nmake output more info? maybe with --no-silent-build? 21:42
MasterDuke it's somewhere in stage parse, since stage start finished 22:06
timo ah, that's the "run_early_build_rakudo.pl" or whatever it's called 22:09
and it quite possibly just forwards the exit status from the moarvm process itself
MasterDuke i'm not really regretting now making a PR right away and just adding each new commit to it 22:16
*now really
*not making
[Coke] can roll things back and do a PR, no? 22:18
MasterDuke eh, i'm kind of in the middle now 22:19
[Coke] fair enough 22:27