From 07a9e3dcde1f8274f80b5e200a15399ce5e6d579 Mon Sep 17 00:00:00 2001
From: Mark Shannon <mark@hotpy.org>
Date: Tue, 21 Jun 2022 17:06:24 +0100
Subject: [PATCH] Stats: Add summary of top instructions for misses and
 deferred specialization.

---
 Tools/scripts/summarize_stats.py | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py
index a856bbb3097513..93a9b6baea3296 100644
--- a/Tools/scripts/summarize_stats.py
+++ b/Tools/scripts/summarize_stats.py
@@ -188,6 +188,12 @@ def __exit__(*args):
         print("</details>")
         print()
 
+def to_str(x):
+    if isinstance(x, int):
+        return format(x, ",d")
+    else:
+        return str(x)
+
 def emit_table(header, rows):
     width = len(header)
     header_line = "|"
@@ -203,8 +209,8 @@ def emit_table(header, rows):
     print(under_line)
     for row in rows:
         if width is not None and len(row) != width:
-            raise ValueError("Wrong number of elements in row '" + str(rows) + "'")
-        print("|", " | ".join(str(i) for i in row), "|")
+            raise ValueError("Wrong number of elements in row '" + str(row) + "'")
+        print("|", " | ".join(to_str(i) for i in row), "|")
     print()
 
 def emit_execution_counts(opcode_stats, total):
@@ -251,6 +257,18 @@ def emit_specialization_overview(opcode_stats, total):
             ("Not specialized", not_specialized, f"{not_specialized*100/total:0.1f}%"),
             ("Specialized", specialized, f"{specialized*100/total:0.1f}%"),
         ))
+        for title, field in (("Deferred", "specialization.deferred"), ("Misses", "specialization.miss")):
+            total = 0
+            counts = []
+            for i, opcode_stat in enumerate(opcode_stats):
+                value = opcode_stat.get(field, 0)
+                counts.append((value, opname[i]))
+                total += value
+            counts.sort(reverse=True)
+            if total:
+                with Section(f"{title} by instruction", 3):
+                    rows = [ (name, count, f"{100*count/total:0.1f}%") for (count, name) in counts[:10] ]
+                    emit_table(("Name", "Count:", "Ratio:"), rows)
 
 def emit_call_stats(stats):
     stats_path = os.path.join(os.path.dirname(__file__), "../../Include/pystats.h")