Make *uncompacted-fun-maps* synchronized.
[sbcl.git] / tests / constraint.pure.lisp
blobf4d0b60c516fe890e2e1d58e74ff35e6cb713873
1 ;;;; This software is part of the SBCL system. See the README file for
2 ;;;; more information.
3 ;;;;
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
6 ;;;; from CMU CL.
7 ;;;;
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.
19 #+sb-unicode
20 (with-test (:name :base-char-p)
21 (assert
22 (equal (sb-kernel:%simple-fun-type
23 (checked-compile
24 '(lambda (x)
25 (if (sb-kernel:base-char-p x)
26 (characterp x)
27 t))))
28 '(function (t) (values (member t) &optional)))))
30 (with-test (:name :setq-eql)
31 (assert
32 (equal (sb-kernel:%simple-fun-type
33 (checked-compile
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
40 `(lambda (a b)
41 (declare ((integer 0 10) a)
42 (fixnum b))
43 (let ((c b))
44 (setq b a)
45 (eql c b)))
46 ((0 2) nil)
47 ((0 0) t)))
49 (with-test (:name :number-comparisons)
50 (assert
51 (equal (sb-kernel:%simple-fun-type
52 (checked-compile
53 '(lambda (a)
54 (if (< a 0)
55 (typep a '(integer 0 10))
56 nil))))
57 '(function (t) (values null &optional))))
58 (assert
59 (equal (sb-kernel:%simple-fun-type
60 (checked-compile
61 '(lambda (a)
62 (if (= a 30)
63 (typep a '(integer 0 10))
64 nil))))
65 '(function (t) (values null &optional)))))
67 (with-test (:name :=-constraint-complex-no-bounds)
68 (checked-compile-and-assert
70 `(lambda (p)
71 (let ((x #c(1 2)))
72 (when (= x p)
73 x)))
74 ((#c(1 2)) #c(1 2))
75 ((#c(2 1)) nil)))
77 (with-test (:name :compare-both-operands)
78 (checked-compile-and-assert
80 `(lambda (a b)
81 (declare (type real a b))
82 (if (>= a a)
83 (if (= b a)
86 t))
87 ((0 1) 2)
88 ((1 1) 1)))
90 (with-test (:name :eql-constant)
91 (assert
92 (equal (third (sb-kernel:%simple-fun-type
93 (checked-compile
94 '(lambda (i)
95 (declare ((integer 0) i))
96 (cond
97 ((= i 0) 3)
98 ((= i 1) 3)
99 (t i))))))
100 '(values (integer 2) &optional))))
102 (with-test (:name :ir1-phases-delay)
103 (assert
104 (equal (third (sb-kernel:%simple-fun-type
105 (checked-compile
106 '(lambda (n z)
107 (when (typep n 'fixnum)
108 (let ((ar (if (integerp n)
109 (make-array n)
110 z)))
111 (declare (type vector ar))
112 (print ar)
113 (array-has-fill-pointer-p ar)))))))
114 '(values null &optional))))
116 (with-test (:name :--sign)
117 (assert
118 (equal (third (sb-kernel:%simple-fun-type
119 (checked-compile
120 '(lambda (x y)
121 (declare (integer x y))
122 (if (<= x y)
123 (- x y)
124 -10)))))
125 '(values (integer * 0) &optional))))
127 (with-test (:name :--type)
128 (assert
129 (equal (third (sb-kernel:%simple-fun-type
130 (checked-compile
131 '(lambda (x y)
132 (if (> x y)
133 (- x y)
134 1)))))
135 '(values real &optional))))
137 (with-test (:name :remove-equivalent-blocks-clear-constraints)
138 (checked-compile-and-assert
140 `(lambda (a c)
141 (declare ((and fixnum unsigned-byte) a)
142 (fixnum c))
143 (eql c
144 (if (eql a c)
146 a)))
147 ((3 1) nil)
148 ((3 3) t)))
150 (with-test (:name :type-constraint-joining)
151 (assert
152 (type-specifiers-equal
153 (caddr
154 (sb-kernel:%simple-fun-type
155 (checked-compile
156 `(lambda ()
157 (let ((x 'foo))
158 (if (read)
159 (setq x 3)
160 (setq x 5))
161 x)))))
162 '(values (or (integer 5 5) (integer 3 3)) &optional))))
164 (with-test (:name :type-constraint-joining.2)
165 (assert
166 (type-specifiers-equal
167 (caddr
168 (sb-kernel:%simple-fun-type
169 (checked-compile
170 `(lambda (x)
171 (etypecase x
172 (integer (read))
173 (float (read)))
174 x))))
175 '(values (or float integer) &optional))))
177 (with-test (:name :type-constraint-joining.3)
178 (assert
179 (type-specifiers-equal
180 (caddr
181 (sb-kernel:%simple-fun-type
182 (checked-compile
183 `(lambda (x)
184 (if (read)
185 (setq x (random 10))
186 (setq x (random 10.0)))
187 x))))
188 '(values (or (single-float 0.0 (10.0)) (mod 10)) &optional))))
190 (with-test (:name :type-constraint-joining-terminates)
191 (checked-compile
192 `(lambda (name vop)
193 (block foo
194 (do* ((block (sb-c::vop-block vop) (sb-c::ir2-block-prev block))
195 (last vop (sb-c::ir2-block-last-vop block)))
196 (nil)
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)))
199 ((null current))
200 (when (eq (sb-c::vop-name current) name)
201 (return-from foo current))))))))
203 (with-test (:name :type-constraint-joining-conflicts)
204 (assert (nth-value
206 (checked-compile
207 '(lambda (y)
208 (let ((x 'foo))
209 (ecase y
210 (1 (setq x (random 10)))
211 (2 (setq x (make-array 10)))
212 (3 (setq x (make-hash-table))))
213 (symbol-name x)))
214 :allow-warnings t))))
216 (with-test (:name :type-constraint-joining.eql)
217 (assert
218 (equal (caddr
219 (sb-kernel:%simple-fun-type
220 (checked-compile
221 `(lambda (x)
222 (ecase x
223 (1 (read))
224 (2 (read)))
225 x))))
226 '(values (integer 1 2) &optional))))
228 (with-test (:name :type-constraint-joining.</=)
229 (assert
230 (ctype= (caddr
231 (sb-kernel:%simple-fun-type
232 (checked-compile
233 `(lambda (x)
234 (declare (integer x))
235 (cond ((= x 20))
236 ((< x 5))
237 ((< x 10))
238 (t (error ""))) x))))
239 '(values (or
240 (integer * 9)
241 (integer 20 20))
242 &optional))))
244 (with-test (:name :type-constraint-joining.</=.2)
245 (assert
246 (ctype= (caddr
247 (sb-kernel:%simple-fun-type
248 (checked-compile
249 `(lambda (x)
250 (if (typep x 'rational)
251 (cond ((= x 20))
252 ((< x 5))
253 ((< x 10))
254 (t (error "")))
255 (setf x :foo))
256 x))))
257 '(values (or
258 (integer 20 20)
259 (rational * (10))
260 (member :foo))
261 &optional))))
263 (with-test (:name :type-constraint-joining.</=.3)
264 (assert
265 (ctype= (caddr
266 (sb-kernel:%simple-fun-type
267 (checked-compile
268 `(lambda (x)
269 (cond ((< x 5))
270 ((< x 10))
271 (t (error "")))
272 x))))
273 '(values (or
274 (double-float * (10.0d0))
275 (single-float * (10.0))
276 (rational * (10)))
277 &optional))))
279 (with-test (:name :type-constraint-joining.>/=)
280 (assert
281 (ctype= (caddr
282 (sb-kernel:%simple-fun-type
283 (checked-compile
284 `(lambda (x)
285 (declare (integer x))
286 (cond ((= x 5))
287 ((> x 20))
288 ((> x 10))
289 (t (error ""))) x))))
290 '(values (or
291 (integer 11)
292 (integer 5 5))
293 &optional))))
295 (with-test (:name :type-constraint-joining.complement)
296 (assert
297 (equal (caddr
298 (sb-kernel:%simple-fun-type
299 (checked-compile
300 `(lambda (x)
301 (if (read)
302 (cond ((typep x 'integer)
303 (error ""))
304 (t (print "")))
305 (cond ((typep x 'float)
306 (print ""))
307 (t (error ""))))
308 x))))
309 '(values (not integer) &optional))))
311 (with-test (:name (:type-constraint-joining :infinities 1))
312 (assert
313 (ctype= (caddr
314 (sb-kernel:%simple-fun-type
315 (checked-compile
316 `(lambda (number)
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)
322 (number))))))
323 '(values (or (member nil :nan :inf :-inf) float) &optional))))
325 (with-test (:name (:type-constraint-joining :infinities 2))
326 (assert
327 (ctype= (caddr
328 (sb-kernel:%simple-fun-type
329 (checked-compile
330 `(lambda (number)
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)
336 (t :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))
346 &optional))))
348 (with-test (:name (:type-constraint-joining :infinities 3))
349 (assert
350 (ctype= (caddr
351 (sb-kernel:%simple-fun-type
352 (checked-compile
353 `(lambda (number)
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)
359 (t :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))
365 &optional))))
367 (with-test (:name :debug-vars)
368 (assert
369 (ctype= (caddr
370 (sb-kernel:%simple-fun-type
371 (checked-compile
372 `(lambda (a)
373 (declare (optimize (debug 2)))
374 (let ((x (eq a 30)))
375 (if x
377 (error "")))))))
378 `(values (integer 30 30) &optional))))
380 (with-test (:name :vector-length-constraints)
381 (assert
382 (ctype= (caddr
383 (sb-kernel:%simple-fun-type
384 (checked-compile
385 `(lambda (x y)
386 (declare (simple-vector x))
387 (when (< (length x) y)
388 (> (length x) y))))))
389 `(values null &optional)))
390 (assert
391 (ctype= (caddr
392 (sb-kernel:%simple-fun-type
393 (checked-compile
394 `(lambda (x y)
395 (declare (vector x))
396 (when (< (length x) y)
397 (> (length x) y))))))
398 `(values boolean &optional))))
400 (with-test (:name :non-commutative-invert)
401 (assert
402 (ctype= (caddr
403 (sb-kernel:%simple-fun-type
404 (checked-compile
405 `(lambda (x y)
406 (if (< x y)
407 (> y x)
408 (error ""))))))
409 `(values (member t) &optional)))
410 (assert
411 (ctype= (caddr
412 (sb-kernel:%simple-fun-type
413 (checked-compile
414 `(lambda (x y)
415 (if (< x y)
416 (< y x)
417 (error ""))))))
418 `(values null &optional))))
420 (with-test (:name :=-real)
421 (assert
422 (ctype= (caddr
423 (sb-kernel:%simple-fun-type
424 (checked-compile
425 `(lambda (a b)
426 (declare ((real 10 20) b))
427 (if (= a b)
429 (error ""))))))
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)))
432 (assert
433 (ctype= (caddr
434 (sb-kernel:%simple-fun-type
435 (checked-compile
436 `(lambda (a b)
437 (declare (integer a)
438 ((real 10 20) b))
439 (if (= a b)
441 (error ""))))))
442 `(values (integer 10 20) &optional)))
443 (assert
444 (ctype= (caddr
445 (sb-kernel:%simple-fun-type
446 (checked-compile
447 `(lambda (a b)
448 (declare ((real 10 20) b))
449 (if (> a b)
451 (error ""))))))
452 `(values (real (10)) &optional))))
454 (with-test (:name :<=-constraints)
455 (checked-compile-and-assert
457 `(lambda (a)
458 (if (/= a 0)
459 (if (>= a 0)
460 t)))
461 ((1) t)
462 ((0) nil)))
464 (with-test (:name :vector-length-derive-type)
465 (let ((s "X"))
466 (checked-compile-and-assert
468 `(lambda (x)
469 (declare ((or (vector t 2) (member #\@ ,s)) x))
470 (typep x '(string 1)))
471 ((s) t))))
473 (with-test (:name :constant-refs)
474 (checked-compile-and-assert
476 `(lambda (a)
477 (let ((m 2301453501242805283))
478 (if (< m a)
479 (< m a)
480 (error ""))))
481 (((expt 2 80)) t)
482 (:return-type (values (member t) &optional))))
484 (with-test (:name :constant-refs.2)
485 (checked-compile-and-assert
487 `(lambda (v)
488 (if (<= -3483114449144072 v)
490 (if (>= -3483114449144072 v)
492 40)))
493 ((9) 0)
494 ((-3483114449144073) 1)
495 (:return-type (values bit &optional))))
497 (with-test (:name :array-has-fill-pointer-p-constraint)
498 (assert
499 (type-specifiers-equal
500 (caddr
501 (sb-kernel:%simple-fun-type
502 (checked-compile
503 `(lambda (s)
504 (if (array-has-fill-pointer-p s)
505 (error "")
506 s)))))
507 '(values array &optional))))
509 (with-test (:name :+integer-argument-constraint.var)
510 (assert
511 (type-specifiers-equal
512 (caddr
513 (sb-kernel:%simple-fun-type
514 (checked-compile
515 `(lambda (a x y)
516 (declare (fixnum x))
517 (let ((m (+ x y)))
518 (aref a (+ m (aref a m)))
519 y)))))
520 `(values (integer ,(1+ most-negative-fixnum)
521 ,(+ most-positive-fixnum array-dimension-limit))
522 &optional))))
524 (with-test (:name :+integer-argument-constraint.typep)
525 (assert
526 (type-specifiers-equal
527 (caddr
528 (sb-kernel:%simple-fun-type
529 (checked-compile
530 `(lambda (x)
531 (let ((m (+ 1 x)))
532 (if (integerp m)
533 (+ m x)
534 2))))))
535 '(values integer &optional))))
537 (with-test (:name :truncate-zero-remainder)
538 (assert
539 (type-specifiers-equal
540 (caddr
541 (sb-kernel:%simple-fun-type
542 (checked-compile
543 `(lambda (x y)
544 (declare (integer x y))
545 (multiple-value-bind (q r) (truncate x y)
546 (if (zerop r)
547 (error "~a" q)
548 x))))))
549 '(values (or (integer * -1) (integer 1)) &optional))))
551 (with-test (:name :vector-length-var)
552 (assert
553 (type-specifiers-equal
554 (caddr
555 (sb-kernel:%simple-fun-type
556 (checked-compile
557 `(lambda (x)
558 (declare (simple-vector x))
559 (if (< 3 (length x) 5)
560 (length x)
561 (error ""))))))
562 '(values (integer 4 4) &optional))))
564 (with-test (:name :ash)
565 (assert
566 (type-specifiers-equal
567 (caddr
568 (sb-kernel:%simple-fun-type
569 (checked-compile
570 `(lambda (x)
571 (declare ((integer 1) x))
572 (let ((d (ash x -1)))
573 (< d x))))))
574 '(values (member t) &optional)))
575 (assert
576 (type-specifiers-equal
577 (caddr
578 (sb-kernel:%simple-fun-type
579 (checked-compile
580 `(lambda (x)
581 (declare ((integer 1) x))
582 (let ((d (ash x -1)))
583 (print d)
584 (< d x))))))
585 '(values (member t) &optional)))
586 (assert
587 (type-specifiers-equal
588 (caddr
589 (sb-kernel:%simple-fun-type
590 (checked-compile
591 `(lambda (x y)
592 (declare (unsigned-byte x)
593 ((integer * 0) y))
594 (let ((d (ash x y)))
595 (> d x))))))
596 '(values null &optional))))
598 (with-test (:name :/)
599 (assert-type
600 (lambda (x)
601 (declare ((integer 1) x))
602 (let ((d (truncate x 4)))
603 (< d x)))
604 (member t))
605 (assert-type
606 (lambda (x y)
607 (declare ((integer 0) x y))
608 (let ((d (/ x y)))
609 (> d x)))
610 null)
611 (assert-type
612 (lambda (a b)
613 (declare ((integer 1) a b))
614 (< (/ a b) a))
615 boolean)
616 (assert-type
617 (lambda (x y)
618 (declare (integer x y))
619 (if (plusp (rem x y))
622 (integer 1)))
624 (with-test (:name :negate-<)
625 (assert
626 (type-specifiers-equal
627 (caddr
628 (sb-kernel:%simple-fun-type
629 (checked-compile
630 `(lambda (a b)
631 (declare (type integer a)
632 ((integer 2 3) b))
633 (if (< (- a) b)
635 (loop))))))
636 '(values (integer -2) &optional))))
638 (with-test (:name :eq-vector-lengths)
639 (assert
640 (type-specifiers-equal
641 (caddr
642 (sb-kernel:%simple-fun-type
643 (checked-compile
644 `(lambda (a b j)
645 (declare (simple-vector a b)
646 ((integer 10 20) j)
647 (optimize (debug 1)))
648 (when (and (= (length a) (length b))
649 (= j (length a)))
650 (length b))))))
651 '(values (or null (integer 10 20)) &optional))))
653 (with-test (:name :+>)
654 (assert-type
655 (lambda (a j)
656 (declare (integer a)
657 ((integer 1) j))
658 (> (+ a j) a))
659 (member t))
660 (assert-type
661 (lambda (a j)
662 (declare (integer a)
663 ((integer 0) j))
664 (> (+ j a) a))
665 boolean)
666 (assert-type
667 (lambda (a b j)
668 (declare (integer a b)
669 ((integer 1) j))
670 (if (= b a)
671 (let ((d (+ b j)))
672 (> a d))
673 (loop)))
674 null)
675 (assert-type
676 (lambda (a b j)
677 (declare (integer a b)
678 ((integer 0) j))
679 (if (<= a b)
680 (let ((d (+ b j)))
681 (>= a d))
682 (loop)))
683 boolean)
684 (assert-type
685 (lambda (a b j)
686 (declare (integer a b)
687 ((integer 1) j))
688 (if (<= a b)
689 (let ((d (+ b j)))
690 (>= a d))
691 (loop)))
692 null))
694 (with-test (:name :->)
695 (assert-type
696 (lambda (v)
697 (declare (integer v)
698 (optimize (debug 2)))
699 (let ((l (1- v)))
700 (< l v)))
701 (member t))
702 (assert-type
703 (lambda (v)
704 (declare (simple-vector v)
705 (optimize (debug 2)))
706 (let ((l (1- (length v))))
707 (< l (length v))))
708 (member t))
709 (assert-type
710 (lambda (v)
711 (declare (integer v)
712 (optimize (debug 1)))
713 (let ((l (1- v)))
714 (< l v)))
715 (member t))
716 (assert-type
717 (lambda (v)
718 (declare (simple-vector v)
719 (optimize (debug 1)))
720 (let ((l (1- (length v))))
721 (< l (length v))))
722 (member t)))
724 (with-test (:name :sub-sign)
725 (assert-type
726 (lambda (x)
727 (declare (unsigned-byte x))
728 (- x (truncate x 2)))
729 unsigned-byte))
731 (with-test (:name :equal)
732 (assert-type
733 (lambda (x y)
734 (if (eql x y)
735 (equalp x y)
737 (member t))
738 (assert-type
739 (lambda (x y)
740 (if (eq x y)
741 (equal x y)
743 (member t))
744 (assert-type
745 (lambda (x y)
746 (if (eql x y)
748 (equal x y)))
749 boolean)
750 (assert-type
751 (lambda (x y)
752 (if (equalp x y)
753 (eql x y)
755 boolean))
757 (with-test (:name :bounds-check-constants)
758 (assert (= (count 'sb-kernel:%check-bound
759 (ctu:ir1-named-calls
760 `(lambda (v)
761 (declare (simple-vector v))
762 (setf (aref v 0) (aref v 1)))
763 nil))
764 1)))
766 (with-test (:name :bounds-check-constants-svref)
767 (assert (= (count 'sb-kernel:%check-bound
768 (ctu:ir1-named-calls
769 `(lambda (v)
770 (values (svref v 1)
771 (svref v 0)))
772 nil))
773 1)))
775 (with-test (:name :bounds-check-variable-svref)
776 (assert (= (count 'sb-kernel:%check-bound
777 (ctu:ir1-named-calls
778 `(lambda (x i)
779 (values (svref x i)
780 (svref x i)))
781 nil))
782 1)))
784 (with-test (:name :bounds-check-length)
785 (assert (= (count 'sb-kernel:%check-bound
786 (ctu:ir1-named-calls
787 `(lambda (x y)
788 (when (< x (length y))
789 (svref y x)))
790 nil))
791 0)))
793 (with-test (:name :bounds-check-length)
794 (assert (= (count 'sb-kernel:%check-bound
795 (ctu:ir1-named-calls
796 `(lambda (v)
797 (declare (simple-vector v)
798 (optimize (debug 2)))
799 (loop for i below (1- (length v))
800 sum (aref v i)))
801 nil))
803 (assert (= (count 'sb-kernel:%check-bound
804 (ctu:ir1-named-calls
805 `(lambda (v)
806 (declare (simple-vector v)
807 (optimize (debug 1)))
808 (loop for i below (1- (length v))
809 sum (aref v i)))
810 nil))
811 0)))
814 (with-test (:name :bounds-check-min-length)
815 (assert (= (count 'sb-kernel:%check-bound
816 (ctu:ir1-named-calls
817 `(lambda (x v)
818 (declare (integer x)
819 (simple-vector v)
820 (optimize (debug 2)))
821 (loop for i below (min x (1- (length v)))
822 sum (aref v i)))
823 nil))
825 (assert (= (count 'sb-kernel:%check-bound
826 (ctu:ir1-named-calls
827 `(lambda (x v)
828 (declare (integer x)
829 (simple-vector v))
830 (loop for i below (min x (length v))
831 sum (aref v i)))
832 nil))
834 (assert (= (count 'sb-kernel:%check-bound
835 (ctu:ir1-named-calls
836 `(lambda (x v)
837 (declare (simple-vector v))
838 (loop for i below (min x (length v))
839 sum (aref v i)))
840 nil))
841 0)))
843 (with-test (:name :bounds-check-make-array)
844 (assert (= (count 'sb-kernel:%check-bound
845 (ctu:ir1-named-calls
846 `(lambda (length)
847 (declare (integer length))
848 (let ((array (make-array length)))
849 (loop for i below length
850 do (setf (aref array i) i))))
851 nil))
853 (assert (= (count 'sb-kernel:%check-bound
854 (ctu:ir1-named-calls
855 `(lambda (length)
856 (let ((array (make-array length)))
857 (loop for i below length
858 do (setf (aref array i) i))))
859 nil))
861 (assert (= (count 'sb-kernel:%check-bound
862 (ctu:ir1-named-calls
863 `(lambda (type length)
864 (let ((array (make-sequence type length)))
865 (loop for i below length
866 do (setf (aref array i) i))))
867 nil))
868 0)))
870 (with-test (:name :bounds-check-down)
871 (assert (= (count 'sb-kernel:%check-bound
872 (ctu:ir1-named-calls
873 `(lambda (v)
874 (let ((end (1- (length v))))
875 (decf end)
876 (when (>= end 0)
877 (svref v end))))
878 nil))
880 (assert (= (count 'sb-kernel:%check-bound
881 (ctu:ir1-named-calls
882 `(lambda (v)
883 (declare (optimize (debug 2)))
884 (let ((end (1- (length v))))
885 (decf end)
886 (when (>= end 0)
887 (svref v end))))
888 nil))
890 (assert (= (count 'sb-kernel:%check-bound
891 (ctu:ir1-named-calls
892 `(lambda (v)
893 (loop for i from (1- (length v)) downto 0
894 collect (svref v i)))
895 nil))
897 (assert (= (count 'sb-kernel:%check-bound
898 (ctu:ir1-named-calls
899 `(lambda (v)
900 (declare (optimize (debug 2)))
901 (loop for i from (1- (length v)) downto 0
902 collect (svref v i)))
903 nil))
904 0)))
906 (with-test (:name :reoptimize)
907 (assert-type
908 (lambda ()
909 (let ((m 0))
910 (incf m)
911 (incf m)
913 (eql 2))
914 (assert-type
915 (lambda (n j)
916 (declare (integer j)
917 (optimize (debug 1)))
918 (the (integer 5) n)
919 (when (> j n)
921 (or (integer 6) null)))
923 (with-test (:name :+back)
924 (assert-type
925 (lambda (x y)
926 (when (> (+ x 1) y)
928 (or real null))
929 (assert-type
930 (lambda (x y)
931 (when (= (+ x 1) y)
933 (or number null))
934 (assert-type
935 (lambda (x y)
936 (when (integerp (+ x y))
938 (or number null))
939 (assert-type
940 (lambda (x y)
941 (declare (real y))
942 (when (integerp (+ x y))
944 (or rational null))
945 (assert-type
946 (lambda (x)
947 (when (integerp (+ x 1))
949 (or integer null))
950 (assert-type
951 (lambda (x)
952 (when (typep (+ x 3) '(integer 0 20))
954 (or (integer -3 17) null))
955 (assert-type
956 (lambda (x m)
957 (declare ((real 2 4) m)
958 (fixnum x))
959 (when (typep (+ m x) '(integer 2 4))
961 (or (integer -2 2) null)))
963 (with-test (:name :-back)
964 (assert-type
965 (lambda (x)
966 (when (typep (- x 4) '(integer 0 10))
968 (or (integer 4 14) null))
969 (assert-type
970 (lambda (x)
971 (when (typep (- 3 x) '(integer 0 10))
973 (or (integer -7 3) null))
974 (assert-type
975 (lambda (x)
976 (when (> (- 3 x) 10)
978 (or real null)))
980 (with-test (:name :*back)
981 (assert-type
982 (lambda (x)
983 (when (typep (* x 4) '(integer 0 10))
985 (or (rational 0 5/2) null))
986 (assert-type
987 (lambda (x m)
988 (declare ((real 0 3) m))
989 (when (typep (* x m) '(integer 0 10))
991 (or number null))
992 (assert-type
993 (lambda (x)
994 (when (> (* x 3) 10)
996 (or real null))
997 (assert-type
998 (lambda (x m)
999 (declare (real x)
1000 (integer m))
1001 (when (typep (* x m) 'integer)
1003 (or rational null)))
1005 (with-test (:name :ignore-hairy-types)
1006 (checked-compile
1007 '(lambda (a)
1008 (declare (optimize (debug 2)))
1009 (let ((v (the (satisfies eval) a)))
1010 (dotimes (i 3)
1011 (print (/= a 1))
1012 (the real a))
1013 v)))
1014 (checked-compile
1015 '(lambda (d)
1016 (values
1017 (let ((v9 d)
1018 (v1 (the (satisfies eval) (setf d 1))))
1019 (if (= v1 v9) 0 1))
1020 (loop sum (if (> (if (<= 220 d)
1021 (if (and (< 220 d)
1022 (>= 1024 d))
1025 220) 0)
1026 1 2))))))
1028 (with-test (:name :set-constraint)
1029 (assert-type
1030 (lambda (x)
1031 (when (> (decf x 10) 10)
1033 (or (real (10)) null)))
1035 (with-test (:name :set-constraint-inherit)
1036 (checked-compile-and-assert
1038 `(lambda (b c)
1039 (declare (type (integer 1 1625159256) b))
1040 ((lambda (v2 v6)
1041 (logorc1 (setf c 1448416540835)
1042 (gcd
1043 (if (>= b c)
1044 (if (< b c)
1046 -197521449755177454)
1048 (decf v2 (incf v2 (incf v6 (setq v2 (setq b 1044756040))))))))
1049 0 0))
1050 ((572837281 0) -1448416540836)))
1052 (with-test (:name :float-eql-bits)
1053 (assert-type
1054 (lambda (number)
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
1062 `(lambda (v)
1063 (loop for i below (- (length v) 2) by 2
1064 sum (svref v (1+ i))))
1065 nil))
1067 (assert (= (count 'sb-kernel:%check-bound
1068 (ctu:ir1-named-calls
1069 `(lambda (v)
1070 (loop for i from (- (length v) 2) downto 0
1071 collect (svref v (1+ i))))
1072 nil))
1074 (checked-compile-and-assert
1076 `(lambda (a)
1077 (declare (type fixnum a))
1078 (let ((j (+ a most-positive-fixnum)))
1079 (let ((bbb a))
1080 (dotimes (i a)
1081 (incf bbb))
1082 (< bbb j))))
1083 ((3) t)))
1085 (with-test (:name :constraint-multiple-eql-variables)
1086 (assert-type
1087 (lambda (x y)
1088 (declare (integer x y)
1089 (optimize (debug 2)))
1090 (assert (< x y))
1091 (< x y))
1092 (eql t)))
1094 (with-test (:name :dead-blocks)
1095 (assert-type
1096 (lambda (c d)
1097 (declare ((integer -31307831194 26651266057) c))
1098 (let ((v5 (if d
1099 -206316434836409151
1100 17179869177)))
1101 (if (/= v5 c)
1103 (if (> v5 c)
1104 (logior
1106 (loop for lv2 below 1
1108 (rem lv2 128)))
1109 1))))
1110 (eql 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)))
1117 (let ((v3 b)
1118 (v6 116510974941639))
1119 (if (> v6 v3)
1120 (if (> v3 v6)
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)
1127 (checked-compile
1128 `(lambda (v)
1129 (declare (simple-vector v))
1130 (let* ((i (1- (length v))))
1131 (declare (fixnum i))
1132 (loop
1133 (decf i)
1134 (print (aref v i)))))))
1136 (with-test (:name :min/max-constraints-set)
1137 (checked-compile-and-assert
1139 `(lambda (a b c)
1140 (let ((x
1141 (if (< a c)
1144 (y (setq a (min most-positive-fixnum b))))
1145 (> y x)))
1146 ((1 5 3) t)
1147 ((2 4 6) nil)))
1149 (with-test (:name :mod)
1150 (assert (= (count 'sb-kernel:%check-bound
1151 (ctu:ir1-named-calls
1152 `(lambda (v i)
1153 (svref v (mod i (length v))))
1154 nil))
1155 0)))
1157 (with-test (:name :index-ranges)
1158 (assert (= (count 'sb-kernel:%check-bound
1159 (ctu:ir1-named-calls
1160 `(lambda (a)
1161 (when (= (length a) 2)
1162 (svref a 1)))
1163 nil))
1165 (assert (= (count 'sb-kernel:%check-bound
1166 (ctu:ir1-named-calls
1167 `(lambda (a l i)
1168 (declare ((integer 2 3) l)
1169 ((integer 0 1) i))
1170 (when (= (length a) l)
1171 (svref a i)))
1172 nil))
1173 0)))
1175 (with-test (:name :constant-vector)
1176 (assert (= (count 'sb-kernel:%check-bound
1177 (ctu:ir1-named-calls
1178 `(lambda (x)
1179 (declare (fixnum x))
1180 (and (<= x 2)
1181 (aref #(1 2 3) x)))
1182 nil))
1183 0)))
1185 (with-test (:name :map-equality-constraints)
1186 (checked-compile-and-assert
1188 `(lambda (c d)
1189 (declare (notinline identity)
1190 (bit d))
1191 (dotimes (e 3 (identity (logior c 10 (- d -6 e))))))
1192 ((2 1) 14)
1193 ((9 0) 11)))
1195 (with-test (:name :local-call)
1196 (assert-type
1197 (lambda (a)
1198 (flet ((b ()
1200 (declare (notinline b))
1201 (the integer a)
1203 (b)))
1204 integer))
1206 (with-test (:name :set-vars-equal)
1207 (assert-type
1208 (lambda (a)
1209 (incf a 10)
1210 (eq a (progn (loop repeat a do (print 20)) a)))
1211 (eql t))
1212 (checked-compile-and-assert
1214 `(lambda (a)
1215 (logxor (unwind-protect a (setq a 7)) a))
1216 ((0) 7)
1217 ((7) 0)))
1219 (with-test (:name :set-vars-equal-leaf-change)
1220 (checked-compile-and-assert
1222 `(lambda (b)
1223 (declare (integer b))
1224 (let ((c 1))
1225 (decf c (shiftf b b))))
1226 ((3) -2)
1227 ((-4) 5)))
1229 (with-test (:name :all-var-values)
1230 (checked-compile
1231 `(lambda (c)
1232 (declare (optimize (safety 0)))
1233 (loop for lv3 below 1
1235 (loop for lv4 below 3
1236 sum (progv nil nil
1237 (setq c 1000)))
1238 (unless (eq lv3 -1)
1239 (the integer (catch 'ct4 16385)))))))
1241 (with-test (:name :cons-cells)
1242 (assert-type
1243 (lambda (x)
1244 (if (car x)
1245 (consp x)
1247 (eql t))
1248 (assert-type
1249 (lambda (x)
1250 (if (car x)
1252 (consp x)))
1253 boolean)
1254 (assert-type
1255 (lambda (x)
1256 (if (> (car x) 1)
1257 (consp x)
1259 (eql t))
1260 (assert-type
1261 (lambda (x)
1262 (if (> (car x) 1)
1264 (consp x)))
1265 (eql t)))
1267 (with-test (:name :char-code)
1268 (assert-type
1269 (lambda (x)
1270 (let ((n (char-code x)))
1271 (when (or (< 31 n 127) (= n 10))
1272 x)))
1273 (or null standard-char))
1274 (assert-type
1275 (lambda (x)
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
1284 `(lambda (x)
1285 (or (typep x '(integer 3 3))
1286 (typep x '(simple-array character (3)))))
1287 ((3) t)
1288 (("000") t)
1289 ((6) nil)
1290 (("") nil)))
1292 (with-test (:name :eql-var-replacement)
1293 (checked-compile-and-assert
1294 (:allow-notes nil)
1295 `(lambda (x y)
1296 (declare (float x)
1297 ((simple-array double-float (*)) y))
1298 (let ((d (aref y 0)))
1299 (when (and (/= d 0)
1300 (eql d x))
1301 x)))
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
1310 `(lambda (p1 p2 p3)
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
1320 `(lambda (sv key n)
1321 (declare (fixnum n) (simple-vector sv))
1322 (let ((found (find key sv :end n)))
1323 (if (< n (length sv))
1325 found)))
1326 ((#(1 2 3) 2 2) -1)
1327 ((#(1 2 3) 2 3) 2)
1328 ((#(1 2 3) 4 3) nil)))
1330 (with-test (:name :characters)
1331 (assert-type
1332 (lambda (c)
1333 (cond ((eql c #\a) 1)
1334 ((eql c #\a) 2)
1335 (t 1)))
1336 (eql 1))
1337 (assert-type
1338 (lambda (c)
1339 (cond ((eql c #\a) 1)
1340 ((eql c #\b) 1)
1341 ((eql c #\a) 2)
1342 (t 1)))
1343 (eql 1)))
1345 (with-test (:name :multiply-by-one)
1346 (assert-type
1347 (lambda (x)
1348 (the (unsigned-byte 8) (* x 1))
1350 (unsigned-byte 8)))