Missed optimization in (if (typep ...) ...)
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
SBCL |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
(defun g (x) (declare (optimize (safety 0) (speed 3))) (if (typep x '(member 1 3)) t nil))
* (disassemble 'g)
; disassembly for G
; Size: 53 bytes. Origin: #x52D05D36
; 36: 4883FA02 CMP RDX, 2 ; no-arg-parsing entry point
; 3A: 750B JNE L1
; 3C: BA4F001050 MOV EDX, #x5010004F ; T
; 41: L0: 488BE5 MOV RSP, RBP
; 44: F8 CLC
; 45: 5D POP RBP
; 46: C3 RET
; 47: L1: 4883FA06 CMP RDX, 6
; 4B: B817001050 MOV EAX, #x50100017 ; NIL
; 50: 41BB4F001050 MOV R11D, #x5010004F ; T
; 56: 490F44C3 CMOVEQ RAX, R11
; 5A: 483D17001050 CMP RAX, #x50100017 ; NIL
; 60: BA4F001050 MOV EDX, #x5010004F ; T
; 65: 480F44D0 CMOVEQ RDX, RAX
; 69: EBD6 JMP L0
But:
(defun g (x) (declare (optimize (safety 0) (speed 3))) (typep x '(member 1 3)))
* (disassemble 'g)
; disassembly for G
; Size: 40 bytes. Origin: #x52CE96F6
; 6F6: 4883FA02 CMP RDX, 2 ; no-arg-parsing entry point
; 6FA: 750B JNE L1
; 6FC: BA4F001050 MOV EDX, #x5010004F ; T
; 701: L0: 488BE5 MOV RSP, RBP
; 704: F8 CLC
; 705: 5D POP RBP
; 706: C3 RET
; 707: L1: 4883FA06 CMP RDX, 6
; 70B: BA17001050 MOV EDX, #x50100017 ; NIL
; 710: 41BB4F001050 MOV R11D, #x5010004F ; T
; 716: 490F44D3 CMOVEQ RDX, R11
; 71A: EBE5 JMP L0
; 71C: EBE3 JMP L0
Also, I don't understand the two JMP instructions at the end of this second disassemble.
Changed in sbcl: | |
status: | Fix Committed → Fix Released |
1c47b5810426131 52dd29756e518b9 37766f31ad