00:18
lizmat joined
01:01
vendethiel joined
01:48
ilbot3 joined
01:57
vendethiel joined
06:42
domidumont joined
07:34
zakharyas joined
09:42
brrt joined
09:59
zakharyas joined
|
|||
dalek | arVM/line_based_coverage_3: 83468b5 | (Daniel Green)++ | tools/parse_coverage_report.p6: Break out percentage into its own column and add some JS+CSS to sort the table |
11:03 | |
arVM/line_based_coverage_3: 641b736 | (Daniel Green)++ | tools/parse_coverage_report.p6: Switch to the non-minified JS |
|||
arVM/line_based_coverage_3: c5b9ae3 | lizmat++ | tools/parse_coverage_report.p6: Merge pull request #381 from MasterDuke17/line_based_coverage_3 Give percentage its own column and add some JS+CSS to make the table sortable |
|||
11:32
brrt joined
|
|||
brrt | good * #moarvm | 11:33 | |
one more question, and then i'm done | |||
how long do the live range objects themselves need to live? | 11:34 | ||
a): for the whole of the allocation scheme | |||
b): just as long as my cursor is within their range | |||
i.e. after spilling a live range, do i need to keep the descriptor arround | 11:35 | ||
if i do a): then splitting the register allocation from register assignment is somewhat simpler | 11:36 | ||
however, that may not really be a worthwhile goal anyway, because precoloring (assigning values to the place they are needed) needs to be coupled to register assignment anyway | 11:37 | ||
12:02
vendethiel joined
13:06
brrt joined
|
|||
timotimo | brrt: i wish i knew the/an answer | 13:45 | |
brrt | well, no reason to despair :-) | 14:08 | |
the safe answer is just to keep them arround | 14:09 | ||
timotimo | i'd like to take a few more baby steps toward building the deopt bridges | ||
brrt | luajit, of course, only generates them on demand | 14:14 | |
timotimo | you mean the bridges? | 14:20 | |
brrt | well, they call them side traces | 14:22 | |
but yes | |||
anyway, what's keeping you from starting with a few baby steps :-0 | |||
:-) | |||
timotimo | dunno :\ | 14:23 | |
i'll be duplicating the guard instructions with versions that take a BB | 14:24 | ||
there's so many of them :| | |||
and i don't really know which are most common(ly hit) | |||
brrt | why not start with just one | 14:26 | |
timotimo | right. i probably should | ||
make a suggestion? :) | |||
brrt | the simplest one... sp_guardtype or sp_guardconc | 14:29 | |
timotimo | if i'm not mistaken, i need an op for each kind of deopt we can do, right? to put at the end of the bridge? | 14:30 | |
but i'll know at spesh time which one i need to emit because there's the deopt annotations in the code belonging to the guard | 14:31 | ||
timotimo puts a speshlog in front of him | 14:32 | ||
359 sp_guardconc | 14:33 | ||
42 sp_guardtype | |||
34 sp_guardrwconc | |||
now if only i knew which one gets hit more often ... | |||
now for some debugspam :) | 14:36 | ||
brrt | hmmmm | 14:37 | |
timotimo | 701148 guardrwconc b0rked | ||
1273 guardtype b0rked | |||
727 guardconc b0rked | |||
brrt | it depends on how you want to do it | ||
timotimo | would you have guessed? | ||
brrt | no, wouldn't | 14:38 | |
timotimo | wait a minute | ||
i actually want to build bridges for the least often taken paths | |||
because every bridge i build moves unnecessary code out of the mainline | |||
if i were to immediately build a second speshed version based on "this guard didn't hold. but let's assume all other guards still hold", *then* i'd want to take the most often taken guards | 14:39 | ||
that's going to happen in the future, but i have no clue how hard that'll be | 14:41 | ||
i think i'd have to do a full re-spesh of the original code and turn the guard into a regular branch that'll take execution into a "parallel universe" where i'll clone most of the BBs | |||
brrt | hmmmmm | ||
ok, i may be naive, but.... | 14:42 | ||
timotimo | that sound like i'd be re-speshing fully every time i detect hotness on a new guard, and i'd be doing that parallel-world-clone quadratically | ||
brrt | i was under the impression that the goal was to take a basic block that had some move operations; prove that these moves or copies are unnecesssary after a guard; move the copies to a new basic block, and have the guard point to that bb? | 14:43 | |
so... why not do the proving thing first? | |||
timotimo | yes, that's the first milestone in this project | 14:45 | |
i'm getting far ahead of myself | |||
brrt knows what that is like :-) | 14:48 | ||
timotimo | :D | ||
there's another thing i'd really like to get into moar, but i don't know how to properly engineer it | 14:49 | ||
sometimes we build guards based on logs where the logs "figured out" some property that we already knew based on our regular fact discovery mechanism | |||
so we'll end up with something like a create op followed shortly by a guard | 14:50 | ||
i don't remember where i saw that example | |||
for some reason i couldn't just check for the flags at the point where the log guard tries to set up its facts, because the flags were just 0 ... or something like that? | |||
brrt | hmmm | 14:52 | |
i don't really know, to be honest | 14:53 | ||
timotimo | right, i'd have to find the example again | 14:54 | |
i'm really not sure i want to be messing around with the deopt table :| | 15:05 | ||
brrt | no.. i'm not suggesting that you should | 15:06 | |
in fact, i'm not suggesting anything | |||
timotimo | oh, is it enough to just add a little annotation? | ||
brrt | i have no idea to be honest | ||
timotimo | in fact, i can just duplicate the annotation that's in front of the guard op? | 15:07 | |
it seems like i'll just be able to rip out the annotation that belonged to the sp_guard* and put it in front of my sp_forcedeopt | 15:12 | ||
so at least that part is kind of figured out | |||
and Deopt All apparently only appears before invoke_* ops | 15:13 | ||
AFK for a bit | 15:35 | ||
15:41
domidumont joined
|
|||
timotimo | i think first i shall just turn sp_guardconc into sp_bridgeconc and immediately sp_forcedeopt | 16:12 | |
and see if anything breaks | |||
16:16
domidumont joined
|
|||
timotimo | oh crap | 16:17 | |
i'm adding branches to the *middle* of BBs | |||
that sucks. | |||
hm. i can potentially insert the new BB into the linear order and make it less crappy that way | 16:20 | ||
otherwise there'd be a crazy amount of jumps back and forth? | |||
16:40
zakharyas joined
17:05
dalek joined,
synopsebot6 joined
17:31
vendethiel joined
17:51
domidumont joined
|
|||
brrt | you'll have to split the basic block, that's for sure | 17:51 | |
i can't really say what the fallout of tha tis | |||
timotimo | hopefully nothing | 17:53 | |
if i make sure the linear order stays correct? | |||
and inside the bridges we won't be throwing exceptions or anything | 17:54 | ||
brrt | hmmm | 17:56 | |
that is .... okay, but very, very, very fragile | |||
timotimo | oh? | 17:58 | |
could you elaborate? | 18:03 | ||
brrt | sorry, i'm somewhat busy | 18:19 | |
i can see how it makes sense to keep the linear order, so that you don't upset the inlining and deoptimization tables | 18:20 | ||
on the other hand, that means you have to do that, forever | |||
the alternative is that your forcedeopt gets a fixed number that ... for all i care, represents the original position of your guard | 18:21 | ||
timotimo | forever %) | 18:22 | |
that is just fixed by stealing the annotation | |||
easy-peasy | |||
because the annotation has the data in it, as far as i can tell | |||
brrt | no upsetting of tables at all; it's outside of the range of the true code, but who cares | 18:23 | |
because after the bridge, you're going back to the original code anyway | |||
timotimo | i only meant having the split put the two pieces a BB is split into in the original order | 18:25 | |
the bridge ought to go outside, of course. especially when we expect it to not be taken often | 18:26 | ||
brrt | ah, alright | 18:27 | |
right, fully agree | |||
timotimo | so, no worries about fragility? or doing something "forever"? | 18:29 | |
18:38
domidumont joined
|
|||
brrt | no, not really | 18:43 | |
in fact, the reverse | |||
safe splitting of basic blocks is something we will probably need a lot of time | |||
19:29
FROGGS joined
|
|||
timotimo | hm. vim over sshfs isn't working very well with all those modules i have, it seems like | 21:10 | |
21:11
Util joined
|
|||
timotimo | waiting multiple minutes to open this file ... ?!? | 21:13 | |
hoelzro | o_O | 21:14 | |
psch | ...use ed? | 21:18 | |
timotimo | nah, i'm using vim inside ssh now | 21:19 | |
ugh. idx. not fun :| | 21:23 | ||
for splitting BBs, i mean. i'll have to come up with a new index | |||
well, i can just go through linear_next and +1 the idxes | 21:24 | ||
they aren't supposed to be stable anyway | |||
ugh, initial_pc is supposed to just be the cached instruction pointer at the beginning | |||
and it's an uint, so i can't just set it to -1 | 21:25 | ||
i think i can just re-use the initial_pc from the original BB when i split | 21:26 | ||
21:30
vendethiel joined
|
|||
timotimo | this is an ugly task | 21:41 | |
dalek | arVM: bdff4dc | timotimo++ | src/spesh/manipulate. (2 files): Implement a BB-splitting manipulation function |
22:30 | |
timotimo | ^- i bet it's b0rked beyond belief :) | ||
i'd be pretty glad if someone would commet and/or fix ;) | 22:46 | ||
a bit drained today, so not going to put in the "split basically everywhere" thing | |||
22:50
travis-ci joined
|
|||
travis-ci | MoarVM build failed. Timo Paulssen 'Implement a BB-splitting manipulation function' | 22:50 | |
travis-ci.org/MoarVM/MoarVM/builds/142899784 github.com/MoarVM/MoarVM/compare/8...ff4dc9e3a3 | |||
22:50
travis-ci left
|
|||
timotimo | well, i should have at least tried to build it, seems like | 22:56 | |
dalek | arVM: f9dad06 | timotimo++ | src/spesh/manipulate. (2 files): fix signature of split_BB_at |
22:58 | |
23:24
travis-ci joined
|
|||
travis-ci | MoarVM build passed. Timo Paulssen 'fix signature of split_BB_at' | 23:24 | |
travis-ci.org/MoarVM/MoarVM/builds/142905385 github.com/MoarVM/MoarVM/compare/b...dad06052ff | |||
23:24
travis-ci left
|
|||
timotimo | good | 23:25 |