0 0))))
391833530 -32785211)))
-;;; Efficiency notes for FUNCALL
-(handler-case
- (compile nil '(lambda (x) (funcall x)))
- (sb-ext:compiler-note (e)
- (error "bogus compiler note: ~S." e)))
-
-(catch :got-note
- (handler-case
- (compile nil '(lambda (x) (declare (optimize speed)) (funcall x)))
- (sb-ext:compiler-note (e)
- (throw :got-note nil)))
- (error "missing compiler note for FUNCALL"))
+;;; efficiency notes for ordinary code
+(macrolet ((frob (arglist &body body)
+ `(progn
+ (handler-case
+ (compile nil '(lambda ,arglist ,@body))
+ (sb-ext:compiler-note (e)
+ (error "bad compiler note for ~S:~% ~A" ',body e)))
+ (catch :got-note
+ (handler-case
+ (compile nil '(lambda ,arglist (declare (optimize speed))
+ ,@body))
+ (sb-ext:compiler-note (e) (throw :got-note nil)))
+ (error "missing compiler note for ~S" ',body)))))
+ (frob (x) (funcall x))
+ (frob (x y) (find x y))
+ (frob (x y) (find-if x y))
+ (frob (x y) (find-if-not x y))
+ (frob (x y) (position x y))
+ (frob (x y) (position-if x y))
+ (frob (x y) (position-if-not x y))
+ (frob (x) (aref x 0)))
+
+(macrolet ((frob (style-warn-p form)
+ (if style-warn-p
+ `(catch :got-style-warning
+ (handler-case
+ (eval ',form)
+ (style-warning (e) (throw :got-style-warning nil)))
+ (error "missing style-warning for ~S" ',form))
+ `(handler-case
+ (eval ',form)
+ (style-warning (e)
+ (error "bad style-warning for ~S: ~A" ',form e))))))
+ (frob t (lambda (x &optional y &key z) (list x y z)))
+ (frob nil (lambda (x &optional y z) (list x y z)))
+ (frob nil (lambda (x &key y z) (list x y z)))
+ (frob t (defgeneric #:foo (x &optional y &key z)))
+ (frob nil (defgeneric #:foo (x &optional y z)))
+ (frob nil (defgeneric #:foo (x &key y z)))
+ (frob t (defun #:foo (x) (flet ((foo (x &optional y &key z) (list x y z))) (foo x x :z x)))))
+
+;;; this was a bug in the LOGXOR type deriver. The top form gave a
+;;; note, because the system failed to derive the fact that the return
+;;; from LOGXOR was small and negative, though the bottom one worked.
+(handler-bind ((sb-ext:compiler-note #'error))
+ (compile nil '(lambda ()
+ (declare (optimize speed (safety 0)))
+ (lambda (x y)
+ (declare (type (integer 3 6) x)
+ (type (integer -6 -3) y))
+ (+ (logxor x y) most-positive-fixnum)))))
+(handler-bind ((sb-ext:compiler-note #'error))
+ (compile nil '(lambda ()
+ (declare (optimize speed (safety 0)))
+ (lambda (x y)
+ (declare (type (integer 3 6) y)
+ (type (integer -6 -3) x))
+ (+ (logxor x y) most-positive-fixnum)))))
+
+;;; check that modular ash gives the right answer, to protect against
+;;; possible misunderstandings about the hardware shift instruction.
+(assert (zerop (funcall
+ (compile nil '(lambda (x y)
+ (declare (optimize speed)
+ (type (unsigned-byte 32) x y))
+ (logand #xffffffff (ash x y))))
+ 1 257)))
+
+;;; code instrumenting problems
+(compile nil
+ '(lambda ()
+ (declare (optimize (debug 3)))
+ (list (the integer (if nil 14 t)))))
+
+(compile nil
+ '(LAMBDA (A B C D)
+ (DECLARE (NOTINLINE LOGORC1 BYTE MASK-FIELD))
+ (DECLARE
+ (OPTIMIZE (SPEED 1)
+ (SPACE 1)
+ (SAFETY 1)
+ (DEBUG 3)
+ (COMPILATION-SPEED 0)))
+ (MASK-FIELD (BYTE 7 26)
+ (PROGN
+ (TAGBODY (THE INTEGER (CATCH 'CT4 (LOGORC1 C -15950))) 1)
+ B))))