+
+;;; broken inference of an upper bound of an iteration variable,
+;;; reported by Rajat Datta.
+(defun isieve (num)
+ (let ((vec (make-array num :initial-element 0))
+ (acc 0))
+ (do ((i 2 (+ i 1)))
+ ((>= i num) 'done)
+ (when (= (svref vec i) 0)
+ (do ((j (* i i) (+ j i)))
+ ((>= j num) 'done)
+ (setf (svref vec j) 1))
+ (incf acc)))
+ acc))
+
+(assert (= (isieve 46349) 4792))
+
+;;; COERCE should not be constant-folded (reported by Nikodemus
+;;; Siivola)
+(let ((f (gensym)))
+ (setf (fdefinition f) (lambda (x) x))
+ (let ((g (compile nil `(lambda () (coerce ',f 'function)))))
+ (setf (fdefinition f) (lambda (x) (1+ x)))
+ (assert (eq (funcall g) (fdefinition f)))))
+
+(let ((x (coerce '(1 11) 'vector)))
+ (incf (aref x 0))
+ (assert (equalp x #(2 11))))
+
+;;; and BIT-* too (reported by Paul F. Dietz)
+(loop with v1 = #*0011
+ and v2 = #*0101
+ for f in '(bit-and bit-andc1 bit-andc2 bit-eqv
+ bit-ior bit-nand bit-nor bit-not
+ bit-orc1 bit-orc2 bit-xor
+ )
+ for form = `(lambda ()
+ (let ((v (,f ,v1 ,v2)))
+ (setf (aref v 0) (- 1 (aref v 0)))
+ (aref v 0)))
+ for compiled-res = (funcall (compile nil form))
+ for real-res = (- 1 (aref (funcall f v1 v2) 0))
+ do (assert (equal compiled-res real-res)))
+(let* ((v #*0011)
+ (form `(lambda ()
+ (let ((v (bit-not ,v)))
+ (setf (aref v 0) (- 1 (aref v 0)))
+ (aref v 0))))
+ (compiled-res (funcall (compile nil form)))
+ (real-res (- 1 (aref (funcall (eval #'bit-not) v) 0))))
+ (assert (equal compiled-res real-res)))