Hi !

Consider the following file to be compiled:

(declaim (optimize (speed 3)
                   (compilation-speed 0)
                   (safety 0)
                   (debug 0)))

(defun assign (array value)
  (declare (type (simple-array fixnum (* *)) array))
  (declare (type fixnum value))
  (let ((size (array-dimension array 0))) ; don't worry, array is square
    (dotimes (i size)
      (declare (type fixnum i))
      (dotimes (j size)
        (setf (aref array i j) value)))))


        The declaration of i as a fixnum seems to allow CMU-CL to inline some
operations on the loop. Otherwise, I would get a message liike this:

; In: DEFUN ASSIGN

;   (DOTIMES (I SIZE) (DOTIMES # #))
; --> DO BLOCK LET TAGBODY UNLESS COND IF NOT IF >= IF 
; ==>
;   (< I #:G0)
; Note: Forced to do GENERIC-< (cost 10).
;     Unable to do inline fixnum comparison (cost 4) because:
;     The first argument is a UNSIGNED-BYTE, not a FIXNUM.
; 
; --> DO BLOCK LET TAGBODY PSETQ PSETF LET* MULTIPLE-VALUE-BIND LET 1+ 
; ==>
;   (+ I 1)
; Note: Forced to do GENERIC-+ (cost 10).
;     Unable to do inline fixnum arithmetic (cost 1) because:
;     The first argument is a UNSIGNED-BYTE, not a FIXNUM.
;     The result is a (INTEGER 1), not a FIXNUM.
;     Unable to do inline fixnum arithmetic (cost 2) because:
;     The first argument is a UNSIGNED-BYTE, not a FIXNUM.
;     The result is a (INTEGER 1), not a FIXNUM.
;     etc.
; 


        But do I really have the right to do so ? The macro expansion of the
function indicates that two consecutive declarations for i are issued in that
case.

Also, I don't understand why CMU-CL gives me no note at all about the loop on
J, which behaves exactly the same.


Thanks.

-- 
Didier Verna, [EMAIL PROTECTED], http://www.lrde.epita.fr/~didier

EPITA / LRDE, 14-16 rue Voltaire   Tel.+33 (1) 44 08 01 85
94276 Le Kremlin-BicĂȘtre, France   Fax.+33 (1) 53 14 59 22   [EMAIL PROTECTED]


Reply via email to