Skip to content
Snippets Groups Projects
dyncount.lisp 1.67 KiB
Newer Older
wlott's avatar
wlott committed
;;; -*- Package: C; Log: C.Log -*-
;;;
;;; **********************************************************************
;;; This code was written as part of the Spice Lisp project at
;;; Carnegie-Mellon University, and has been placed in the public domain.
;;; If you want to use this code or any part of Spice Lisp, please contact
;;; Scott Fahlman (FAHLMAN@CMUC). 
;;; **********************************************************************
;;;
;;; This file contains support for collecting dynamic vop statistics.
;;; 
(in-package "C")

(export '(*collect-dynamic-statistics*))

(export '(count-me))


(defvar *collect-dynamic-statistics* nil
  "When T, emit extra code to collect dynamic statistics about vop usages.")

(defvar *dynamic-counts-tn* nil
  "Holds the TN for the counts vector.")


(defstruct (dyncount-info
	    (:print-function %print-dyncount-info))
  for
  (counts (required-argument) :type (simple-array (unsigned-byte 32) (*)))
  (vops (required-argument) :type simple-vector))


(defprinter dyncount-info
  for
  counts
  vops)

(defun setup-dynamic-count-info (component)
  (let* ((info (ir2-component-dyncount-info (component-info component)))
	 (vops (dyncount-info-vops info)))
    (do-ir2-blocks (block component)
      (when (ir2-block-start-vop block)
	(let* ((1block (ir2-block-block block))
	       (index (1- (block-number 1block)))
	       (counts (svref vops index)))
	  (do ((vop (ir2-block-start-vop block) (vop-next vop)))
	      ((null vop))
	    (let* ((vop-name (vop-info-name (vop-info vop)))
		   (entry (assoc vop-name counts :test #'eq)))
	      (if entry
		  (incf (cdr entry))
		  (setf counts (acons vop-name 1 counts)))))
	  (setf (svref vops index) counts))))))