00:05
KDr2_m joined
|
|||
MasterDuke | timotimo: i have a hypothesis, that figuring out how to debug spesh+EVAL bugs cures the common cold | 00:08 | |
timotimo | wow, i should try that! | 00:09 | |
sorry for being so unavailabel the recent days | |||
MasterDuke | i know, what am i paying you for !?!?! | 00:11 | |
timotimo | yes, what indeed. | ||
MasterDuke | s/for// | 00:12 | |
but aside from the joking, and if you're up for it, any ideas? | 00:13 | ||
00:14
KDr2_c joined
|
|||
timotimo | right, please bring me up to speed again, because my head is currently not able to concentrate | 00:15 | |
we were evaling what now? | 00:17 | ||
MasterDuke | well, to start at the beginning, i made this change: gist.github.com/MasterDuke17/5d63c...b78bc65c66 | 00:18 | |
timotimo | ah, we were making div faster? | ||
MasterDuke | yep | ||
(which it was, slightly) | |||
but some tests broke | |||
timotimo | ok, and those had eval in them? | 00:19 | |
MasterDuke | when running a `make spectest` or `make <the test file>` | ||
yep | |||
and i got really confused, because the tests worked on the command line | |||
when i ran what was being EVALed | |||
the particular tests were for ceil, floor, trunc, etc. (which all use div under the hood) | 00:20 | ||
timotimo | is it using eval_lives_ok? | 00:21 | |
MasterDuke | IOninja++ figured out it was a spesh/JIT thing. disabling either made the bug go away, but not disabling just the more specific spesh options | ||
timotimo | OK, yeah | ||
MasterDuke | no, getting the result of the EVAL and doing an ok() on that | 00:22 | |
timotimo | mhm | ||
MasterDuke | so i've done MVM_SPESH_LOG of before and after my change, but the logs are large and i don't know how to read them/what to look for | ||
timotimo | they are extremely large, yes | 00:23 | |
i've been meaning to write a tool that diffs them properly by picking the log apart into chunks and giving them a canonical ordering | |||
so you can actually see what's what | |||
MasterDuke | and another interesting thing, when doing an EVAL in a loop from the command line, it takes several iterations before the result changes | ||
timotimo | that also requires more output from the spesh log | ||
right, spesh runs on what it thinks is "hot code" | 00:24 | ||
i once put in a flag "SPESH_NODELAY" which would make it run for cold code, too | |||
it caused rakudo to not even be able to start before it crashes and burns ;) | |||
MasterDuke | right, but what i thought was weird is that the test isn't running all that many iterations | ||
timotimo | spesh isn't perfect, that much is clear ;( | ||
MasterDuke | but it always happens with the test | ||
timotimo | if the div thing gets called from a bunch of places that are similar it'll be considered hot | 00:25 | |
MasterDuke | ah, of course | 00:27 | |
timotimo | for determining how hot a piece of code is, it'll consider calls to the same routine as "one counter" if their "callsite" is equal | 00:28 | |
callsite includes things like "how many arguments", "which named arguments", "any native types?" | |||
MasterDuke | interesting, good to know | 00:29 | |
timotimo | that's also the little thing it always spits out at the beginning of a section of the log | ||
okay so i apply your patch, what's next? which test to run? | 00:30 | ||
MasterDuke | 'Callsite 0xf44a90 (3 args, 3 pos) Positional flags: obj, str, obj' this? | ||
timotimo | yeah | ||
MasterDuke | t/spec/S32-num/rounders.t | ||
timotimo | doesn't let me apply the patch right now | 00:32 | |
seems like i have to do it manually? | |||
patch unexpectedly ends in middle of line | |||
what. | |||
but it looks like it applied fine, so yay | 00:33 | ||
rakudo built | 00:35 | ||
MasterDuke | dunno, i just copied the `git diff` output | ||
timotimo | should be okay | 00:36 | |
# Failed test '(-0.1).truncate == 0' | |||
# at t/spec/S32-num/rounders.t line 88 | |||
it should look something like that? | |||
MasterDuke | yep | ||
timotimo | so what confuses me is this | 00:39 | |
turning the jit off fixes it | |||
so we must be compiling something wrong?! | |||
MasterDuke | compiling? | ||
timotimo | yeah, you know, actually writing x86_64 binary code | 00:40 | |
MasterDuke | not good | ||
timotimo | maybe it's easy. but my x86_64 assembly knowledge is quite limited | 00:41 | |
00:41
vendethiel joined
|
|||
timotimo | especially when it comes to the FPU | 00:41 | |
i'll sprinkle some debug statements | |||
MasterDuke | heh, mine is almost completely limited. don't think i've ever written any x86* assembly | 00:42 | |
timotimo | another question: | ||
MasterDuke | i've read a tiny bit, and written a tiny bit of MIPs for a class, but that's it | ||
timotimo | why does a patch to Int.pm cause trouble with methods from Num.pm? :) | 00:43 | |
MasterDuke | they call div, maybe there's no Num.div (i haven't looked)? | ||
no `method div` in Num.pm or Numeric.pm | 00:44 | ||
timotimo | well, here's a case where ceiling on a Num fails | ||
MasterDuke | ah, there is is 'proto sub infix:<div>' in Numeric.div | 00:45 | |
but then a comment: # rest of infix:<div> is in Int.pm | |||
timotimo | right | ||
i mean | |||
file boundaries mean nothing really | |||
but still | |||
ceiling begins to fail when you change div, but ceiling definitely doesn't use div | 00:46 | ||
00:46
pyrimidine joined
|
|||
MasterDuke | ah, right, Num.ceiling just calls nqp::ceil_n | 00:47 | |
timotimo | yup | ||
MasterDuke | interesting, only Real, Cool, and Complex have truncate() | 00:49 | |
timotimo | changing the contents of the ceiling method in Num.pm makes the bug disappear for the one(?) ceiling test that used to fail | 00:50 | |
of course changing the size of a function like i just did makes it a whole lot bigger | |||
which makes it less likely to be inlined and such | 00:51 | ||
i don't even see ceil anywhere in the jit?! | |||
MasterDuke | i'd MVM_SPESH_LOGged a truncate() call, but no ceil there | 00:53 | |
timotimo | ugh. ugh. ugh. | ||
"ceil" doesn't appear in the jitlog *anywhere* | |||
maybe because my changes prevented jitting in the first place? | |||
timotimo tries again | 00:54 | ||
(without my added code) | |||
i'd expect the ceiling method to be bailed from jitting because ceil_n isn't implemented | |||
which also means that the jit can't be responsible here ... ?!?! | 00:55 | ||
okay, the ceiling method doesn't even get considered for jitting | 00:56 | ||
MasterDuke | well, it can't be only the jit that's responsible if disabling spesh also fixes it, right? | ||
timotimo | disabling spesh also disables the jit | ||
MasterDuke | ah | 00:57 | |
timotimo | asdfasdfasdf | 00:58 | |
MasterDuke | anything i could try in parallel? | 01:01 | |
timotimo | i'd like to have some cooked dinner :S | 01:03 | |
This type cannot unbox to a native integer: P6opaque, Slip | 01:04 | ||
in block <unit> at tools/build/create-moar-runner.pl line 10 | |||
fantastic | |||
oh yeah | 01:05 | ||
MasterDuke | you made some change? | ||
timotimo | i straight-up broke div completely %) | ||
by having it no longer return the result | 01:06 | ||
so that's fun :) :) | |||
01:07
ilmari[m] joined
|
|||
MasterDuke | huh, div is used during a `make install`? | 01:08 | |
timotimo | not sure what file it actually was trying to compile | 01:09 | |
-- expected to get -1 for -1 div 2, but got 0 | |||
you'll have to answer for this | |||
MasterDuke | ? i get that locally | 01:11 | |
timotimo | gist.github.com/timo/57a5e93c21d6c...ead1c5ff4a | 01:12 | |
-- expected to get -1 for -1 div 10, but got 0 | 01:13 | ||
that's kinda weird | |||
m: say -1 div 10 | |||
camelia | -1 | ||
MasterDuke | `./perl6-m -e 'say -1 div 2'` gives -1 | 01:14 | |
timotimo | i'm not sure if isbig_I is actually a good thing to have at all | 01:15 | |
but the values here aren't really big at all | 01:16 | ||
i mean the test values we're dealing with | |||
MasterDuke | you mean isbig_I is not a good thing ever, or with the optimization i was attempting? | 01:17 | |
timotimo | maybe even ever ... | ||
MasterDuke | why's that? | 01:18 | |
timotimo | i don't remember writing that code, but it does say "somebody please check ..." | 01:20 | |
MasterDuke | not suspicious at all | 01:21 | |
timotimo | never returning "not big" from the true branch in there makes everything work | ||
MasterDuke | wonder if it's at all related to the mp_get_int64 problem | ||
timotimo | which one is that? | 01:23 | |
MasterDuke | we can store -(2**63) in a native, but not 2**63 (because 2's complement) | ||
timotimo | right | ||
it's still giving a bunch of "it's not big" results | 01:24 | ||
MasterDuke | i've had some conversations with nine and jnthn about it recently, and been playing around with trying to fix, but this really isn't my area of expertise | 01:25 | |
you're giving it "big" numbers? | |||
timotimo | no, it's just running the test file | 01:26 | |
right now with the true branch just unconditionally returning 1, it'll just tell you if the Int is stored internally as a 32bit integer | |||
i must have at one point understood the internals of the mp_int struct | 01:28 | ||
to write that code ... | |||
MasterDuke | `/* the infamous mp_int structure */ typedef struct { int used, alloc, sign; mp_digit *dp; } mp_int;` | 01:29 | |
right from 3rdparty/libtommath/tommath.h | |||
timotimo | yeah | 01:31 | |
but also, mp_digit is allowed to be different sizes | |||
based on what you #define | |||
hm. having the is_big based on mp->used alone is also b0rked | 01:32 | ||
01:32
agentzh joined
|
|||
timotimo | like, the other if in there is an extra condition under which it can give you "it's not big" | 01:33 | |
oh, hold on, that's wrong | |||
it's still puzzling to me :) | 01:34 | ||
i still don't get why your patch would cause these other things to asploded | 01:36 | ||
why exactly is it using div for those things in the first place | 01:37 | ||
maybe it happens during parsing? could that be possible? | |||
i could output a backtrace, that's what i could do | |||
MasterDuke | oooh, interesting idea, could parsing be at fault | 01:38 | |
timotimo | oh | 01:39 | |
did we realize that many of these tests are actually using Rat? | |||
ah, they're supposed to do some rats, yeah | |||
and rats totally do use div for a lot of stuff | |||
MasterDuke | oh wow, even for +/- | 01:40 | |
timotimo | yuppers | ||
i think the mystery is getting resolved little by little | 01:41 | ||
MasterDuke | ah, and in Rational.(floor|ceiling) | ||
and Rational.new | 01:42 | ||
timotimo | i really am feeling a little bit better | 01:44 | |
MasterDuke | ha. hard to bottle this though | 01:45 | |
timotimo | i still have no good theory as to why the div results only b0rk when jit is enabled, though. | 01:46 | |
MasterDuke | i find it hard to understand that repeated calls with the same "small" number fail | 01:48 | |
01:48
pyrimidine joined
|
|||
timotimo | what exactly? | 01:48 | |
MasterDuke | i could sort of see how there might be problems if we first called it with "small" numbers, such that only the "not isbig_I" branch was taken, and then it failed with a "big" number | 01:49 | |
i.e., the JIT code somehow thought div_i was only ever going to be called, not div_I conditionally | 01:50 | ||
timotimo | the jit also just calls the same function that the interpeter calls | 01:51 | |
and i see no obvious problem with the way it generates the call | |||
do you think we can get better code if we use istrue_I(b) instead of just b inside the if's first branch? | 01:53 | ||
MasterDuke | huh, don't think i've ever used istrue_I | ||
don't see it in the nqp ops doc | 01:54 | ||
timotimo | at the moment the code is using unless_o | ||
which is "virtual" | |||
i.e. whenever it's called it'll first try to figure out what kind of object it is, and in what way you figure out the truthness of the type in question | 01:58 | ||
MasterDuke | i made it `nqp::istrue(b)`, but same results | ||
timotimo | well, that's also a virtual one | ||
hm. there's actually no istrue_I? | |||
it's bool_I | 01:59 | ||
MVM_bigint_bool is also theoretically a candidate for a direct jit implementation in assembly | 02:01 | ||
it's a very small function, so the function call overhead would be noticable | |||
probably something for the exprjit, though :) | |||
MasterDuke | same with nqp::bool_I | 02:02 | |
timotimo | that's a performance optimization; did you measure run time or something? :) | ||
i mean, since the test uses EVAL a bunch, there's probably a crazy amount of overhead | |||
MasterDuke | ha, no, just count of errors | ||
timotimo | i don't see why the code should continue using EVAL, since we have indirect method call syntax | 02:03 | |
i.e. instead of EVAL "myobj.$methodname()", we can literally myobj."$methodname"() | |||
MasterDuke | pretty sure that's a very old test file | ||
timotimo | right | ||
should we modernize it? | 02:04 | ||
it currently runs in about 1.8s on my machine | |||
if we use indirect method calls, i'd expect it to run in like 0.5s | |||
MasterDuke | don't see the harm | 02:06 | |
timotimo | you wanna try it, or should i? | ||
MasterDuke | go for it, you know what you have in mind | 02:07 | |
timotimo | i'll try | ||
i'm a little bit confused by the code actually | 02:09 | ||
oh, "$type" isn't meant to be a type, like Int, it's the sub it's trying to use | 02:10 | ||
so the first loop does floor($foo), the other loop does $foo.floor() | |||
MasterDuke | ah, i hadn't noticed that distinction either | 02:11 | |
timotimo | oooh | 02:12 | |
there's also values like "-0.499.Num" | |||
honestly i don't know why it'd be like that, though? | 02:13 | ||
like, i could just put the values in the list of tests like that? | |||
MasterDuke | i don't know why not | 02:14 | |
timotimo | right .. | ||
MasterDuke | i mean, the point of this file isn't really to test parsing... | 02:15 | |
timotimo | right | ||
only got it down to 1s though | 02:16 | ||
kind of disappointing | 02:17 | ||
well, 0.9s | |||
but ram consumption is way down | |||
MasterDuke | 50% of the runtime is a nice improvement | ||
timotimo | used to be like 126meg, now it's 90meg | ||
MasterDuke | btw, did you see that heaptrack app i mentioned? think you would find it interesting | 02:18 | |
timotimo | i saw, i didn't try it yet | 02:19 | |
the output you posted was kind of not that interesting | |||
as it just says "this fixedsize allocator, it's allocating a bunch of memory!" | |||
but it'd be more interesting to know what uses the fsa to allocate what kinds of stuff | |||
not sure if we can teach that tool about our multiple allocators | 02:20 | ||
MasterDuke | no idea. that screenshot was just of the summary tab, it does have a bunch more info | ||
timotimo | it's also doing the "get stuff out of the hash" in a very roundabout way | 02:21 | |
MasterDuke | oh yeah, i checked, .[] works now | 02:22 | |
and has for all build the *ables know about | |||
i think that comment is from the pugs times | |||
timotimo | yeah, but also: | ||
we grab the keys and sort 'em | |||
then we pull the values out of the hash with access | |||
rather than iterating over .pairs or .kv | 02:23 | ||
MasterDuke | whoops, i gotta afk for a bit, will be back though | ||
timotimo | using .kv, then .sort, that's a recipe for ... fun :D | ||
oh wow | 02:27 | ||
--profile says the code ran for only 73ms | |||
so the majority of the time seems to be in parsing and optimization i suppose | |||
Stage parse : 0.677 | |||
the --profile-compile tab is quite busy %) | 02:29 | ||
crashed, yay. | 02:34 | ||
was it you who made the sql version of our profiler? | 02:35 | ||
i mean the output format, not actually something that uses the sql data | |||
Geth | MoarVM: 152337ab0c | (Timo Paulssen)++ | src/math/bigintops.c throw out flawed parts of bigint_is_big this caused trouble for an optimization of the div infix in rakudo that caused t/S32-num/rounders.t to fail in mysterious ways. |
02:38 | |
samcv | good * | 02:49 | |
timotimo | greetings samcv | ||
how are you today? | |||
samcv | good | ||
just had food | |||
timotimo | glad to hear | ||
i'm now sick | 02:51 | ||
a very good german satire site recently had an article about a women who wanted to go through childbirth in order to find out for herself how bad a man-flu is | |||
didn't translate that very well | |||
samcv | what is man-flu | ||
timotimo | it's when a man has the flu | 02:52 | |
samcv | is that different from normal flu lol? | ||
timotimo | it's separate from woman-flu or basically-anybody-flu because men tend to be really whiny when they get a flu | ||
samcv | lol. | ||
timotimo | and so the meme is that man-flu is a really terrible disease | 02:53 | |
samcv | oh i am sure. millions get it every year | ||
timotimo | i don't think i have an actual flu, just a cold maybe. but damn i feel bad | ||
samcv | probably an epidemic | ||
aww :( | |||
timotimo | i'm not supposed to suffer this much from a sickness this trivial | 02:54 | |
anyway, you up for coding today? | |||
samcv | yes | ||
timotimo "git pull" latest UCD | |||
samcv | :) | ||
timotimo | hm, what code was i supposed to write again | 02:56 | |
the code in C to get from codepoint to its name? | |||
samcv | yeah | ||
the name code hasn't been touched in a while | |||
so it's basically as it was before | |||
--names-only to only make names | |||
timotimo | good good | ||
any reason to download-ucd again? | 02:57 | ||
samcv | like the files from unicode.org? nope | ||
timotimo | TIMER UnicodeData 23.2968431 seconds | 02:58 | |
X::TypeCheck::Binding exception produced no message | |||
in method saw-line at /home/timo/perl6/ecosystem/UCD/lib/seenwords.pm6 (seenwords) line 15 | |||
hum. | |||
Registering binary properties: Any, Bidi_Mirrored … | 02:59 | ||
^- that looks wrong | |||
samcv | got an exception? | ||
naw that happens | |||
ignore that | |||
also curious about the exception. | |||
timotimo | that's Generate_Name_List | ||
inside get_shift_levels | |||
samcv | oh crap | 03:00 | |
not sure when that happened. | |||
i see it on travis | |||
timotimo | where it does saw-line for the $s | ||
samcv | lemme see the last change i made | 03:01 | |
was a month ago | |||
investigating now | |||
MasterDuke | timotimo: yeah, i did the sql stuff | 03:02 | |
timotimo | did i give you a good direction for what to do next? | ||
to fix the problem i was having? | |||
MasterDuke | that moar commit fixes the div problem? | ||
timotimo | it ought to | 03:03 | |
MasterDuke | well, i remember you said change the `// 'NULL'`s to `// 0` | ||
timotimo | right, that was the easiest part | ||
you know about NULL in SQL? it's quite ... special | |||
MasterDuke | but then you said something about foreign keys | ||
yeah, there be dragons | |||
timotimo | yeah, foreign keys is not that important | 03:04 | |
it'd probably be enough to have more descriptive field names | |||
like, there's an id field in callee that tells us what the id of that particular callee is, there's one that links the callee to the table that has routine name, filename, and line number | 03:05 | ||
and one that tells us which entry in the callee table is our parent | |||
samcv | uh timotimo it might be flapping | ||
timotimo | i found it a little hard to figure out what was what | ||
samcv | on travis it fails and doesn't fail like every other build or something | ||
MasterDuke | sure. i wanted to keep things as close as possible to the json initially for ease of comparing to make sure i did things correctly, but it doesn't have to stay that way | 03:06 | |
timotimo rebuilds rakudo with a more verbose error there | 03:08 | ||
m: "foo-bar baz".split(["-", " "]); | |||
camelia | ( no output ) | ||
timotimo | m: for "foo-bar baz".split(["-", " "]) -> $line { } | ||
camelia | ( no output ) | ||
timotimo | m: for "foo-bar baz".split(["-", " "]) { } | 03:09 | |
camelia | ( no output ) | ||
timotimo | m: for "LESS-THAN SIGN".split(["-", " "]) { } | ||
camelia | ( no output ) | ||
timotimo | m: for ^1000 { for "LESS-THAN SIGN".split(["-", " "]) { } } | ||
camelia | ( no output ) | ||
timotimo | weird. | ||
oh, rakudo compiles so slowly because my moar is --optimize=0 | 03:10 | ||
Nominal type check failed for parameter 'one'; expected Any but got BOOTIntArray | 03:12 | ||
this could be golfable and RTable | 03:14 | ||
m: for ^1000 { for "LESS-THAN SIGN".split([" ", "-"]) { } } | 03:15 | ||
camelia | X::TypeCheck::Binding exception produced no message in block <unit> at <tmp> line 1 |
||
timotimo | there we go. | ||
m: for ^1000 -> $time { for "LESS-THAN SIGN".split([" ", "-"]) { }; CATCH { say $time }} | |||
camelia | 0 X::TypeCheck::Binding exception produced no message in block <unit> at <tmp> line 1 |
||
timotimo | it immediately fails, too | ||
m: for ^1000 -> $time { for "LESS-THAN SIGN".split([" ", "-", "A"]) { }; CATCH { say $time }} | |||
camelia | ( no output ) | 03:16 | |
timotimo | m: for ^1000 -> $time { for "LESS-THAN SIGN".split([" ", "A"]) { }; CATCH { say $time }} | ||
camelia | 0 X::TypeCheck::Binding exception produced no message in block <unit> at <tmp> line 1 |
||
timotimo | so basically if we have an occurence of needle 0 after an occurence of needle 1, it'll try to swap the values around inside the mergesort impl | ||
and that goes asploded | |||
samcv | ah so that's what's causing the problem? | ||
timotimo | yup. | 03:17 | |
samcv | yay finding bugs | ||
timotimo | deep deep deep inside the bowels of rakudo :) | ||
you want to do the honors? | |||
samcv | of fixing it? lol. not really :P | ||
timotimo | no, RTing it | ||
samcv | ah. you should RT it. i think you understand more what's causing it and can write something better than I | ||
timotimo | ok, maybe | 03:18 | |
samcv | oh lizmat broke it a day ago github.com/rakudo/rakudo/commit/9d...29a8af0cc1 | 03:19 | |
see bisect in #perl6-dev | |||
timotimo | very interesting that it failed in your travis a few times? | ||
yes, i saw | |||
samcv | i think i have it set to nom | ||
timotimo | does the travis log show the rakudo (and others) revision used? | ||
or is it just "nom"? | |||
i mean, you set it to nom, but does it output the exact version somewhere? | |||
maybe it was ok, broken, ok, broken | 03:20 | ||
and we just found the last time it brokened | |||
samcv | This is Rakudo version 2017.02-156-g2cf9b53 built on MoarVM version 2017.02-18-g5f9d698 | ||
03:21
vendethiel joined
|
|||
MasterDuke | timotimo: interesting, now my changes to div don't make it any faster | 03:25 | |
timotimo | what are our changes like now? | 03:26 | |
Use of uninitialized value of type Str in string context. | 03:28 | ||
Methods .^name, .perl, .gist, or .say can be used to stringify it to something meaningful. | |||
in method done at /home/timo/perl6/ecosystem/UCD/lib/EncodeBase40.pm6 (EncodeBase40) line 52 | |||
Use of uninitialized value $!to-encode-str of type Str in string context. | |||
Methods .^name, .perl, .gist, or .say can be used to stringify it to something meaningful. | 03:29 | ||
in method done at /home/timo/perl6/ecosystem/UCD/lib/EncodeBase40.pm6 (EncodeBase40) line 52 | |||
samcv: ^ get this, too? | |||
samcv | yeah ignore that | ||
timotimo | haha :D | ||
samcv | i fixed that tho if you pull | ||
was a harmless problem but better to reduce warnings | |||
timotimo | OK | 03:30 | |
my fix for the exception message didn't work | 03:31 | ||
03:32
pyrimidi_ joined
|
|||
timotimo | i actually think i'll try going to bed soon-ish | 03:33 | |
i'm already feeling noticably better than last time i laid down | |||
samcv | kk | 03:35 | |
timotimo | but i'm now very hungry apparently | ||
03:44
KDr2 joined
|
|||
MasterDuke | timotimo: i'm testing the same changes as before (with this `use nqp; my $a = -1; nqp::while(nqp::islt_i(++$a, 5_000_000), ($ = $a div 17))`) | 03:49 | |
and now the unmodified div is faster | 03:50 | ||
also, using nqp::bool_I in my changed version is slightly slower | |||
timotimo | huh | ||
huh! | |||
MasterDuke | 1657ms vs 1740ms | 03:51 | |
timotimo | can you send over a spesh log? | 03:52 | |
actually, maybe i'll take the diffs | |||
MasterDuke | you want the diffs of spesh logs between the change with nqp::bool_I and without? | 03:55 | |
timotimo | oh, no | 03:56 | |
the diffs for the code | |||
MasterDuke | same as the gist i linked earlier | 04:00 | |
timotimo | OK, good | 04:01 | |
MasterDuke | i just also tested with `nqp::bool_I(b)` instead of `b` | ||
timotimo | i'll go sleep now, but maybe i'll look into that s'more | 04:26 | |
it could be of course that spesh was already turning that thing into essentially bool_I for us | |||
and using bool_I gave us the bool_I, but also a "if_i" on top of that? | 04:27 | ||
that's possible | |||
anyway, seeya! | |||
MasterDuke | later... | 04:30 | |
06:00
pyrimidine joined
06:38
brrt joined
|
|||
brrt | good *, #moarvm | 06:48 | |
07:10
KDr2 joined
07:40
domidumont joined
07:56
brrt joined
08:21
ilmari[m] joined
08:36
zakharyas joined
|
|||
samcv | good morn-er * | 09:08 | |
09:50
pyrimidine joined
|
|||
jnthn | morning o/ | 09:59 | |
10:02
brrt joined
10:13
brrt joined
10:29
brrt joined
10:34
zakharyas joined
|
|||
dogbert17_ | very silent around here | 10:43 | |
IOninja blasts www.youtube.com/watch?v=vfu9UBsPAxs | 10:53 | ||
dogbert17_ indeed shouldn't IOninja be asleep at this time? | 10:54 | ||
IOninja | 6am. Just woke up | ||
11:13
pyrimidine joined
|
|||
brrt | yeah, there's $dayjob issues to take care of | 11:19 | |
12:02
pyrimidine joined
|
|||
dogbert17_ | jnthn, are you around? | 12:07 | |
jnthn | About to go have lunch :) | 12:08 | |
dogbert17_ | do you think this will work? gist.github.com/dogbert17/fd8f2ca8...c5deb87871 | ||
dogbert17_ multithreading is not my speciality :) | 12:09 | ||
jnthn | Looks OK | 12:10 | |
I'd be a bit surprised if it hit :) | |||
dogbert17_ | t/spec/S19-command-line/repl.rakudo.moar .......................... ok | ||
===( 0;293 13/17 12/13 3/335 1/52 0/? 0/?)===tc's are equal | |||
jnthn | Hmm | 12:11 | |
dogbert17_ | indeed | ||
jnthn | o.O | ||
How on earth... :-) | |||
dogbert17_ | maybe something to contemplate over lunch :) | ||
jnthn | Aye | ||
Talking of which, bbiab | |||
timotimo falls out of bed | 12:19 | ||
dogbert17_ | timotimo, time to take care of ENOCOFFEE then :) | 12:21 | |
timotimo | so we're basically failing to account for reentrant usage of the decoder, or perhaps we're throwing an exception or otherwise leaving the decoder's single-user section without clearing the bit? | 12:22 | |
MasterDuke: it occurs to me that the div improvement can only really help if it prevents bunches of boxing/unboxing. perhaps when your div returns an int, it's immediately turned back into Int by the caller? | 12:23 | ||
dogbert17_ | timotimo, yes something fishy is definitely going on | 12:35 | |
timotimo | i wonder if it's sane to create watchpoints whenever the decodestream is entered | 12:36 | |
but you can't "break when some code is not run" | 12:37 | ||
jnthn | timotimo: Reentrant use is in theory impossible - the decoder does work then returns results | 12:41 | |
Though it can throw exceptions in some cases which we'd not account for | 12:42 | ||
But that in turn would mean the decoder is useless from then on | |||
timotimo | right ... | 12:43 | |
jnthn | And anyway, we'd probably see those exceptions | ||
timotimo | probably | ||
dogbert17_ | so what's going on, is my code borked? | 12:46 | |
timotimo | i haven't the slightest | 12:49 | |
IOninja | Wasn't following the discussion, but I see mention of t/spec/S19-command-line/repl.t .... that test file can give false negatives on slow boxes. Set ROAST_TIMING_SCALE=2 or higher numbers to make the tests wait longer before assuming stuff hanged. | 13:03 | |
13:04
pyrimidine joined
13:09
pyrimidi_ joined
13:10
pyrimidine joined
|
|||
dogbert17_ | ok ultrastupid question: do the calls MVM_string_decodestream_get_until_sep_* here have to be protected? github.com/MoarVM/MoarVM/blob/mast...der.c#L246 | 13:35 | |
jnthn | No, those are immutable after decoder initialization | 13:37 | |
(Also, not ultrastupid :)) | |||
dogbert17_ | thx, I was wondering because of this: github.com/MoarVM/MoarVM/blob/mast...ile.c#L145 | 13:38 | |
13:53
KDr2 joined
13:55
KDr2 joined
14:04
brrt joined
14:12
MasterDuke_ joined
|
|||
MasterDuke_ | timotimo: even though you made a fix in github.com/MoarVM/MoarVM/commit/152337ab0c, there still is a bug in the JIT, correct? | 14:14 | |
and if so, doesn't brrt have a JIT bisect tool? | |||
timotimo | only for the exprjit | 14:16 | |
at least i think so | |||
14:16
pyrimidine joined
|
|||
brrt | yeah, it only works for the expr JIT | 14:16 | |
timotimo | oh hey brrt | 14:17 | |
brrt | hey timotimo | ||
i lurk :-) | |||
it'd be interesting to make it work for non-expr jit, though | 14:18 | ||
MasterDuke_ | ha, so i was technically correct (the best kind), but that still doesn't help us | 14:19 | |
brrt: is that a 5min or 5day job? | 14:23 | ||
14:50
zakharyas joined
14:57
pyrimidine joined
15:08
ggoebel joined
15:28
brrt joined
|
|||
brrt | .tell MasterDuke_ it's a one day job | 15:29 | |
yoleaux2 | brrt: I'll pass your message to MasterDuke_. | ||
brrt | but the question is to figure out which piece of code breaks | 15:40 | |
and then, if you have that, it's probably an issue of figuring out which instruction makes that code break | 15:41 | ||
which is a bit more difficult because the 'lego' JIT has no fallback method like the expr JIT has | |||
timotimo | hm | 15:42 | |
can't the lego jit just say "oh, errr, i gotta deopt now!" | |||
jnthn | Deopt points are explicit thing | 15:44 | |
*things | |||
e.g. we have a mapping table set up at the time we produce bytecode | |||
timotimo | mhh | 15:46 | |
i expect the exprjit falls back to the lego jit when it hits the bisection point? | 15:47 | ||
15:56
pyrimidine joined
16:11
brrt joined
|
|||
brrt | timotimo: yes | 16:12 | |
timotimo | right. the lego can't do it | ||
16:31
ZofBot joined
16:50
pyrimidine joined
|
|||
brrt | well, it could, with sufficient additional hacking | 16:50 | |
i can't recall how i wanted to resolve my conflict bitmap… | 16:51 | ||
17:01
pyrimidine joined
17:09
pyrimidine joined
17:22
ZofBot joined
17:24
pyrimidine joined
17:36
d4l3k_ joined
17:40
domidumont joined
17:41
moritz_ joined
17:43
camelia joined
17:50
moritz joined
17:56
pyrimidine joined
19:06
zakharyas joined
19:24
agentzh joined
20:12
pyrimidine joined
21:31
pyrimidine joined
21:43
ggoebel joined
21:55
agentzh joined
22:08
pyrimidine joined
|
|||
MasterDuke | .tell brrt fyi, if you're interested in the JIT bug, there's a bunch of discussion here: irclog.perlgeek.de/moarvm/2017-03-03#i_14196620 | 23:07 | |
yoleaux2 | MasterDuke: I'll pass your message to brrt. | ||
MasterDuke | timotimo: i think i was just hoping that div_i is so much faster than div_I, that it was worth a bit of effort (e.g., conditionals, boxing/unboxing) to try and use it when possible | 23:10 | |
23:17
pyrimidine joined
|