[pypy-svn] r68618 - in pypy/trunk/pypy/jit: backend metainterp/test

pedronis at codespeak.net pedronis at codespeak.net
Mon Oct 19 11:18:33 CEST 2009


Author: pedronis
Date: Mon Oct 19 11:18:33 2009
New Revision: 68618

Modified:
   pypy/trunk/pypy/jit/backend/loopviewer.py
   pypy/trunk/pypy/jit/backend/showstats.py
   pypy/trunk/pypy/jit/metainterp/test/oparser.py
   pypy/trunk/pypy/jit/metainterp/test/test_oparser.py
Log:
(pedronis, cfbolz): add a helper function that splits the content of the log
file containing optimized loops into its parts (e.g. loops and bridges)


Modified: pypy/trunk/pypy/jit/backend/loopviewer.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/loopviewer.py	(original)
+++ pypy/trunk/pypy/jit/backend/loopviewer.py	Mon Oct 19 11:18:33 2009
@@ -2,9 +2,10 @@
 """ Usage: loopviewer.py [loopnum] loopfile
 """
 
+import autopath
 import py
 import sys
-from pypy.jit.metainterp.test.oparser import parse
+from pypy.jit.metainterp.test.oparser import parse, split_logs_into_loops
 from pypy.jit.metainterp.history import ConstInt
 from pypy.rpython.lltypesystem import llmemory, lltype
 
@@ -16,8 +17,8 @@
 
 def main(loopnum, loopfile):
     data = py.path.local(loopfile).read()
-    loops = [i for i in data.split("[") if i]
-    inp = "[" + loops[loopnum]
+    loops = split_logs_into_loops(data)
+    inp = loops[loopnum]
     loop = parse(inp, namespace=alldict)
     loop.show()
 

Modified: pypy/trunk/pypy/jit/backend/showstats.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/showstats.py	(original)
+++ pypy/trunk/pypy/jit/backend/showstats.py	Mon Oct 19 11:18:33 2009
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
+import autopath
 import sys, py
-from pypy.jit.metainterp.test.oparser import parse
+from pypy.jit.metainterp.test.oparser import parse, split_logs_into_loops
 from pypy.jit.metainterp.resoperation import rop
 from pypy.rpython.lltypesystem import lltype, llmemory
 
@@ -11,9 +12,8 @@
 alldict = AllDict()
 
 def main(argv):
-    lst = ("\n" + py.path.local(argv[0]).read()).split("\n[")
-    lst = ['[' + i for i in lst if i]
-    for oplist in lst:
+    parts = split_logs_into_loops(py.path.local(argv[0]).read())
+    for oplist in parts:
         loop = parse(oplist, namespace=alldict)
         num_ops = 0
         num_dmp = 0

Modified: pypy/trunk/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/oparser.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/oparser.py	Mon Oct 19 11:18:33 2009
@@ -295,6 +295,24 @@
     kwds['invent_fail_descr'] = None
     return parse(*args, **kwds)
 
+
+def split_logs_into_loops(text):
+    lines = text.splitlines()
+    parts = []
+    last_with_hash = False
+    lines_of_part = []
+    for i, line in enumerate(lines):
+        if (line.startswith("[") and last_with_hash
+                and len(lines_of_part) > 1):
+            parts.append("\n".join(lines_of_part[:-1]))
+            lines_of_part = [lines_of_part[-1], line]
+        else:
+            lines_of_part.append(line)
+            last_with_hash = line.startswith("#")
+    parts.append("\n".join(lines_of_part))
+    return parts
+
+
 def _box_counter_more_than(s):
     if s.isdigit():
         Box._counter = max(Box._counter, int(s)+1)

Modified: pypy/trunk/pypy/jit/metainterp/test/test_oparser.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_oparser.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_oparser.py	Mon Oct 19 11:18:33 2009
@@ -1,7 +1,7 @@
 
 from pypy.rpython.lltypesystem import lltype, llmemory
 
-from pypy.jit.metainterp.test.oparser import parse
+from pypy.jit.metainterp.test.oparser import parse, split_logs_into_loops
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.history import AbstractDescr, BoxInt, LoopToken,\
      BoxFloat
@@ -160,3 +160,72 @@
     '''
     loop = parse(x)
     # assert did not explode
+
+def test_split_logs_into_loops():
+    text = '''\
+# Loop0 (loop), 12 ops
+[i0, i1]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+i3 = call(ConstClass(cls2), i0, descr=<Descr object at 0xb18a86c>)
+guard_no_exception(, descr=<Guard5>) [i0, i1, i3]
+i5 = int_add(i1, 2)
+i7 = call(ConstClass(cls6), i0, descr=<Descr object at 0xb18a86c>)
+p9 = guard_exception(4, descr=<Guard6>) [i5, i0, i7]
+i11 = int_sub(i5, 1)
+i12 = int_sub(i0, 1)
+i14 = int_gt(i12, 3)
+guard_true(i14, descr=<Guard7>) [i11, i12]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+jump(i12, i11, descr=<Loop0>)
+# Loop1 (entry bridge), 12 ops
+[i0, i1]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+i3 = call(ConstClass(cls2), i0, descr=<Descr object at 0xb18a86c>)
+p5 = guard_exception(4, descr=<Guard8>) [i0, i1, i3]
+i7 = int_add(i1, 1)
+i9 = call(ConstClass(cls8), i0, descr=<Descr object at 0xb18a86c>)
+p11 = guard_exception(4, descr=<Guard9>) [i7, i0, i9]
+i12 = int_sub(i7, 1)
+i13 = int_sub(i0, 1)
+i15 = int_gt(i13, 3)
+guard_true(i15, descr=<Guard10>) [i12, i13]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+jump(i13, i12, descr=<Loop0>)
+# bridge out of Guard5, 10 ops
+[i0, i1, i2]
+p4 = guard_exception(4, descr=<Guard11>) [i0, i1, i2]
+i6 = int_add(i1, 1)
+i8 = call(ConstClass(cls7), i0, descr=<Descr object at 0xb18a86c>)
+p10 = guard_exception(4, descr=<Guard12>) [i6, i0, i8]
+i11 = int_sub(i6, 1)
+i12 = int_sub(i0, 1)
+i14 = int_gt(i12, 3)
+guard_true(i14, descr=<Guard13>) [i11, i12]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+jump(i12, i11, descr=<Loop0>)
+# bridge out of Guard9, 6 ops
+[i0, i1, i2]
+i4 = int_add(i0, 2)
+i6 = int_sub(i1, 1)
+i8 = int_gt(i6, 3)
+guard_true(i8, descr=<Guard14>) [i4, i6]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+jump(i6, i4, descr=<Loop0>)
+# bridge out of Guard12, 6 ops
+[i0, i1, i2]
+i4 = int_add(i0, 2)
+i6 = int_sub(i1, 1)
+i8 = int_gt(i6, 3)
+guard_true(i8, descr=<Guard15>) [i4, i6]
+debug_merge_point('(no jitdriver.get_printable_location!)')
+jump(i6, i4, descr=<Loop0>)
+'''
+    parts = split_logs_into_loops(text)
+    assert len(parts) == 5
+    assert "\n".join(parts) == text.strip()
+    for part, typ in zip(parts,
+            ["Loop0", "Loop1",
+             "bridge out of Guard5",
+             "bridge out of Guard9",
+             "bridge out of Guard12"]):
+        assert part.startswith("# %s" % typ)



More information about the Pypy-commit mailing list