1 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; While most of SBCL is derived from the CMU CL system, the test
5 ;;;; files (like this one) were written from scratch after the fork
8 ;;;; This software is in the public domain and is provided with
9 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
10 ;;;; more information.
12 ;;;; This file of tests was added because the tests in 'compiler.pure.lisp'
13 ;;;; are a total hodgepodge- there is often no hugely compelling reason for
14 ;;;; their being tests of the compiler per se, such as whether
15 ;;;; INPUT-ERROR-IN-COMPILED-FILE is a subclass of SERIOUS-CONDITION;
16 ;;;; in addition to which it is near impossible to wade through the
17 ;;;; ton of nameless, slow, and noisy tests.
20 (with-test (:name
:base-char-p
)
22 (equal (sb-kernel:%simple-fun-type
25 (if (sb-kernel:base-char-p x
)
28 '(function (t) (values (member t
) &optional
)))))
30 (with-test (:name
:setq-eql
)
32 (equal (sb-kernel:%simple-fun-type
34 '(lambda (x) (let (y) (setq y x
) (eql y x
)))))
35 '(function (t) (values (member t
) &optional
)))))
37 (with-test (:name
:setq-lvar-substition
)
38 (checked-compile-and-assert
41 (declare ((integer 0 10) a
)
49 (with-test (:name
:number-comparisons
)
51 (equal (sb-kernel:%simple-fun-type
55 (typep a
'(integer 0 10))
57 '(function (t) (values null
&optional
))))
59 (equal (sb-kernel:%simple-fun-type
63 (typep a
'(integer 0 10))
65 '(function (t) (values null
&optional
)))))
67 (with-test (:name
:=-constraint-complex-no-bounds
)
68 (checked-compile-and-assert
77 (with-test (:name
:compare-both-operands
)
78 (checked-compile-and-assert
81 (declare (type real a b
))
90 (with-test (:name
:eql-constant
)
92 (equal (third (sb-kernel:%simple-fun-type
95 (declare ((integer 0) i
))
100 '(values (integer 2) &optional
))))
102 (with-test (:name
:ir1-phases-delay
)
104 (equal (third (sb-kernel:%simple-fun-type
107 (when (typep n
'fixnum
)
108 (let ((ar (if (integerp n
)
111 (declare (type vector ar
))
113 (array-has-fill-pointer-p ar
)))))))
114 '(values null
&optional
))))
116 (with-test (:name
:--sign
)
118 (equal (third (sb-kernel:%simple-fun-type
121 (declare (integer x y
))
125 '(values (integer * 0) &optional
))))
127 (with-test (:name
:--type
)
129 (equal (third (sb-kernel:%simple-fun-type
135 '(values real
&optional
))))
137 (with-test (:name
:remove-equivalent-blocks-clear-constraints
)
138 (checked-compile-and-assert
141 (declare ((and fixnum unsigned-byte
) a
)
150 (with-test (:name
:type-constraint-joining
)
152 (type-specifiers-equal
154 (sb-kernel:%simple-fun-type
162 '(values (or (integer 5 5) (integer 3 3)) &optional
))))
164 (with-test (:name
:type-constraint-joining
.2)
166 (type-specifiers-equal
168 (sb-kernel:%simple-fun-type
175 '(values (or float integer
) &optional
))))
177 (with-test (:name
:type-constraint-joining
.3)
179 (type-specifiers-equal
181 (sb-kernel:%simple-fun-type
186 (setq x
(random 10.0)))
188 '(values (or (single-float 0.0 (10.0
)) (mod 10)) &optional
))))
190 (with-test (:name
:type-constraint-joining-terminates
)
194 (do* ((block (sb-c::vop-block vop
) (sb-c::ir2-block-prev block
))
195 (last vop
(sb-c::ir2-block-last-vop block
)))
197 (sb-c::aver
(eq (sb-c::ir2-block-block block
) (sb-c::ir2-block-block
(sb-c::vop-block vop
))))
198 (do ((current last
(sb-c::vop-prev current
)))
200 (when (eq (sb-c::vop-name current
) name
)
201 (return-from foo current
))))))))
203 (with-test (:name
:type-constraint-joining-conflicts
)
210 (1 (setq x
(random 10)))
211 (2 (setq x
(make-array 10)))
212 (3 (setq x
(make-hash-table))))
214 :allow-warnings t
))))
216 (with-test (:name
:type-constraint-joining.eql
)
219 (sb-kernel:%simple-fun-type
226 '(values (integer 1 2) &optional
))))
228 (with-test (:name
:type-constraint-joining.
</=)
231 (sb-kernel:%simple-fun-type
234 (declare (integer x
))
238 (t (error ""))) x
))))
244 (with-test (:name
:type-constraint-joining.
</=.2)
247 (sb-kernel:%simple-fun-type
250 (if (typep x
'rational
)
263 (with-test (:name
:type-constraint-joining.
</=.3)
266 (sb-kernel:%simple-fun-type
274 (double-float * (10.0d0
))
275 (single-float * (10.0
))
279 (with-test (:name
:type-constraint-joining.
>/=)
282 (sb-kernel:%simple-fun-type
285 (declare (integer x
))
289 (t (error ""))) x
))))
295 (with-test (:name
:type-constraint-joining.complement
)
298 (sb-kernel:%simple-fun-type
302 (cond ((typep x
'integer
)
305 (cond ((typep x
'float
)
309 '(values (not integer
) &optional
))))
311 (with-test (:name
(:type-constraint-joining
:infinities
1))
314 (sb-kernel:%simple-fun-type
317 (declare (type (or number null
) number
))
318 (cond ((null number
) nil
)
319 ((sb-ext:float-nan-p number
) :nan
)
320 ((= number sb-ext
:double-float-positive-infinity
) :inf
)
321 ((= number sb-ext
:double-float-negative-infinity
) :-inf
)
323 '(values (or (member nil
:nan
:inf
:-inf
) float
) &optional
))))
325 (with-test (:name
(:type-constraint-joining
:infinities
2))
328 (sb-kernel:%simple-fun-type
331 (declare (type (or number null
) number
))
332 (cond ((null number
) nil
)
333 ((sb-ext:float-nan-p number
) :nan
)
334 ((= number sb-ext
:double-float-positive-infinity
) number
)
335 ((= number sb-ext
:double-float-negative-infinity
) number
)
337 `(values (or (single-float ,sb-ext
:single-float-negative-infinity
338 ,sb-ext
:single-float-negative-infinity
)
339 (double-float ,sb-ext
:double-float-negative-infinity
340 ,sb-ext
:double-float-negative-infinity
)
341 (single-float ,sb-ext
:single-float-positive-infinity
342 ,sb-ext
:single-float-positive-infinity
)
343 (double-float ,sb-ext
:double-float-positive-infinity
344 ,sb-ext
:double-float-positive-infinity
)
345 (member nil
:nan
:number
))
348 (with-test (:name
(:type-constraint-joining
:infinities
3))
351 (sb-kernel:%simple-fun-type
354 (declare (type (or number null
) number
))
355 (cond ((null number
) nil
)
356 ((sb-ext:float-nan-p number
) :nan
)
357 ((eql number sb-ext
:double-float-positive-infinity
) number
)
358 ((eql number sb-ext
:double-float-negative-infinity
) number
)
360 `(values (or (double-float ,sb-ext
:double-float-negative-infinity
361 ,sb-ext
:double-float-negative-infinity
)
362 (double-float ,sb-ext
:double-float-positive-infinity
363 ,sb-ext
:double-float-positive-infinity
)
364 (member nil
:nan
:number
))
367 (with-test (:name
:debug-vars
)
370 (sb-kernel:%simple-fun-type
373 (declare (optimize (debug 2)))
378 `(values (integer 30 30) &optional
))))
380 (with-test (:name
:vector-length-constraints
)
383 (sb-kernel:%simple-fun-type
386 (declare (simple-vector x
))
387 (when (< (length x
) y
)
388 (> (length x
) y
))))))
389 `(values null
&optional
)))
392 (sb-kernel:%simple-fun-type
396 (when (< (length x
) y
)
397 (> (length x
) y
))))))
398 `(values boolean
&optional
))))
400 (with-test (:name
:non-commutative-invert
)
403 (sb-kernel:%simple-fun-type
409 `(values (member t
) &optional
)))
412 (sb-kernel:%simple-fun-type
418 `(values null
&optional
))))
420 (with-test (:name
:=-real
)
423 (sb-kernel:%simple-fun-type
426 (declare ((real 10 20) b
))
430 `(values (or (real 10 20) (complex (rational 10 20)) (complex (single-float 10.0 20.0))
431 (complex (double-float 10.0d0
20.0d0
))) &optional
)))
434 (sb-kernel:%simple-fun-type
442 `(values (integer 10 20) &optional
)))
445 (sb-kernel:%simple-fun-type
448 (declare ((real 10 20) b
))
452 `(values (real (10)) &optional
))))
454 (with-test (:name
:<=-constraints
)
455 (checked-compile-and-assert
464 (with-test (:name
:vector-length-derive-type
)
466 (checked-compile-and-assert
469 (declare ((or (vector t
2) (member #\
@ ,s
)) x
))
470 (typep x
'(string 1)))
473 (with-test (:name
:constant-refs
)
474 (checked-compile-and-assert
477 (let ((m 2301453501242805283))
482 (:return-type
(values (member t
) &optional
))))
484 (with-test (:name
:constant-refs
.2)
485 (checked-compile-and-assert
488 (if (<= -
3483114449144072 v
)
490 (if (>= -
3483114449144072 v
)
494 ((-3483114449144073) 1)
495 (:return-type
(values bit
&optional
))))
497 (with-test (:name
:array-has-fill-pointer-p-constraint
)
499 (type-specifiers-equal
501 (sb-kernel:%simple-fun-type
504 (if (array-has-fill-pointer-p s
)
507 '(values array
&optional
))))
509 (with-test (:name
:+integer-argument-constraint.var
)
511 (type-specifiers-equal
513 (sb-kernel:%simple-fun-type
518 (aref a
(+ m
(aref a m
)))
520 `(values (integer ,(1+ most-negative-fixnum
)
521 ,(+ most-positive-fixnum array-dimension-limit
))
524 (with-test (:name
:+integer-argument-constraint.typep
)
526 (type-specifiers-equal
528 (sb-kernel:%simple-fun-type
535 '(values integer
&optional
))))
537 (with-test (:name
:truncate-zero-remainder
)
539 (type-specifiers-equal
541 (sb-kernel:%simple-fun-type
544 (declare (integer x y
))
545 (multiple-value-bind (q r
) (truncate x y
)
549 '(values (or (integer * -
1) (integer 1)) &optional
))))
551 (with-test (:name
:vector-length-var
)
553 (type-specifiers-equal
555 (sb-kernel:%simple-fun-type
558 (declare (simple-vector x
))
559 (if (< 3 (length x
) 5)
562 '(values (integer 4 4) &optional
))))
564 (with-test (:name
:ash
)
566 (type-specifiers-equal
568 (sb-kernel:%simple-fun-type
571 (declare ((integer 1) x
))
572 (let ((d (ash x -
1)))
574 '(values (member t
) &optional
)))
576 (type-specifiers-equal
578 (sb-kernel:%simple-fun-type
581 (declare ((integer 1) x
))
582 (let ((d (ash x -
1)))
585 '(values (member t
) &optional
)))
587 (type-specifiers-equal
589 (sb-kernel:%simple-fun-type
592 (declare (unsigned-byte x
)
596 '(values null
&optional
))))
598 (with-test (:name
:/)
601 (declare ((integer 1) x
))
602 (let ((d (truncate x
4)))
607 (declare ((integer 0) x y
))
613 (declare ((integer 1) a b
))
618 (declare (integer x y
))
619 (if (plusp (rem x y
))
624 (with-test (:name
:negate-
<)
626 (type-specifiers-equal
628 (sb-kernel:%simple-fun-type
631 (declare (type integer a
)
636 '(values (integer -
2) &optional
))))
638 (with-test (:name
:eq-vector-lengths
)
640 (type-specifiers-equal
642 (sb-kernel:%simple-fun-type
645 (declare (simple-vector a b
)
647 (optimize (debug 1)))
648 (when (and (= (length a
) (length b
))
651 '(values (or null
(integer 10 20)) &optional
))))
653 (with-test (:name
:+>)
668 (declare (integer a b
)
677 (declare (integer a b
)
686 (declare (integer a b
)
694 (with-test (:name
:-
>)
698 (optimize (debug 2)))
704 (declare (simple-vector v
)
705 (optimize (debug 2)))
706 (let ((l (1- (length v
))))
712 (optimize (debug 1)))
718 (declare (simple-vector v
)
719 (optimize (debug 1)))
720 (let ((l (1- (length v
))))
724 (with-test (:name
:sub-sign
)
727 (declare (unsigned-byte x
))
728 (- x
(truncate x
2)))
731 (with-test (:name
:equal
)
757 (with-test (:name
:bounds-check-constants
)
758 (assert (= (count 'sb-kernel
:%check-bound
761 (declare (simple-vector v
))
762 (setf (aref v
0) (aref v
1)))
766 (with-test (:name
:bounds-check-constants-svref
)
767 (assert (= (count 'sb-kernel
:%check-bound
775 (with-test (:name
:bounds-check-variable-svref
)
776 (assert (= (count 'sb-kernel
:%check-bound
784 (with-test (:name
:bounds-check-length
)
785 (assert (= (count 'sb-kernel
:%check-bound
788 (when (< x
(length y
))
793 (with-test (:name
:bounds-check-length
)
794 (assert (= (count 'sb-kernel
:%check-bound
797 (declare (simple-vector v
)
798 (optimize (debug 2)))
799 (loop for i below
(1- (length v
))
803 (assert (= (count 'sb-kernel
:%check-bound
806 (declare (simple-vector v
)
807 (optimize (debug 1)))
808 (loop for i below
(1- (length v
))
814 (with-test (:name
:bounds-check-min-length
)
815 (assert (= (count 'sb-kernel
:%check-bound
820 (optimize (debug 2)))
821 (loop for i below
(min x
(1- (length v
)))
825 (assert (= (count 'sb-kernel
:%check-bound
830 (loop for i below
(min x
(length v
))
834 (assert (= (count 'sb-kernel
:%check-bound
837 (declare (simple-vector v
))
838 (loop for i below
(min x
(length v
))
843 (with-test (:name
:bounds-check-make-array
)
844 (assert (= (count 'sb-kernel
:%check-bound
847 (declare (integer length
))
848 (let ((array (make-array length
)))
849 (loop for i below length
850 do
(setf (aref array i
) i
))))
853 (assert (= (count 'sb-kernel
:%check-bound
856 (let ((array (make-array length
)))
857 (loop for i below length
858 do
(setf (aref array i
) i
))))
861 (assert (= (count 'sb-kernel
:%check-bound
863 `(lambda (type length
)
864 (let ((array (make-sequence type length
)))
865 (loop for i below length
866 do
(setf (aref array i
) i
))))
870 (with-test (:name
:bounds-check-down
)
871 (assert (= (count 'sb-kernel
:%check-bound
874 (let ((end (1- (length v
))))
880 (assert (= (count 'sb-kernel
:%check-bound
883 (declare (optimize (debug 2)))
884 (let ((end (1- (length v
))))
890 (assert (= (count 'sb-kernel
:%check-bound
893 (loop for i from
(1- (length v
)) downto
0
894 collect
(svref v i
)))
897 (assert (= (count 'sb-kernel
:%check-bound
900 (declare (optimize (debug 2)))
901 (loop for i from
(1- (length v
)) downto
0
902 collect
(svref v i
)))
906 (with-test (:name
:reoptimize
)
917 (optimize (debug 1)))
921 (or (integer 6) null
)))
923 (with-test (:name
:+back
)
936 (when (integerp (+ x y
))
942 (when (integerp (+ x y
))
947 (when (integerp (+ x
1))
952 (when (typep (+ x
3) '(integer 0 20))
954 (or (integer -
3 17) null
))
957 (declare ((real 2 4) m
)
959 (when (typep (+ m x
) '(integer 2 4))
961 (or (integer -
2 2) null
)))
963 (with-test (:name
:-back
)
966 (when (typep (- x
4) '(integer 0 10))
968 (or (integer 4 14) null
))
971 (when (typep (- 3 x
) '(integer 0 10))
973 (or (integer -
7 3) null
))
980 (with-test (:name
:*back
)
983 (when (typep (* x
4) '(integer 0 10))
985 (or (rational 0 5/2) null
))
988 (declare ((real 0 3) m
))
989 (when (typep (* x m
) '(integer 0 10))
1001 (when (typep (* x m
) 'integer
)
1003 (or rational null
)))
1005 (with-test (:name
:ignore-hairy-types
)
1008 (declare (optimize (debug 2)))
1009 (let ((v (the (satisfies eval
) a
)))
1018 (v1 (the (satisfies eval
) (setf d
1))))
1020 (loop sum
(if (> (if (<= 220 d
)
1028 (with-test (:name
:set-constraint
)
1031 (when (> (decf x
10) 10)
1033 (or (real (10)) null
)))
1035 (with-test (:name
:set-constraint-inherit
)
1036 (checked-compile-and-assert
1039 (declare (type (integer 1 1625159256) b
))
1041 (logorc1 (setf c
1448416540835)
1046 -
197521449755177454)
1048 (decf v2
(incf v2
(incf v6
(setq v2
(setq b
1044756040))))))))
1050 ((572837281 0) -
1448416540836)))
1052 (with-test (:name
:float-eql-bits
)
1055 (declare (type double-float number
))
1056 (cond ((eql number
1d0
) number
)))
1057 (or (eql 1.0d0
) null
)))
1059 (with-test (:name
:constraint-amount
)
1060 (assert (= (count 'sb-kernel
:%check-bound
1061 (ctu:ir1-named-calls
1063 (loop for i below
(- (length v
) 2) by
2
1064 sum
(svref v
(1+ i
))))
1067 (assert (= (count 'sb-kernel
:%check-bound
1068 (ctu:ir1-named-calls
1070 (loop for i from
(- (length v
) 2) downto
0
1071 collect
(svref v
(1+ i
))))
1074 (checked-compile-and-assert
1077 (declare (type fixnum a
))
1078 (let ((j (+ a most-positive-fixnum
)))
1085 (with-test (:name
:constraint-multiple-eql-variables
)
1088 (declare (integer x y
)
1089 (optimize (debug 2)))
1094 (with-test (:name
:dead-blocks
)
1097 (declare ((integer -
31307831194 26651266057) c
))
1106 (loop for lv2 below
1
1112 (with-test (:name
:dead-blocks
.2)
1113 (checked-compile `(lambda (a b
)
1114 (declare (type (integer 0 171951449) a
)
1115 ((member -
1965785401190741689 18014398509481983) b
)
1116 (optimize (debug 2)))
1118 (v6 116510974941639))
1121 (let ((v3 (logand a v3
)))
1122 (loop for lv1 below
3
1123 count
(let ((v8 (min lv1 v3
)))
1124 (<= v8
576460752303423490))))))))))
1126 (with-test (:name
:multiple-equality-constraints
)
1129 (declare (simple-vector v
))
1130 (let* ((i (1- (length v
))))
1131 (declare (fixnum i
))
1134 (print (aref v i
)))))))
1136 (with-test (:name
:min
/max-constraints-set
)
1137 (checked-compile-and-assert
1144 (y (setq a
(min most-positive-fixnum b
))))
1149 (with-test (:name
:mod
)
1150 (assert (= (count 'sb-kernel
:%check-bound
1151 (ctu:ir1-named-calls
1153 (svref v
(mod i
(length v
))))
1157 (with-test (:name
:index-ranges
)
1158 (assert (= (count 'sb-kernel
:%check-bound
1159 (ctu:ir1-named-calls
1161 (when (= (length a
) 2)
1165 (assert (= (count 'sb-kernel
:%check-bound
1166 (ctu:ir1-named-calls
1168 (declare ((integer 2 3) l
)
1170 (when (= (length a
) l
)
1175 (with-test (:name
:constant-vector
)
1176 (assert (= (count 'sb-kernel
:%check-bound
1177 (ctu:ir1-named-calls
1179 (declare (fixnum x
))
1185 (with-test (:name
:map-equality-constraints
)
1186 (checked-compile-and-assert
1189 (declare (notinline identity
)
1191 (dotimes (e 3 (identity (logior c
10 (- d -
6 e
))))))
1195 (with-test (:name
:local-call
)
1200 (declare (notinline b
))
1206 (with-test (:name
:set-vars-equal
)
1210 (eq a
(progn (loop repeat a do
(print 20)) a
)))
1212 (checked-compile-and-assert
1215 (logxor (unwind-protect a
(setq a
7)) a
))
1219 (with-test (:name
:set-vars-equal-leaf-change
)
1220 (checked-compile-and-assert
1223 (declare (integer b
))
1225 (decf c
(shiftf b b
))))
1229 (with-test (:name
:all-var-values
)
1232 (declare (optimize (safety 0)))
1233 (loop for lv3 below
1
1235 (loop for lv4 below
3
1239 (the integer
(catch 'ct4
16385)))))))
1241 (with-test (:name
:cons-cells
)
1267 (with-test (:name
:char-code
)
1270 (let ((n (char-code x
)))
1271 (when (or (< 31 n
127) (= n
10))
1273 (or null standard-char
))
1276 (declare (optimize (debug 2)))
1277 (when (standard-char-p x
)
1279 (or null standard-char
)))
1281 (with-test (:name
:vector-length-alias
)
1282 (checked-compile-and-assert
1285 (or (typep x
'(integer 3 3))
1286 (typep x
'(simple-array character
(3)))))
1292 (with-test (:name
:eql-var-replacement
)
1293 (checked-compile-and-assert
1297 ((simple-array double-float
(*)) y
))
1298 (let ((d (aref y
0)))
1302 ((1d0 (make-array 1 :element-type
'double-float
:initial-element
1d0
)) 1d0
:test
#'equal
)
1303 ((1d0 (make-array 1 :element-type
'double-float
:initial-element
0d0
)) nil
)
1304 ((0d0 (make-array 1 :element-type
'double-float
:initial-element
1d0
)) nil
)
1305 ((0d0 (make-array 1 :element-type
'double-float
:initial-element
0d0
)) nil
)))
1307 (with-test (:name
:eql-var-initial-unused
)
1308 (checked-compile-and-assert
1311 (declare (type (integer -
5) p3
))
1312 (let ((n (the (integer 0) p3
)))
1313 (setq n
(dpb p1
(byte p2
35) n
))
1315 ((1 2 3) 34359738371)))
1317 (with-test (:name
:%in-bounds-constraint-not-eq
)
1318 (checked-compile-and-assert
1321 (declare (fixnum n
) (simple-vector sv
))
1322 (let ((found (find key sv
:end n
)))
1323 (if (< n
(length sv
))
1328 ((#(1 2 3) 4 3) nil
)))
1330 (with-test (:name
:characters
)
1333 (cond ((eql c
#\a) 1)
1339 (cond ((eql c
#\a) 1)
1345 (with-test (:name
:multiply-by-one
)
1348 (the (unsigned-byte 8) (* x
1))