0.8.3.71:
[sbcl.git] / tests / compiler.pure.lisp
index a5fd491..fc9124a 100644 (file)
                                              (declare (ignore x)
                                                       (ignorable y))
                                            (list u v)))))))
+
+;;; bug reported by Paul Dietz: wrong optimizer for (EXPT ... 0)
+(loop for (x type) in
+      '((14 integer)
+        (14 rational)
+        (-14/3 (rational -8 11))
+        (3s0 short-float)
+        (4f0 single-float)
+        (5d0 double-float)
+        (6l0 long-float)
+        (14 real)
+        (13/2 real)
+        (2s0 real)
+        (2d0 real)
+        (#c(-3 4) (complex fixnum))
+        (#c(-3 4) (complex rational))
+        (#c(-3/7 4) (complex rational))
+        (#c(2s0 3s0) (complex short-float))
+        (#c(2f0 3f0) (complex single-float))
+        (#c(2d0 3d0) (complex double-float))
+        (#c(2l0 3l0) (complex long-float))
+        (#c(2d0 3s0) (complex float))
+        (#c(2 3f0) (complex real))
+        (#c(2 3d0) (complex real))
+        (#c(-3/7 4) (complex real))
+        (#c(-3/7 4) complex)
+        (#c(2 3l0) complex))
+      do (dolist (zero '(0 0s0 0f0 0d0 0l0))
+           (dolist (real-zero (list zero (- zero)))
+             (let* ((src `(lambda (x) (expt (the ,type x) ,real-zero)))
+                    (fun (compile nil src))
+                    (result (1+ (funcall (eval #'*) x real-zero))))
+               (assert (eql result (funcall fun x)))))))
+
+;;; (SIGNED-BYTE 1) [ returned from the logxor derive-type optimizer ]
+;;; wasn't recognized as a good type specifier.
+(let ((fun (lambda (x y)
+            (declare (type (integer -1 0) x y) (optimize speed))
+            (logxor x y))))
+  (assert (= (funcall fun 0 0) 0))
+  (assert (= (funcall fun 0 -1) -1))
+  (assert (= (funcall fun -1 -1) 0)))
+
+;;; from PFD's torture test, triggering a bug in our effective address
+;;; treatment.
+(compile
+ nil
+ `(lambda (a b)
+    (declare (type (integer 8 22337) b))
+    (logandc2
+     (logandc2
+      (* (logandc1 (max -29303 b) 4) b)
+      (abs (logorc1 (+ (logandc1 -11 b) 2607688420) -31153924)))
+     (logeqv (max a 0) b))))
+
+;;; Alpha floating point modes weren't being reset after an exception,
+;;; leading to an exception on the second compile, below.
+(compile nil '(lambda (x y) (declare (type (double-float 0.0d0) x y)) (/ x y)))
+(handler-case (/ 1.0 0.0)
+  ;; provoke an exception
+  (arithmetic-error ()))
+(compile nil '(lambda (x y) (declare (type (double-float 0.0d0) x y)) (/ x y)))
+
+;;; bug reported by Paul Dietz: component last block does not have
+;;; start ctran
+(compile nil
+         '(lambda ()
+           (declare (notinline + logand)
+            (optimize (speed 0)))
+           (LOGAND
+            (BLOCK B5
+              (FLET ((%F1 ()
+                       (RETURN-FROM B5 -220)))
+                (LET ((V7 (%F1)))
+                  (+ 359749 35728422))))
+            -24076)))