00:39 Geth joined 01:53 yoleaux joined 02:58 ilbot3 joined 03:00 squashable6 joined 03:05 AlexDaniel joined 03:39 Voldenet joined 03:57 bloatable6 joined 03:58 unicodable6 joined 04:56 JimmyZ joined 05:50 committable6 joined, statisfiable6 joined 07:04 sivoais joined 09:04 domidumont joined 09:10 domidumont joined 10:03 yoleaux joined 10:25 lucasb joined
lucasb Hello good people 10:26
In github.com/MoarVM/MoarVM/blob/mast...#L548-L551
I guess the correct way to call a sub ref in P5 is $OS_OPENBSD{cc}->() and $OS_FREEBSD{cc}->() 10:27
nine lucasb: Hi! $OS_OPENBSD{cc}() works, too, same as $h{a}{s}{h} 10:32
lucasb nine: oh, you're right. I thought that was the problem :) 10:34
I forgot about the implicit arrow between brackets 10:35
I dunno why the coderef got dumped in "Failing command: CODE(0x802884d08) -o try.o -c try.c 2>&1 " 10:37
In RT #132741
synopsebot RT#132741 [new]: rt.perl.org/Ticket/Display.html?id=132741 [BUILD] Broken on FreeBSD and OpenBSD
10:40 yoleaux joined 11:31 leont joined 11:48 releasable6 joined 12:15 AlexDaniel joined 12:36 greppable6 joined, benchable6 joined, coverable6 joined, reportable6 joined 12:45 yoleaux joined 13:05 AlexDaniel joined 14:14 bisectable6 joined 14:23 nwc10 joined 16:02 domidumont joined
nine How can a basic block that only consists of a "set r17(17), r23(16)" (without any annotations) have 2 successors? 16:25
16:36 yoleaux joined
lizmat that feels wrong, but I'm a noob there :-) 16:36
jnthn nine: Inept CFG manipulation...somewhere :) 16:38
Oh, actually 16:39
It coulda ended in decont
That was rewritten to a set
If it was also inside of a control exception region, then the extra succ is to the control exception handler
Which is not possible to reach after turning it into a set, of course
nine So we should go through the BB after doing such optimizations to recalculate succ? 16:45
jnthn I think we need in graph.c to record which succes we add as control exception flows 16:47
*succs
And then, on opts that devirtualize decont and other such invokish opts, kick out those succs afterwards
(There's a function in manipulate.c to call to remove a successor, and it cleans up the preds of the target too) 16:48
nine But we'd still need to check other instructions in the BB after devirtualizing an instruction to know if we can remove the succ. 16:50
jnthn How so?
An invokish instruction is a BB terminator
nine Oh, so there's only one of them in a BB
jnthn Yeah :) 16:51
And it will be the final instruction of the BB
nine Can there be more than one additional succ for such an invokish?
jnthn github.com/MoarVM/MoarVM/blob/mast...aph.c#L339 fwiw
I can't think of such a case 16:52
nine Then recording is just setting a simple extra field in MVMSpeshBB
jnthn Which I guess means we could get away with not keeping a list of BBs added as control edges and assuming everything except linear_next is one 16:53
But I'm...hesitant to make such an assumption.
17:04 zakharyas joined 17:29 zakharyas joined
nine Still a mystery why a basic block consisting only of "unless_i r21(7), BB(39)" can have 3 successors. And that's _before_ specialization. 18:11
Is that just due to active handlers even when the instruction cannot throw? 18:12
18:20 zakharyas joined 18:21 zakharyas joined 18:33 zakharyas joined 18:41 nativecallable6 joined
jnthn nine: Yes, I think all BBs within the scope of a control handler (not a catch one) are linked to the control handler 19:02
nine: Which is conservative :)
nine Oddly though, only adding that succ if the last instruction in the BB is marked as throwish breaks things badly 19:04
jnthn Yes, that won't suffice, at the very least because invoke_* and friends aren't marked invokish because they're actually, well, invokes :) 19:07
Note it has to be throwish and invokish and invoke at least, because invokes can invoke something that throws 19:08
19:34 Ven`` joined 19:36 quotable6 joined 19:46 yoleaux joined 19:50 yoleaux joined
nine Yep, including invokishs and invoke* makes it work 20:11
timotimo i wasn't even aware we have an invoke flag, apart from invokish 20:15
nine We don't. I compare the opcode.
timotimo oops :) 20:18
i'm no better :D
nine Ok, we may have multiple succs through multiple active handlers. So a single field will not do. 20:23
timotimo do we have the luxury of the succs themselves having only one pred?
nine I dare say that's unrealistic for a typical handler BB 20:24
timotimo oh, right, handlers
yes, indeed
oh, but wouldn't handlers have the same kind of incoming connection anyway? 20:25
from all their preds?
well, except from the initial bb i guess? 20:27
it's probably best to introduce a new field, though
nine What I need is to find out which succ is pointing at a handler, so I can remove it from the list.
timotimo yeah 20:28
jnthn nine: Yes, I was expecting you'd need a control succ list, not just one field :)
nine jnthn: that was the point of my question about more than one additional succ for an invokish. 20:29
timotimo fortunately we have the manipulation functions that can handle changing succs and their info at the same time
20:30 yoleaux joined
jnthn shop & 20:30
timotimo get to da shoppa~ 20:31
nine Would it be fair to say that a handler BB will only ever be entered through a throw? 20:39
I.e. couldn't we just add an "is_handler" flag to BBs?
timotimo that's what i meant when i said "wouldn't handlers have the same kind of incoming connection anyway" 20:44
20:51 evalable6 joined 20:54 MasterDuke joined
MasterDuke is there some (hopefully prioritized) list of JIT templates needed for the new JIT? 20:55
jnthn nine: No; last handlers jump to a point after the loop, next handlers to a point near the start/check, etc. 21:01
This is why we can optimize some of them into goto instructions
timotimo MasterDuke: i'd just run stuff and see where it says it can't do, then check out what would be next 21:03
like, if adding a single template would only give us a single more instruction, then whatever 21:04
21:04 yoleaux joined
jnthn Put another way, control exceptions often don't actually have a distinct handler 21:04
They just transfer control flow
timotimo but if one single template would let us fully template up a whole block, then cool. 21:05
on the other hand, templates that are basically just a C function call, they don't give us much room for improvement 21:06
yo MasterDuke, i gots a perl6 script that turns graph.c into a whole bunch of templates, but i think it might have bitrotted; something about the template format changing for example? i haven't actually checked, just assuming 21:07
nine This is odd. I have a spesh log that tells me that deconts got turned into sp_p6oget_o. The only place in the code base I could find for that is src/6model/reprs/P6opaque.c:1429 Yet a debug print right there never triggers for this function 21:08
timotimo nine: look at rakudo's ops 21:10
in src/vm/moar/ there's a c file that'll interest you
nine timotimo: oh thank you! I would have never found that 21:12
timotimo :)
nine Very nice! We now get nativecast from 20 down to just 4 basic blocks 21:16
timotimo oh yeah!
nine Actually....this work could even make our performance worse in the short term as the expression JIT will bail out of large BBs instead of the small ones when it may be able to compile other parts 21:20
timotimo ugh, true 21:26
Geth MoarVM/inline_in_place: c60ebd7a4a | (Stefan Seifert)++ | 6 files
Clean up handler successors after throwish ops become non-throwing
nine All the more reason to work on those templates :)
timotimo aye 21:27
we don't really have a good way to communicate stuff between jit and spesh 21:29
but we could in theory have an annotation that allows the expression jit to either just continue or restart 21:30
so like a bb border, but softer
so what was once a bb boundary would just have an annotation in the middle where the expression jit would be safe to start again, but doesn't need to stop 21:33
MasterDuke timotimo: is that script somewhere on github? 21:41
timotimo hm, i didn't put it up in the moarvm repo? :\
it's tools/parse_jitgraph.p6
337 LoC, more than i remembered
MasterDuke cool, i'll take a look 21:42
nine What could be wrong with my template for getcode? (template: getcode (idx (^getf (cu) MVMCompUnit body.coderefs) $1 ptr_sz)) 21:52
timotimo are there other templates for things that take a coderef? 21:56
nine Ah, this is the correct version: (template: getcode (load (idx (^getf (cu) MVMCompUnit body.coderefs) $1 ptr_sz) ptr_sz)) 21:58
Maybe idx just computes the address and load is needed to actually dereference it 21:59
timotimo ah, probably 22:00
nine Indeed, it's even documented :) =IDX= | =(idx reg reg $scale)= | =reg= | Compute a pointer for an index in an array 22:01
22:05 ilmari joined
nine And takeclosure seems to be: (template: takeclosure (call (^func MVM_frame_takeclosure) (arglist (carg (tc) ptr) (carg $1 ptr)) ptr_sz)) 22:08
This is actually rather simple :)
And really seems to help performance 22:09
22:09 AlexDaniel` joined
jnthn \o/ 22:10
samcv what does idx stand for?
nine index into an array 22:11
is how I read it
samcv is there a place where these are written down? 22:14
nine samcv: docs/jit/overview.org:138 22:16
samcv thanks 22:20
22:22 squashable6 joined, unicodable6 joined, committable6 joined, bloatable6 joined 22:59 SmokeMachine joined 23:11 geekosaur joined 23:20 lizmat joined