Ticket #7 (closed defect: fixed)
bad register targeting in (setf (aref ...) ...) of 2-dimensional array of element-type T.
|Reported by:||gb||Owned by:||gb|
(defun matrix-times-matrix (mat1 mat2) "Multiplies two matrices together" (if (= (array-dimension mat1 1) (array-dimension mat2 0)) (let ((result (make-array (list (array-dimension mat1 0) (array-dimension mat2 1))))) (dotimes (row (array-dimension result 0)) (dotimes (column (array-dimension result 1)) (let ((terms 0)) (dotimes (middle (array-dimension mat1 1)) (setf terms (+ terms (* (or (aref mat1 row middle) 0) (or (aref mat2 middle column) 0))))) (setf (aref result row column) terms)))) (return-from matrix-times-matrix result)) (progn (format t "~&Illegal matrix multiplication: Matrix sizes ~a x ~a and ~a x ~a don't match." (array-dimension mat1 0) (array-dimension mat1 1) (array-dimension mat2 0) (array-dimension mat2 1)) (return-from matrix-times-matrix nil))))
blows up in the compiler, when it discovers that it has to go through the write barrier at .SPgvset and that things are in the wrong registers for that.
It is possible that this just got exposed in 040708, because previous versions may have gotten MAKE-ARRAY type inferencing wrong