From: Alexey D. <ade...@us...> - 2002-12-22 14:19:55
|
Update of /cvsroot/sbcl/sbcl In directory sc8-pr-cvs1:/tmp/cvs-serv22499 Modified Files: BUGS NEWS version.lisp-expr Added Files: OPTIMIZATIONS Log Message: 0.7.10.30: Fixed bug 232, shown by Paul Dietz' test suite. --- NEW FILE: OPTIMIZATIONS --- (defun mysl (s) (declare (simple-string s)) (declare (optimize (speed 3) (safety 0) (debug 0))) (let ((c 0)) (declare (fixnum c)) (dotimes (i (length s)) (when (eql (aref s i) #\1) (incf c))) c)) * On X86 I is represented as a tagged integer. * EQL uses "CMP reg,reg" instead of "CMP reg,im". This causes allocation of extra register and extra move. * Unnecessary move: 3: SLOT S!11[EDX] {SB-C::VECTOR-LENGTH 1 7} => t23[EAX] 4: MOVE t23[EAX] => t24[EBX] -------------------------------------------------------------------------------- (defun quux (v) (declare (optimize (speed 3) (safety 0) (space 2) (debug 0))) (declare (type (simple-array double-float 1) v)) (let ((s 0d0)) (declare (type double-float s)) (dotimes (i (length v)) (setq s (+ s (aref v i)))) s)) * Python does not combine + with AREF, so generates extra move and allocates a register. * On X86 Python thinks that all FP registers are directly accessible and emits costy MOVE ... => FR1. -------------------------------------------------------------------------------- (defun bar (n) (declare (optimize (speed 3) (safety 0) (space 2)) (type fixnum n)) (let ((v (make-list n))) (setq v (make-array n)) (length v))) * IR1 does not optimize away (MAKE-LIST N). * IR1 thinks that the type of V in (LENGTH V) is (OR LIST SIMPLE-VECTOR), not SIMPLE-VECTOR. -------------------------------------------------------------------------------- (defun bar (v1 v2) (declare (optimize (speed 3) (safety 0) (space 2)) (type (simple-array base-char 1) v1 v2)) (dotimes (i (length v1)) (setf (aref v2 i) (aref v1 i)))) VOP DATA-VECTOR-SET/SIMPLE-STRING V2!14[EDI] t32[EAX] t30[S2]>t33[CL] => t34[S2]<t35[AL] MOV #<TN t33[CL]>, #<TN t30[S2]> MOV BYTE PTR [EDI+EAX+1], #<TN t33[CL]> MOV #<TN t35[AL]>, #<TN t33[CL]> MOV #<TN t34[S2]>, #<TN t35[AL]> * The value of DATA-VECTOR-SET is not used, so there is no need in the last two moves. * And why two moves? Index: BUGS =================================================================== RCS file: /cvsroot/sbcl/sbcl/BUGS,v retrieving revision 1.256 retrieving revision 1.257 diff -u -d -r1.256 -r1.257 --- BUGS 21 Dec 2002 06:38:00 -0000 1.256 +++ BUGS 22 Dec 2002 14:19:52 -0000 1.257 @@ -1190,22 +1190,14 @@ 229: (subtypep 'function '(function)) => nil, t. -231: "SETQ does not correctly check the type of a variable being set" - (reported by Robert E. Brown sbcl-devel 2002-12-19) - in sbcl-0.7.10.19, - (DEFUN FOO (X) - (DECLARE (OPTIMIZE SAFETY) (TYPE (INTEGER 0 8) X)) - (INCF X)) - (FOO 8) - returns 9, rather than (as in CMUCL) signalling an error. Replacing - (INCF X) by (SETQ X (+ X 1)) causes a TYPE-ERROR to be signalled. Or - (defun bar (x y) - (declare (type (integer 0 8) x)) - (setq x y) - x) - Then (BAR 7 9) returns 9. +232: + (shown by Paul Dietz' test suite) + + (loop for v fixnum being each hash-key in ...) + + in 0.7.10.29 signals an error "NIL is not of type FIXNUM". + (fixed in 0.7.10.30) - (fixed in 0.7.10.28) DEFUNCT CATEGORIES OF BUGS IR1-#: Index: NEWS =================================================================== RCS file: /cvsroot/sbcl/sbcl/NEWS,v retrieving revision 1.219 retrieving revision 1.220 diff -u -d -r1.219 -r1.220 --- NEWS 21 Dec 2002 06:38:00 -0000 1.219 +++ NEWS 22 Dec 2002 14:19:52 -0000 1.220 @@ -1468,6 +1468,8 @@ of the slot symbol, rather than using the current package ((:CONC-NAME "") continues to intern the slot's name in the current package); + ** LOOP with a typed iteration variable over a hashtable now + signals a type error iff it should; * incremented fasl file version number, because of the incompatible change to the DEFSTRUCT-DESCRIPTION structure, and again because of the new implementation of DEFINE-COMPILER-MACRO. Index: version.lisp-expr =================================================================== RCS file: /cvsroot/sbcl/sbcl/version.lisp-expr,v retrieving revision 1.706 retrieving revision 1.707 diff -u -d -r1.706 -r1.707 --- version.lisp-expr 21 Dec 2002 10:53:28 -0000 1.706 +++ version.lisp-expr 22 Dec 2002 14:19:52 -0000 1.707 @@ -18,4 +18,4 @@ ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.7.10.29" +"0.7.10.30" |