|
01:02
colomon joined
02:15
zakharyas joined
02:31
tokuhiro_ joined
05:25
sivoais joined
05:33
Ven joined
05:35
sivoais joined
05:45
sivoais joined
06:14
FROGGS[mobile] joined
06:25
aiacob joined
06:36
FROGGS joined
06:42
cognominal joined
06:50
Ven joined
07:17
Ven joined
07:22
Ven joined
07:46
brrt joined
07:50
Ven joined
08:22
Ven joined
08:36
Ven joined
08:51
Ven joined
|
|||
| jnthn | Gee, the inline/JIT bug *is* really strange. | 09:46 | |
| It can't be that it mis-inlines the multi candidate for new because, well, for one that code isn't hot, but for two you can see it actually has the proto on the call stack | 09:47 | ||
| brrt | the proto? | 09:49 | |
| hmmm | |||
| jnthn | proto method new | 09:50 | |
| brrt | aha | ||
| jnthn | Well, just ruling out things | ||
| A mis-compile under JIT is, like, also hard to argue | |||
| brrt | it's nearly impossible | ||
| jnthn | Simply because the code is in a pre-comp'd module | ||
| brrt | i've compiled panda to mast with and without JIT, and save for identifiers (which you can s/[\d_]+//g away), there is no difference whatever | 09:51 | |
| jnthn | Well, but there's the thing | ||
| If I have a panda built | |||
| brrt | i'm listening | ||
| jnthn | And I run "panda install Grammar::Debugger" | ||
| Then App::Panda is pre-compiled | |||
| And things do work with JIT or inline off | 09:52 | ||
| But we're running the same compiled App::Panda either way | |||
| So it can't be anything wrong with the compilation of the callsite | |||
| brrt | agreed | 09:53 | |
| seems like a desparately unlikely bug at any rate | 09:54 | ||
| do you agree the interaction between JIT and inlines is pretty small | |||
| jnthn | yes | ||
| OK, if I --profile panda install Grammar::Debugger, it's kinda interesting | 09:55 | ||
| I can tell, for example, that we don't pull a result out of the multi dispatch cache at all | 09:59 | ||
| Because we do enter the multi-dispatcher | 10:01 | ||
|
10:01
Ven joined
|
|||
| jnthn | Now, it's *possible* that we do some inlining of some sort inside the multi-dispatcher itself that causes the mis-compile | 10:01 | |
| But none of this explains why the "return" affects things | |||
| brrt | ahah... | ||
| well, return is an exception innit | 10:02 | ||
| brrt goes to lunch & | |||
| jnthn | yeah but in the crash case we never make it as far as the return | ||
| brrt | that is kind of true | ||
| brrt has vanishingly little knowledge of dispatcher inner workings | |||
| see you in a bit over an hour :-) | 10:03 | ||
| jnthn | I can clearly see from the profiler that the multi-dispatcher is one huge call frame that only calls one thing (add_to_cache) and is not JITted in any way and there's nothing to inline | 10:07 | |
| Add to cache is spesh'd but also a terminal frame | |||
|
10:47
FROGGS_ joined
|
|||
| jnthn has tried various things as is now down to binary searching his way to the frame whose inlining busts things | 10:49 | ||
|
11:01
aiacob joined
11:11
brrt joined
|
|||
| brrt | jnthn++. i wonder how you do such a binary search? | 11:12 | |
| that's much less crude than my exhaustive search methods | |||
| jnthn | brrt: Just keep a static int in inline.c :) | 11:13 | |
| So far | |||
| // 475 good, 481 bad | |||
| // 476 good, 478 bad | 11:16 | ||
| OK, if we refuse to inline the 478th frame that we're asked to do so, things work :) | 11:20 | ||
| brrt | oh, wow | 11:22 | |
| well, which frame is that | |||
| and which frame is the inliner | |||
| jnthn | Just been confirming either side of that have no influence; they don't | 11:28 | |
| Guilty: inlining EXPR (cuid_577_1443021743.859) into arglist (cuid_494_1443021743.859) | |||
| brrt | aha | 11:30 | |
| can we haz look at which those are | |||
| reduntdant jnthn++ :-) | 11:31 | ||
| jnthn | Yeah, am looking at le spesh log at the moment | 11:35 | |
| I see we have 3 inlines in the bad/crashing case, and 2 in the good case where I stop it doing the one that causes issues | |||
| brrt | uhuh | ||
| jnthn | And it's the first of the inlines | 11:36 | |
|
11:38
Ven joined
|
|||
| jnthn | Well, wow | 11:39 | |
| Here is the EXPR method that we inline | |||
| method EXPR(str $preclim = '') { | |||
| # Override this so we can set $*LEFTSIGIL. | |||
| my $*LEFTSIGIL := ''; | |||
| my $*IN_RETURN := 0; | |||
| nqp::findmethod(HLL::Grammar, 'EXPR')(self, $preclim, :noinfix($preclim eq 'y=')); | |||
| } | |||
| Note the $*IN_RETURN | |||
| This prevents promotion of colonpairs to nameds | |||
| And failing to clear it would thus cause problems | 11:40 | ||
| The next question is: how does dynamic variable lookup with inlined frames intersect with JIT? | |||
| brrt | aha | ||
| good... question | |||
| dynamic variable lookup, i suspect, is handled by.. getdynlex? | 11:41 | ||
| jnthn | I suspect MVM_frame_find_contextual_by_name is where to look | ||
| brrt | :-) | ||
| jnthn | Yeah, the ops for doing it converge on that function I noted | ||
| It's not simply that it is unaware of JITtedness though | |||
| if (cand && cand->num_inlines) { | |||
| if (cand->jitcode) { | |||
| brrt | oh, lord, did i touch that code | 11:42 | |
| brrt apologizes for that code | |||
| jnthn | It's not worse than the non-JIT case though | 11:43 | |
| I mean, in theory it's doing an extent list search | |||
| brrt | uhuh | ||
| two possiblities; a) the jit return label isn't set correctly | 11:46 | ||
| b): the inlines table isn't built correctly | |||
| jnthn | It's odd how hard it is to reproduce | 11:51 | |
| oh wait | |||
| lizmat | .oO( the tension is building ) |
11:52 | |
| jnthn | I still didn't manage a small reproduction of it. | 11:58 | |
| m: class C::C { }; EVAL 'sub foo() { return C::C.new(a => 1, b => 2) }; foo()' for ^100 | 12:03 | ||
| camelia | ( no output ) | ||
| jnthn | m: class C::C { }; EVAL 'sub foo() { return C::C.new(a => 1, b => 2) }; foo()' for ^500 | ||
| camelia | rakudo-moar f89dc2: OUTPUTĀ«Default constructor for 'C::C' only takes named arguments⤠in sub foo at EVAL_104:1⤠in block <unit> at EVAL_104:1⤠in block <unit> at /tmp/C2xdzB3Egh:1ā¤ā¤Ā» | ||
| jnthn | There you go | 12:04 | |
| brrt | oh wow | 12:07 | |
| brrt is going to add just that test to the jit-test-repo | |||
| jnthn | Think it's lunch time here :) | 12:08 | |
| brrt | well deserved too :-) | ||
| jnthn | brrt: Dunno if you want to explore this from here? I can dig back in again if not. | ||
| brrt | i want to explore, but i can't guarantee timeliness in that regard :-) | 12:09 | |
| brrt wonders why the EVAL is necessary? | 12:10 | ||
| jnthn | brrt: Because we need to get the *compiler* hot | ||
| It *is* a mis-compile after all | 12:11 | ||
| brrt | aha.... | ||
| jnthn | I forgot panda no longer does pre-comp. | ||
| brrt | aw, that hurts | ||
| cognominal | what is pre-comp? | 12:39 | |
| [Coke] | pre-compilation. | 12:40 | |
| taking a .pm file and compiling it to bytecode, then running the bytecode later instead of the .pm | |||
| cognominal | Makes sense. So why panda does not do it? | 12:42 | |
| [Coke] | because perl6 should be doing it. | ||
| and no one was making perl6 do it because panda was doing it. (panda can only do it in very limited cases, whereas perl6 could do it as a matter of course) | 12:43 | ||
| cognominal | ok | ||
| thx | |||
| brrt | jnthn: github.com/bdw/jit-test fwiw :-) | 12:45 | |
| seems very sensitive to adding 'say's before and after | |||
| as in | |||
| crashes quite differently in other cases | |||
| jnthn back | 12:51 | ||
| brrt | \o | 12:52 | |
| i haven't gotten arround to debugging it, by the way | 12:58 | ||
| jnthn | np | ||
| I'll leave it for somebody else to debug the JIT labels for now, and look again tomorrow if nobody figures it | 12:59 | ||
| brrt | very well :-) we have at least a reliable testcase | 13:00 | |
|
13:01
Ven joined
13:36
Ven joined
13:43
FROGGS joined
13:55
TimToady joined
14:17
Ven joined
14:34
Ven joined
14:43
tokuhiro_ joined
|
|||
| hoelzro | o/ #moarvm | 15:02 | |
|
15:44
tokuhiro_ joined
15:53
Ven joined
|
|||
| hoelzro | if the program break of a program running on MVM is steadly increasing over time, there's probably a memory leak, right? | 16:28 | |
| I think I found a memory leak when calling a sub that uses subsignatures, but I want to confirm my suspicions here before blowing smoke | 16:30 | ||
|
17:20
cognominal joined
17:23
Peter_R joined
17:46
tokuhiro_ joined
18:03
FROGGS joined
18:21
tokuhiro_ joined
18:22
vendethiel joined
|
|||
| masak | hoelzro: sounds likely, yes. | 18:34 | |
| hoelzro | alright, this should be a fun RT to write then =) | 18:39 | |
| jnthn | valgrind's memcheck may help pint out what's leaking | 18:58 | |
| uh, point | |||
| lizmat | cheers! | 18:59 | |
| FROGGS | skol! | ||
| jnthn | :D | ||
| hoelzro | jnthn: I looked at memcheck last night; it gave me a lot of hits, though | 19:07 | |
| jnthn | Yeah. You can maybe get a few less by running Moar and asking it to try and clean up | ||
| I forget the name of the flag. | |||
| hoelzro | and the weird thing was that I have two versions of the program, one with and one without the supposed leak | ||
| ahhh | |||
| I'll try that | |||
| I suspect the binder, but that's more a hunch | 19:08 | ||
|
19:51
lizmat_ joined
20:04
lizmat_ joined
20:22
tokuhiro_ joined
21:24
TimToady joined
22:24
tokuhiro_ joined
23:25
tokuhiro_ joined
|
|||