Hi Andy, Andy Wingo <wi...@igalia.com> skribis:
>> However, 3.0.0 keeps the computation of ‘i’: >> > [...] >> L3: >> 53 (instrument-loop 139) >> 55 (handle-interrupts) >> 56 (call-scm<-scm-uimm 5 5 1 3) at (unknown >> file):388:11 >> 58 (call-scm<-scm-uimm 3 3 1 34) at (unknown >> file):389:21 >> 60 (call-scm<-scm-scm 3 4 3 10) at (unknown >> file):389:11 >> 62 (=? 5 4) at (unknown >> file):385:11 >> 63 (jne -10) ;; -> L3 > > Hoo, we need to fix the disassembler to output something more sensible > than this :P IP 56 appears to be the 1-, 58 is the lsh/immediate, and > 60 is the logior. Oh, I hadn’t read that much into these lines. :-) >> I’m not sure where the optimization should be taking place. Perhaps >> it’s just a matter of amount-of-work threshold somewhere? > > It's not an amount-of-work, that's only in peval which does nothing to > either of these (though it certainly could). > > I took a look. I just pushed something to make (logior 0 INT) reduce to > INT, but it doesn't remove the loop variable. OK. > Then I thought it was surely dead code elimination that just wasn't > doing its thing. The value is unused, so it must be that it thought > that the `ash' was effectful. That `ash' gets compiled to > `lsh/immediate', which does indeed raise an exception if the operand > isn't an int; but here we prove that it is. The problem was a missing > "type checker" implementation for lsh/immediate, a problem introduced in > the refactored compilation of `ash'. So, fixed in git now: > > L3: > 45 (instrument-loop 135) > 47 (handle-interrupts) > 48 (call-scm<-scm-uimm 5 5 1 3) at (unknown > file):4:12 > 50 (=? 5 4) at (unknown > file):3:12 > 51 (jne -6) ;; -> L3 Yay! It’s nice to see how 7dc90a17e03045c7cd8894b14b027b845b68aa4f is short and clear. Thanks, Ludo’.