0.8.9.46:
[sbcl.git] / src / compiler / srctran.lisp
index 67c8956..83fcba2 100644 (file)
       (values nil t t)))
 
 (defun logand-derive-type-aux (x y &optional same-leaf)
-  (declare (ignore same-leaf))
+  (when same-leaf
+    (return-from logand-derive-type-aux x))
   (multiple-value-bind (x-len x-pos x-neg) (integer-type-length x)
     (declare (ignore x-pos))
     (multiple-value-bind (y-len y-pos y-neg) (integer-type-length  y)
                  (specifier-type 'integer)))))))
 
 (defun logior-derive-type-aux (x y &optional same-leaf)
-  (declare (ignore same-leaf))
+  (when same-leaf
+    (return-from logior-derive-type-aux x))
   (multiple-value-bind (x-len x-pos x-neg) (integer-type-length x)
     (multiple-value-bind (y-len y-pos y-neg) (integer-type-length y)
       (cond
                (specifier-type 'integer))))))))
 
 (defun logxor-derive-type-aux (x y &optional same-leaf)
-  (declare (ignore same-leaf))
+  (when same-leaf
+    (return-from logxor-derive-type-aux (specifier-type '(eql 0))))
   (multiple-value-bind (x-len x-pos x-neg) (integer-type-length x)
     (multiple-value-bind (y-len y-pos y-neg) (integer-type-length y)
       (cond
 (defoptimizer (logeqv derive-type) ((x y))
   (two-arg-derive-type x y (lambda (x y same-leaf)
                             (lognot-derive-type-aux 
-                             (logxor-derive-type-aux x y same-leaf))) 
+                             (logxor-derive-type-aux x y same-leaf)))
                       #'logeqv))
 (defoptimizer (lognand derive-type) ((x y))
   (two-arg-derive-type x y (lambda (x y same-leaf)
                             (lognot-derive-type-aux
                              (logior-derive-type-aux x y same-leaf)))
                       #'lognor))
+;;; FIXME: use SAME-LEAF instead of ignoring it.
 (defoptimizer (logandc1 derive-type) ((x y))
   (two-arg-derive-type x y (lambda (x y same-leaf)
-                            (logand-derive-type-aux
-                             (lognot-derive-type-aux x) y nil))
+                            (if same-leaf
+                                (specifier-type '(eql 0))
+                                (logand-derive-type-aux
+                                 (lognot-derive-type-aux x) y nil)))
                       #'logandc1))
 (defoptimizer (logandc2 derive-type) ((x y))
   (two-arg-derive-type x y (lambda (x y same-leaf)
-                            (logand-derive-type-aux
-                             x (lognot-derive-type-aux y) nil))
+                            (if same-leaf
+                                (specifier-type '(eql 0))
+                                (logand-derive-type-aux
+                                 x (lognot-derive-type-aux y) nil)))
                       #'logandc2))
 (defoptimizer (logorc1 derive-type) ((x y))
   (two-arg-derive-type x y (lambda (x y same-leaf)
-                            (logior-derive-type-aux
-                             (lognot-derive-type-aux x) y nil))
+                            (if same-leaf
+                                (specifier-type '(eql -1))
+                                (logior-derive-type-aux
+                                 (lognot-derive-type-aux x) y nil)))
                       #'logorc1))
 (defoptimizer (logorc2 derive-type) ((x y))
   (two-arg-derive-type x y (lambda (x y same-leaf)
-                            (logior-derive-type-aux
-                             x (lognot-derive-type-aux y) nil))
+                            (if same-leaf
+                                (specifier-type '(eql -1))
+                                (logior-derive-type-aux
+                                 x (lognot-derive-type-aux y) nil)))
                       #'logorc2))
 \f
 ;;;; miscellaneous derive-type methods
            (cut-node (node &aux did-something)
              (when (and (not (block-delete-p (node-block node)))
                         (combination-p node)
-                        (fun-info-p (basic-combination-kind node)))
+                       (eq (basic-combination-kind node) :known))
                (let* ((fun-ref (lvar-use (combination-fun node)))
                       (fun-name (leaf-source-name (ref-leaf fun-ref)))
                       (modular-fun (find-modular-version fun-name width)))
     (if (null rest)
        `(values (the real ,arg0))
        `(let ((maxrest (max ,@rest)))
-         (if (> ,arg0 maxrest) ,arg0 maxrest)))))
+         (if (>= ,arg0 maxrest) ,arg0 maxrest)))))
 (define-source-transform min (arg0 &rest rest)
   (once-only ((arg0 arg0))
     (if (null rest)
        `(values (the real ,arg0))
        `(let ((minrest (min ,@rest)))
-         (if (< ,arg0 minrest) ,arg0 minrest)))))
+         (if (<= ,arg0 minrest) ,arg0 minrest)))))
 \f
 ;;;; converting N-arg arithmetic functions
 ;;;;
            (t
             *universal-type*)))))
 
+;;; Like CMU CL, we use HEAPSORT. However, other than that, this code
+;;; isn't really related to the CMU CL code, since instead of trying
+;;; to generalize the CMU CL code to allow START and END values, this
+;;; code has been written from scratch following Chapter 7 of
+;;; _Introduction to Algorithms_ by Corman, Rivest, and Shamir.
 (define-source-transform sb!impl::sort-vector (vector start end predicate key)
+  ;; Like CMU CL, we use HEAPSORT. However, other than that, this code
+  ;; isn't really related to the CMU CL code, since instead of trying
+  ;; to generalize the CMU CL code to allow START and END values, this
+  ;; code has been written from scratch following Chapter 7 of
+  ;; _Introduction to Algorithms_ by Corman, Rivest, and Shamir.
   `(macrolet ((%index (x) `(truly-the index ,x))
              (%parent (i) `(ash ,i -1))
              (%left (i) `(%index (ash ,i 1)))
                                      (%elt largest) i-elt
                                      i largest)))))))))
              (%sort-vector (keyfun &optional (vtype 'vector))
-              `(macrolet (;; KLUDGE: In SBCL ca. 0.6.10, I had trouble getting
-                          ;; type inference to propagate all the way
-                          ;; through this tangled mess of
-                          ;; inlining. The TRULY-THE here works
-                          ;; around that. -- WHN
+              `(macrolet (;; KLUDGE: In SBCL ca. 0.6.10, I had
+                          ;; trouble getting type inference to
+                          ;; propagate all the way through this
+                          ;; tangled mess of inlining. The TRULY-THE
+                          ;; here works around that. -- WHN
                           (%elt (i)
                            `(aref (truly-the ,',vtype ,',',vector)
                              (%index (+ (%index ,i) start-1)))))
-                (let ((start-1 (1- ,',start)) ; Heaps prefer 1-based addressing.
+                (let (;; Heaps prefer 1-based addressing.
+                      (start-1 (1- ,',start)) 
                       (current-heap-size (- ,',end ,',start))
                       (keyfun ,keyfun))
                   (declare (type (integer -1 #.(1- most-positive-fixnum))