From: Sam S. <sd...@gn...> - 2003-10-15 15:10:28
|
> * Bruno Haible <oe...@py...t> [2003-10-15 13:01:08 +0200]: > > Sam wrote: >> Now, could you please explain this? >> >> [6]> (defun 1st (x) (with-open-file (s x) (write-line (read-line s)))) >> 1ST >> [7]> (disassemble '1st) >> >> >> Disassembly of function 1ST >> (CONST 0) = #<SYSTEM-FUNCTION VALUES> >> (CONST 1) = CLOSE >> (CONST 2) = :ABORT >> 1 required argument >> 0 optional arguments >> No rest parameter >> No keyword parameters >> 33 byte-code instructions: >> 0 (LOAD&PUSH 1) >> 1 (PUSH-UNBOUND 6) >> 3 (CALLS1&PUSH 249) ; OPEN >> 5 (UNWIND-PROTECT-OPEN L38) >> 7 (CONST 0) ; #<SYSTEM-FUNCTION VALUES> >> 8 (MVCALLP) >> 9 (LOAD&PUSH 3) >> 10 (PUSH-UNBOUND 3) >> 12 (CALLS1&PUSH 119) ; READ-LINE >> 14 (PUSH-UNBOUND 3) >> 16 (CALLS1 138) ; WRITE-LINE >> 18 (MV-TO-STACK) >> 19 (LOADI 0 0 2) >> 23 (JMPIFNOT L28) >> 25 (PUSH) >> 26 (CALL1 1) ; CLOSE >> 28 L28 >> 28 (MVCALL) >> 29 (UNWIND-PROTECT-NORMAL-EXIT) >> 30 (LOADI 0 0 0) >> 34 (JMPIFNOT L50) >> 36 (JMP L44) >> 38 L38 >> 38 (LOADI 0 0 0) >> 42 (JMPIFNOT L50) >> 44 L44 >> 44 (PUSH) >> 45 (CONST&PUSH 2) ; :ABORT >> 46 (T&PUSH) >> 47 (CALL 3 1) ; CLOSE >> 50 L50 >> 50 (UNWIND-PROTECT-CLOSE) >> 51 (SKIP&RET 3) >> NIL >> >> >> 2. instructions 30/34/36 appear to be equivalent to 38/42/44; i.e., >> 30/34/36/38 can be eliminated altogether (and 5 point to L44) > > You are right. This is a consequence of a heuristic that Michael built in: > the jump optimization only merges > > (I1) ... (Ik) ... (In) LNNN > and (Ik+1) ... (In) (JMP LNNN) > > to > > (I1) ... (Ik) LKKK ... (In) LNNN > and (JMP LKKK) > > if and only if n-k >= 2, i.e. if there are two instructions to be > saved. And similarly it can happen that a single instruction is > copied from one code-list to another if that makes a jump go > away. While this makes the code slightly larger, it ensures that the > relative frequency of jumps (i.e. of no-op instructions) is kept to <= > 33%. Which is important for speed. wait a second - if the 33% ratio is maintained by keeping the denominator larger (instead of numerator small), nothing is gained. > You are welcome to refine this heuristic so that it recognizes a > complex case like this one where nothing is won by copying the (LOADI > 0 0 0) instruction. most of this message is Greek to me. sorry. maybe you could point me to the part of compiler.lisp which you are talking about? (or, better yet, DIY and I will learn from your patch, like I learned about *current-value* and *current-vars* in traverse-anode from your 2003-05-14 patch) -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.camera.org> <http://www.iris.org.il> <http://www.memri.org/> <http://www.mideasttruth.com/> <http://www.honestreporting.com> MS Windows: error: the operation completed successfully. |