X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fcompiler.pure.lisp;h=72403638c11e31b121179798bf5b7551c1a20914;hb=1422f9e5fa1d80247d809440112eb00075440a81;hp=45c22e86f0b2ca76cc13c6f55fc7caff0a1a9ca5;hpb=f10dce4be24d44e1db0fb3d5b1d3689d6caa062a;p=sbcl.git diff --git a/tests/compiler.pure.lisp b/tests/compiler.pure.lisp index 45c22e8..7240363 100644 --- a/tests/compiler.pure.lisp +++ b/tests/compiler.pure.lisp @@ -966,3 +966,171 @@ (%f11 -120429363 (%f11 62362 b))))) 6714367 9645616 -637681868) -264223548)) + +;;; Bug reported by Paul F. Dietz caused by derive type loss in VALUE +;;; transform +(assert (equal (multiple-value-list + (funcall + (compile nil '(lambda () + (declare (optimize (speed 1) (space 0) (safety 3) (debug 3) (compilation-speed 1))) + (ceiling + (ceiling + (flet ((%f16 () 0)) (%f16)))))))) + '(0 0))) + +;;; MISC.184 +(assert (zerop + (funcall + (compile + nil + '(lambda (a b c) + (declare (type (integer 867934833 3293695878) a)) + (declare (type (integer -82111 1776797) b)) + (declare (type (integer -1432413516 54121964) c)) + (declare (optimize (speed 3))) + (declare (optimize (safety 1))) + (declare (optimize (debug 1))) + (if nil + (flet ((%f15 (f15-1 &optional (f15-2 c)) + (labels ((%f1 (f1-1 f1-2) 0)) + (%f1 a 0)))) + (flet ((%f4 () + (multiple-value-call #'%f15 + (values (%f15 c 0) (%f15 0))))) + (if nil (%f4) + (flet ((%f8 (f8-1 &optional (f8-2 (%f4)) (f8-3 0)) + f8-3)) + 0)))) + 0))) + 3040851270 1664281 -1340106197))) + +;;; MISC.249 +(assert (zerop + (funcall + (compile + nil + '(lambda (a b) + (declare (notinline <=)) + (declare (optimize (speed 2) (space 3) (safety 0) + (debug 1) (compilation-speed 3))) + (if (if (<= 0) nil nil) + (labels ((%f9 (f9-1 f9-2 f9-3) + (ignore-errors 0))) + (dotimes (iv4 5 a) (%f9 0 0 b))) + 0))) + 1 2))) + +;;; MISC.259-264 (aka "CSR screwed up implementing *-MOD32") +(assert + (= (funcall + (compile + nil + '(lambda (a) + (declare (type (integer 177547470 226026978) a)) + (declare (optimize (speed 3) (space 0) (safety 0) (debug 0) + (compilation-speed 1))) + (logand a (* a 438810)))) + 215067723) + 13739018)) + +;;; bug 299 (reported by PFD) +(assert + (equal (funcall + (compile + nil + '(lambda () + (declare (optimize (debug 1))) + (multiple-value-call #'list + (if (eval t) (eval '(values :a :b :c)) nil) + (catch 'foo (throw 'foo (values :x :y))))))) + '(:a :b :c :x :y))) +;;; MISC.185 +(assert (equal + (funcall + (compile + nil + '(lambda (a b c) + (declare (type (integer 5 155656586618) a)) + (declare (type (integer -15492 196529) b)) + (declare (type (integer 7 10) c)) + (declare (optimize (speed 3))) + (declare (optimize (safety 1))) + (declare (optimize (debug 1))) + (flet ((%f3 + (f3-1 f3-2 f3-3 + &optional (f3-4 a) (f3-5 0) + (f3-6 + (labels ((%f10 (f10-1 f10-2 f10-3) + 0)) + (apply #'%f10 + 0 + a + (- (if (equal a b) b (%f10 c a 0)) + (catch 'ct2 (throw 'ct2 c))) + nil)))) + 0)) + (%f3 (%f3 (%f3 b 0 0 0) a 0) a b b b c)))) 5 0 7) + 0)) +;;; MISC.186 +(assert (eq + (eval + '(let* ((form '(labels ((%f3 (f3-1 f3-2) f3-1)) + (apply #'%f3 b (catch 'ct8 (throw 'ct8 (logeqv (%f3 c 0)))) nil))) + (vars '(b c)) + (fn1 `(lambda ,vars + (declare (type (integer -2 19) b) + (type (integer -1520 218978) c) + (optimize (speed 3) (safety 1) (debug 1))) + ,form)) + (fn2 `(lambda ,vars + (declare (notinline logeqv apply) + (optimize (safety 3) (speed 0) (debug 0))) + ,form)) + (cf1 (compile nil fn1)) + (cf2 (compile nil fn2)) + (result1 (multiple-value-list (funcall cf1 2 18886))) + (result2 (multiple-value-list (funcall cf2 2 18886)))) + (if (equal result1 result2) + :good + (values result1 result2)))) + :good)) +;;; MISC.275 +(assert + (zerop + (funcall + (compile + nil + '(lambda (b) + (declare (notinline funcall min coerce)) + (declare + (optimize (speed 1) + (space 2) + (safety 2) + (debug 1) + (compilation-speed 1))) + (flet ((%f12 (f12-1) + (coerce + (min + (if f12-1 (multiple-value-prog1 + b (return-from %f12 0)) + 0)) + 'integer))) + (funcall #'%f12 0)))) + -33))) + +;;; Discussion of a CMUCL PCL bug on Sparc with Raymond Toy revealed a +;;; potential problem: optimizers and type derivers for MAX and MIN +;;; were not consistent in treating EQUALP, but not EQL, arguments. +(dolist (f '(min max)) + (loop for complex-arg-args in '((1d0 2d0) (0d0 1d0)) + for complex-arg = `(if x ,@complex-arg-args) + do + (loop for args in `((1 ,complex-arg) + (,complex-arg 1)) + for form = `(,f ,@args) + for f1 = (compile nil `(lambda (x) ,form)) + and f2 = (compile nil `(lambda (x) (declare (notinline min max)) + ,form)) + do + (dolist (x '(nil t)) + (assert (eql (funcall f1 x) (funcall f2 x)))))))