[pypy-commit] pypy jit-label-counters: split traces into parts going from one label to the next

hakanardo noreply at buildbot.pypy.org
Sat Dec 24 10:51:21 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-label-counters
Changeset: r50839:b9fedb0f9f96
Date: 2011-12-24 10:51 +0100
http://bitbucket.org/pypy/pypy/changeset/b9fedb0f9f96/

Log:	split traces into parts going from one label to the next

diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -387,6 +387,25 @@
         loops.append(loop)
     return log, loops
 
+class Part(object):
+    def __init__(self, trace, operations):
+        self.trace = trace
+        self.operations = operations
+
+    def __len___(self):
+        return len(self.operations)
+
+def split_trace(trace):
+    labels = [i for i, op in enumerate(trace.operations)
+              if op.name == 'label']
+    labels = [0] + labels + [len(trace.operations) - 1]
+    parts = []
+    for i in range(len(labels) - 1):
+        start, stop = labels[i], labels[i+1]
+        
+        parts.append(Part(trace, trace.operations[start : stop + 1]))
+    
+    return parts
 
 def parse_log_counts(input, loops):
     if not input:
diff --git a/pypy/tool/jitlogparser/test/test_parser.py b/pypy/tool/jitlogparser/test/test_parser.py
--- a/pypy/tool/jitlogparser/test/test_parser.py
+++ b/pypy/tool/jitlogparser/test/test_parser.py
@@ -1,6 +1,6 @@
 from pypy.tool.jitlogparser.parser import (SimpleParser, TraceForOpcode,
                                            Function, adjust_bridges,
-                                           import_log, Op)
+                                           import_log, split_trace, Op)
 from pypy.tool.jitlogparser.storage import LoopStorage
 import py, sys
 
@@ -231,3 +231,21 @@
     myrepr = 'c = foobar(a, b, descr=mydescr)'
     assert op.repr() == myrepr
     assert op.repr() == myrepr # do it twice
+
+def test_split_trace():
+    loop = parse('''
+    [i7]
+    i9 = int_lt(i7, 1003)
+    label(i9)
+    guard_true(i9, descr=<Guard2>) []
+    i13 = getfield_raw(151937600, descr=<SignedFieldDescr pypysig_long_struct.c_value 0>)
+    label(i13)
+    i19 = int_lt(i13, 1003)
+    guard_true(i19, descr=<Guard2>) []
+    i113 = getfield_raw(151937600, descr=<SignedFieldDescr pypysig_long_struct.c_value 0>)
+    ''')
+    parts = split_trace(loop)
+    assert len(parts) == 3
+    assert len(parts[0].operations) == 2
+    assert len(parts[1].operations) == 4
+    assert len(parts[2].operations) == 4


More information about the pypy-commit mailing list