Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
;;; -*- 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))))))