234:
(fixed in sbcl-0.7.10.36)
+235: "type system and inline expansion"
+ a.
+ (declaim (ftype (function (cons) number) acc))
+ (declaim (inline acc))
+ (defun acc (c)
+ (the number (car c)))
+
+ (defun foo (x y)
+ (values (locally (declare (optimize (safety 0)))
+ (acc x))
+ (locally (declare (optimize (safety 3)))
+ (acc y))))
+
+ (foo '(nil) '(t)) => NIL, T.
+
+ b. (reported by brown on #lisp 2003-01-21)
+
+ (defun find-it (x)
+ (declare (optimize (speed 3) (safety 0)))
+ (declare (notinline mapcar))
+ (let ((z (mapcar #'car x)))
+ (find 'foobar z)))
+
+ Without (DECLARE (NOTINLINE MAPCAR)), Python cannot derive that Z is
+ LIST.
+
DEFUNCT CATEGORIES OF BUGS
IR1-#:
These labels were used for bugs related to the old IR1 interpreter.
+#1
(defun mysl (s)
(declare (simple-string s))
(declare (optimize (speed 3) (safety 0) (debug 0)))
4: MOVE t23[EAX] => t24[EBX]
--------------------------------------------------------------------------------
+#2
(defun quux (v)
(declare (optimize (speed 3) (safety 0) (space 2) (debug 0)))
(declare (type (simple-array double-float 1) v))
and emits costy MOVE ... => FR1.
--------------------------------------------------------------------------------
+#3
(defun bar (n)
(declare (optimize (speed 3) (safety 0) (space 2))
(type fixnum n))
* IR1 does not optimize away (MAKE-LIST N).
--------------------------------------------------------------------------------
+#4
(defun bar (v1 v2)
(declare (optimize (speed 3) (safety 0) (space 2))
(type (simple-array base-char 1) v1 v2))
* And why two moves?
--------------------------------------------------------------------------------
+#5
(loop repeat 1.5)
uses generic arithmetic
--------------------------------------------------------------------------------
+#6
09:49:05 <jtra> I have found a case in those where suboptimal code is
generate with nested loops, it might be moderately easy to fix that
09:49:28 <jtra> see
(incf x)))))))
(format t "~A~%" x)))
--------------------------------------------------------------------------------
+#7
(defun foo (x)
(declare (optimize speed (debug 0)))
(if (< x 0) x (foo (1- x))))
SBCL generates a full call of FOO (but CMUCL does not).
--------------------------------------------------------------------------------
+#8
(defun foo (d)
(declare (optimize (speed 3) (safety 0) (debug 0)))
(declare (type (double-float 0d0 1d0) d))
DOUBLE-FLOAT. Unhopefully, IR1 does not optimize away effectless
SETs/bindings, and IR2 does not perform type inference.
--------------------------------------------------------------------------------
+#9
(defun foo (x)
(if (= (cond ((irgh x) 0)
((buh x) 1)
((buh x) :no)
(t :no)))
--------------------------------------------------------------------------------
+#10
+Reported by Robert E. Brown on sbcl-devel 2003-01-21:
+
+(defstruct trace-info
+ (foo nil :type (or null function)))
+
+(defun bad (x)
+ (declare (optimize (speed 3) (safety 0)))
+ (let ((wow (trace-info-foo x)))
+ (or (not wow) (funcall wow 1 2 3))))
+
+Python does not derive that FUNCALL is applied to FUNCTION.
+
+(OR ...) is equivalent to
+
+(LET ((G2407 (NOT WOW)))
+ (IF G2407 G2407 (FUNCALL WOW 1 2 3)))
+
+or to
+
+(LET ((G2407 (IF WOW NIL T)))
+ (IF G2407 G2407 (FUNCALL WOW 1 2 3)))
+
+so this is similar to #9.
+--------------------------------------------------------------------------------