From: Douglas K. <do...@go...> - 2013-05-08 23:41:40
|
to answer two of my own questions: 1) In the deftransform of eql it's a mistake to use COMMUTATIVE-ARG-SWAP to perform the switching of x,y since the latter might call give-up. Probably better to write out the should-args-be-swapped test by hand: diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index f6369e6..89b2f5a 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -3715,10 +3715,10 @@ ((and (csubtypep x-type char-type) (csubtypep y-type char-type)) '(char= x y)) - ((or (fixnum-type-p x-type) (fixnum-type-p y-type)) - (commutative-arg-swap node)) ((or (eq-comparable-type-p x-type) (eq-comparable-type-p y-type)) - '(eq x y)) + (if (and (constant-lvar-p x) (not (constant-lvar-p y))) + '(eq y x) + '(eq x y))) ((and (not (constant-lvar-p y)) (or (constant-lvar-p x) (and (csubtypep x-type y-type) 2) the index variable isn't actually elided in the fast code, it's that (a) I left out an INCF and (b) you no longer see a call to GENERIC-+ That's what I get for testing only with calls that don't need the index... On Wed, May 8, 2013 at 5:54 PM, Douglas Katzman <do...@go...> wrote: > Hi all, > > After eons of having our own homebrew FIND (in about 1.5e2 variations), > I've implemented in 'seqtran' what we feel to be a reasonable replacement. > Attached is the patch. > > But is it a known bug that the reduction of EQL to EQ is not commutative? > I discovered that in connection with the aforementioned patch. > It turns out that (FIND (THE FIXNUM X) (THE LIST L)) still uses > GENERIC-EQL and we'd like it not to, without having to write :TEST #'EQ. > To wit: > > * (disassemble '(lambda (x y) (eql x (the fixnum y)))) > ; disassembly for (LAMBDA (X Y)) > ; Size: 24 bytes > ; 04ACCA0F: 4839FA CMP RDX, RDI ; > no-arg-parsing entry point > ; 12: BA17001020 MOV EDX, 537919511 > ; 17: 41BB4F001020 MOV R11D, 537919567 > ; 1D: 490F44D3 CMOVEQ RDX, R11 > ... > > * (disassemble '(lambda (x y) (eql (the fixnum x) y))) > ; in: LAMBDA (X Y) > ; (EQL (THE FIXNUM SB-C::X) SB-C::Y) > ; > ; note: forced to do GENERIC-EQL (cost 10) > ; unable to do inline fixnum comparison (cost 4) because: > ; The second argument is a T, not a FIXNUM. > ; > ; compilation unit finished > ; printed 1 note > > ; disassembly for (LAMBDA (X Y)) > ; Size: 31 bytes > ; 04AFA5BF: 488D0C2550040020 LEA RCX, [#x20000450] ; GENERIC-EQL > ; > no-arg-parsing entry point > ; C7: FFD1 CALL RCX > ; C9: BA17001020 MOV EDX, 537919511 > ; CE: 41BB4F001020 MOV R11D, 537919567 > ; D4: 490F44D3 CMOVEQ RDX, R11 > ... > > |