00:03
MasterDuke joined
00:41
lizmat joined
01:48
ilbot3 joined
03:32
brrt joined
05:56
brrt joined
06:07
domidumont joined
|
|||
brrt | … i know what is my bug | 06:11 | |
*finally& | |||
also | 06:12 | ||
lol | |||
hands up for anybody who is interested | |||
06:13
domidumont joined
|
|||
Geth | MoarVM/even-moar-jit: 9e7bd1bb9f | (Bart Wiegmans)++ | src/jit/expr.c Destructive templates invalidate their result Otherwise you can have nasty situations in which a subsequent node refers to the old version of a value with all the ensuing hilarity. |
06:21 | |
brrt | this gives us almost, but not quite, sp_fastcreate | ||
nine | .tell brrt o/ | 06:35 | |
yoleaux | nine: I'll pass your message to brrt. | ||
nwc10 | .tell brrt yes I am interested. Was AFK on an emergency toothbrush delivery mission | ||
yoleaux | nwc10: I'll pass your message to brrt. | ||
06:41
brrt joined
|
|||
nine | Good morning, brrt! | 06:41 | |
brrt | good morning nine | 06:42 | |
yoleaux | 06:35Z <nine> brrt: o/ | ||
06:35Z <nwc10> brrt: yes I am interested. Was AFK on an emergency toothbrush delivery mission | |||
brrt | :-D | ||
okay, the commit log mostly explains it i think? what happened was that we were compiling a rather long frame, and there would appear a 'destructive' template | |||
so 'normal' templates directly yield a value (for the expression compiler to do as it sees fit) | 06:43 | ||
'destructive' templates return a result, but write it directly to local memory | |||
so they don't yield a value | |||
so, i implemented that way back in the past | 06:44 | ||
but i had forgotten that it might happen that there'd be an earlier version of that same variable already defined | |||
so that code would create a new object and then assign it as an attribute, but, because creation is destructive, it would not overwrite the old 'definition' of the value in the lookup table | 06:45 | ||
so rather than v3 of local(12) it'd write v2 of local(12), which wasn't the same type of object at all | 06:46 | ||
there is another bug uncovered with this, but it happens much later in compilation, so i'll have to figure out why it happens | 06:47 | ||
nine | Is "computed" this lookup table? | 06:48 | |
brrt | yes | ||
it is a part of expression tree building | |||
whenever we load a value from memory or have it as result, we stash that node and map it to the local MoarVM variable number | 06:49 | ||
so that we don't have to issue the same load twice | 06:50 | ||
07:12
lizmat joined
07:43
domidumont joined
|
|||
brrt | okay, the register allocator has clearly gone mad in the frame i'm looking at | 08:12 | |
spilling stuff it shouldn't | 08:13 | ||
08:29
robertle joined
|
|||
lizmat | .oO( frame abuse ) |
08:32 | |
jnthn | .oO( You've been framed ) |
08:58 | |
yoleaux | 6 Jun 2017 22:47Z <eveo> jnthn: would you be able to resolve this ticket? The question is is it guaranteed `run` will never use the shell to execute stuff. github.com/perl6/doc/issues/1208#i...-281522376 | ||
09:39
AlexDaniel joined
09:41
sivoais joined
|
|||
brrt | so the proximal cause is that my newly-created value is overwritten, which is weird for sure, uhuh | 10:02 | |
oh, wait a minute | |||
timotimo | we waited almost half an hour! :P | 10:24 | |
brrt | hmmm | 10:30 | |
i feel like there could be an interaction between 'full' and 'point' spills | 10:31 | ||
but this is a case of register allocator gone mad anyway | |||
yeah, this is interaction between full and point spills alright | 11:07 | ||
the tl;dr | 11:08 | ||
i may need to spill-to-allocate a register for the CALL result | |||
if that happens, the point restore which is placed *after* the CALL will overwrite the newly allocated value, because at the point the point spill was issued, it wasn't yet overwritten | 11:28 | ||
11:30
domidumont joined
|
|||
brrt | so it's an ordering issue again | 11:31 | |
hmmm | 11:37 | ||
12:24
domidumont1 joined
12:41
zakharyas joined
12:54
geekosaur joined
13:37
brrt joined
|
|||
brrt mumbles something about people arguing markdown is more readable than POD | 13:37 | ||
eveo | 'cause obviously it is. | 13:39 | |
:) | |||
brrt | srsly though | ||
markdown has no formal specification, isn't strictly speaking 'parseable', and has a gazillion dialect | 13:40 | ||
s | |||
how is that… better, in any reasonable sense | |||
i ???? for engineering | 13:41 | ||
eveo | I am serious. L«C<some code>|/foo/bar» vs [`some code`](/foo/bar). B<SHOUT> vs **SHOUT** | ||
Markdown is way easier to type too | |||
brrt | that is nothing but convention and familiarity, and you know it | ||
what is harder or easier about the one or the other | 13:42 | ||
they use approximately as many punctuation characters | |||
eveo | No, it's all about typing angular brakets, without the help of things like Emmet that lets you avoid doing that with HTML | ||
brrt | .. typing angular brackets is horrible, typing stars and square brackets is not? | ||
eveo | Nope | ||
At least not for me. | 13:43 | ||
brrt | well, fine. but i posit that you have no better reasons for that, than convention and familiarity | ||
eveo | "that" being what? That's is physically easier to type `` than C<> ? | ||
robertle | I wonder whether some language preferenfces may have something to do with the keyboard layout in question ;) | ||
nine | eveo: with German keyboard layout C<> is actually much nicer to type | 13:44 | |
brrt | well, in a US style keyboard, 10-finger-typing, I can't say it makes a difference to me | ||
robertle | which is also why lisp is so out of fashion, the round brackets are just way too far away from the home row on most keyboards | ||
eveo | I use 6 finger typing | ||
brrt | robertle: ???? | ||
well, there you go | 13:45 | ||
you type one way, i type another. there is no 'objectivity' about the easiness in typing there | |||
nine | eveo: POD is also a bit more self documenting. B<SHOUT> is easy to remember and recognize as something being bold. But why is it **SHOUT** and not just *SHOUT* like we used for the past 40 years? | ||
eveo | "C" = left pinkie + left index; "<" = right ring finger + right thumb<; ">" = same | ||
brrt | well, for me, < is right-middle-finger + left pink | 13:46 | |
eveo | nine: why is it B<> and not ** that we used for the past 40 years? | ||
brrt | * is… exactly the same, just a bit further to reach | ||
lol | |||
eveo | Hell. Markdown renders on GitHub. Pod6 doesn't, even after we asked them to add it. | 13:47 | |
brrt | anyway, one of the counterarguments is that the overloading of * to mean strong and italic at the same time | ||
eveo | Your argument about readability ends right there, I'd say. | ||
eveo goes to do productive stuff. | |||
nine | eveo: sorry, but no *bold*, /italic/, _underline_. I have no idea why we suddenly have to double the markers. | ||
brrt | nine: that's org-mode syntax, that's not going to work with markdown unfortuantely | ||
**bold**, *italic*, _underline_ <- i'm not sure that even works | 13:48 | ||
nine | My irssi even underlines the "underline" there ;) | ||
brrt | hehe | ||
anyway, yeah, it's bikeshedding. but the 'obviousness' of it all surprised me | 13:49 | ||
don't worry. you can type markdown all you like | |||
it's just that you're wrong :-P | |||
eveo | Right back at ya. Enjoy your syntax errors and no fully-functional renderer in exitence. | 13:51 | |
robertle | it would be cool though if github would render pod6... | ||
nine | Nothing like a good markup language flamewar to end a work day :) | 13:52 | |
brrt | well, i was talking about pod as in both categories at the same time | ||
brrt nods | |||
good for the soul | 13:53 | ||
so one of the possible solutions for the point/full-spill interaction is to…. add another layer of indirection | 13:58 | ||
i don't much like that though | |||
14:38
domidumont joined
14:54
domidumont joined
15:10
brrt joined
15:11
ggoebel joined
15:27
domidumont joined
|
|||
Geth | MoarVM/even-moar-jit: 266b60f606 | (Bart Wiegmans)++ | 2 files Describe point/full spill conflict This conflict causes failures during NQP build when sp_fastcreate is enabled. A point spill will ignore the full spill and potentially overwrite the value that it was spilled for. |
15:56 | |
brrt | this is one of those core assumptions gone bad deals... | 15:58 | |
but, i'll figure something out :-) | |||
lizmat | devirt: repr op getattrs_o couldn't be devirtualized: type unknown # found in MVM_JIT_LOG, should we be worried ? | 16:09 | |
jnthn | No | 16:10 | |
It just means an optimization it sometimes has the info to do can't be done in this case | 16:11 | ||
Could be for many reasons, including the code being a cold branch in a hot routine so we never gathered data on what types show up | |||
lizmat | could this trigger it showing up as not-JITted in --profile ? | 16:13 | |
because the log states this particular method *did* get JITted | |||
ah, or it could mean it got deoptimized | 16:14 | ||
so it looks like this particular case after 256 times it got optimized, then deoptimized and then next iteration optimized again, and deoptimized again, etc. for the next 4744 times | 16:15 | ||
Of 1002426 specialized or JIT-compiled frames, there were 4744 deoptimizations (that's 0.47% of all optimized frames). | 16:16 | ||
jnthn: is that expected behaviour? that it JITs something again and again, and deoptimizes again and again ? | |||
jnthn | That's not really what happens | ||
Or at least, I highly doubt it | 16:17 | ||
It may run the JITted code and fall out of it | |||
Many times | |||
But that isn't producing fresh JIT code every time | |||
The same frame may be JITted more than once; there's a limit on the number of specializations of something like 4 or 8, though | 16:18 | ||
lizmat | but if it falls out of the Jitted code, it would need to run the deopted code again, no? | ||
so it *is* potentially unnecessary overhead ? | |||
jnthn | Potentially we come out worse at times | ||
It's hard to say in general though | |||
I mean, if you run JITted | |||
And then after it does some owrk hit a depot | 16:19 | ||
Then you can still find that the savings of being in the specialized/JITted code exceed the cost of the deopt later | |||
But yes, at present we hedge on deopt being rare | |||
And don't have a strategy for backing out common deopts | |||
In a perfect world we'd perhaps re-specialize but not making the assumption that triggers the deopt | 16:20 | ||
lizmat | is there a way to figure out what causes the deopt ? | ||
jnthn | I think if you compile a MoarVM with deopt debug logging turned on, then look at the spesh logs, it is possible to correlate the two | 16:21 | |
Well, I know it is 'cus that's how I've done it in the past | |||
But it involves reading bytecode and understanding what the deopt is against and then reading ahead to work out what optimized code is being guarded by that deopt | 16:22 | ||
And then trying to map that back up to what Perl 6 code was originally compiled into that bytecode :) | |||
lizmat | feels like something that could be optimized ? | 16:23 | |
jnthn | In what sense? | ||
lizmat | s/optimized/automated/ | ||
jnthn | Ah | ||
Well, ideally at some point we'd be able to incldue it in the profile output too | |||
We can probably go so far as saying a line number, an expected type, and an actual type | |||
lizmat | that would be cool :-) | 16:25 | |
jnthn | As usual, it's all about the tuits :) | ||
lizmat | yeah :-( | 16:26 | |
jnthn | Though can't complain, I've had plenty of Perl 6 tuits of late. That's why I/O guts have had a bunch of work :) | ||
Tomorrow I'll continue on with the Proc stuff | 16:28 | ||
I guess next job is Proc::Async on JVM | |||
And then re-implementing Proc using Proc::Async | |||
And then killing off yet more code | |||
We might soon get to the point where we no longer need to build up a libuv event loop per thread | 16:29 | ||
And can just have the one running for async I/O, timers, etc. | |||
lizmat | sounds like a big improvement :-) | 16:30 | |
jnthn | Well, guess it has to save us something :) | ||
jnthn wanders home | 16:33 | ||
Will hopefully get my blog post finished this evening. :) | |||
16:46
robertle joined
17:41
lizmat joined
17:44
zakharyas joined
19:49
patrickz joined
20:24
praisethemoon joined
20:30
brrt joined
|
|||
brrt | .tell lizmat that particular error doesn't have anything to do with deoptimization; deoptimization is currently especially costly in case we do inlining (because we have to reconstruct the frames that would-have-been) | 20:34 | |
yoleaux | brrt: I'll pass your message to lizmat. | ||
brrt | in case we'd do trace compilation, that tradeoff gets amplified | 20:36 | |
lizmat | ack | 20:37 | |
yoleaux | 20:34Z <brrt> lizmat: that particular error doesn't have anything to do with deoptimization; deoptimization is currently especially costly in case we do inlining (because we have to reconstruct the frames that would-have-been) | ||
brrt | i'm pondering killing off point spilling as a strategy | 20:39 | |
it's basically never legal to point-spill something that is then later respilled | 20:43 | ||
so, how to avoid it, other than not doing at all | 20:44 | ||
and what is the complexity of replacing it with a full spill | |||
jnthn | Well, yeah, the more you speculate, the bigger the potential losses. :) | 20:51 | |
brrt | jnthn: have plans to go to the new yapc::eu / TPC::EU? | 21:14 | |
21:24
tbrowder_ joined
21:29
leego_ joined
21:39
ggoebel joined
|
|||
timotimo | jnthn, would you put these deopt detail nodes (i.e. line number and/or bytecode index and expected vs received) into the call graph nodes themselves, too? that could give us a rather big amount of data all in all, depending on how the deopting functions are spread out across the program | 21:41 | |
samcv | i'm going to add some more ops | 22:02 | |
timotimo | "ops i did it again" | 22:03 | |
samcv | for ignorecase + ignaremark | ||
for index and for eqat | |||
equaticim_s i suppose and indexicim_s | |||
will make me very happy. so i can solve that RT about totally broken ignorecase+ignoremark and also make the code for it in nqp a lot less... horrible | 22:04 | ||
lizmat | samcv++ | 22:06 | |
samcv | :-) | ||
lizmat | but how will that affect the JVM ? | ||
samcv | no effect | ||
JVM doesn't have NFG anyway. so i think it can't do it? | |||
jnthn | I think these are only spat out by the regex compiler? | ||
samcv | ^ | ||
that too | |||
jnthn | And that code is per-VM | 22:07 | |
samcv | there's a eqatim_s currently which i *can* def make better. but i'll work on making things that don't work at all work before improving the working things | 22:08 | |
\o/ yay works. | 22:16 | ||
just gotta polish this up | |||
22:41
geekosaur joined
22:55
TimToady joined
|
|||
jnthn | Phew, finally got my blog post finished. 6guts.wordpress.com/2017/06/08/sor...ronous-io/ :) | 23:02 | |
timotimo: I think I might record them separately from the call graph | |||
timotimo: Probably just (file, line, expected) as the key and a list of got as the value | 23:03 | ||
Hm, though | |||
Maybe line isn't specific enough and will be misleading | |||
timotimo | don't we want to differentiate different spesh candidates? | ||
jnthn | Not really | ||
timotimo | also, yeah, inlines will give you jumpy line numbers, too | ||
jnthn | Yeah, though we need to fix that more generally anyway :) | ||
timotimo | what's there to fix? it's in the nature of the thing | 23:04 | |
jnthn | We can emit a new annotations segment when we emit the bytecode, I guess :) | 23:05 | |
timotimo | i'm not sure what the end result would look like | 23:07 | |
would we give the line number of the callsite and in the extra segment we'd put the line numbers belonging to the inside of the inlined thing? | |||
jnthn | oh, you're talking about reconstructing the call stack, I was just thinking of having a file/line rather than a sub name :) | 23:09 | |
To do that you'd need to use the inlines table of the spesh candidate | 23:10 | ||
timotimo | i didn't realize we didn't just copy the annotations over while inlining | 23:16 | |
jnthn | 'night, #moarvm | 23:18 | |
timotimo | gnite jnthn :) | 23:19 | |
samcv | nite | 23:43 | |
timotimo | i'll go to sleep now, too | 23:46 |