;;;; -*- coding: utf-8; fill-column: 78 -*-
changes relative to sbcl-1.1.6
+ * bug fix: modular arithmetic involving large constants and conditionals
+ should no longer result in spurious dead code elimination. Reported by
+ Eric Marsden on sbcl-devel.
* bug fix: our mach exception handler can seemingly called very early in
the program execution process on OS X 10.8.0. Try and handle that case
robustly, without potentially leaking mach ports too much.
(ldb (byte width 0) constant-value))))
(unless (= constant-value new-value)
(change-ref-leaf node (make-constant new-value))
- (setf (lvar-%derived-type (node-lvar node)) (make-values-type :required (list (ctype-of new-value))))
+ (let ((lvar (node-lvar node)))
+ (setf (lvar-%derived-type lvar)
+ (and (lvar-has-single-use-p lvar)
+ (make-values-type :required (list (ctype-of new-value))))))
(setf (block-reoptimize (node-block node)) t)
(reoptimize-component (node-component node) :maybe)
(return-from cut-node t))))
(compile nil `(lambda (x)
(symbol-macrolet ((sv x))
(values (svref sv 0) (setf (svref sv 0) 99))))))
+
+;; The compiler used to update the receiving LVAR's type too
+;; aggressively when converting a large constant to a smaller
+;; (potentially signed) one, causing other branches to be
+;; inferred as dead.
+(with-test (:name :modular-cut-constant-to-width)
+ (let ((test (compile nil
+ `(lambda (x)
+ (logand 254
+ (case x
+ ((3) x)
+ ((2 2 0 -2 -1 2) 9223372036854775803)
+ (t 358458651)))))))
+ (assert (= (funcall test -10470605025) 26))))