[pypy-commit] lang-smalltalk 64bit: start adding support for running the hosted metainterpreter for the jittests

timfel noreply at buildbot.pypy.org
Thu Jan 16 15:04:52 CET 2014


Author: Tim Felgentreff <timfelgentreff at gmail.com>
Branch: 64bit
Changeset: r575:58f9d9fb67d3
Date: 2014-01-12 02:55 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/58f9d9fb67d3/

Log:	start adding support for running the hosted metainterpreter for the
	jittests

diff --git a/spyvm/test/jittest/base.py b/spyvm/test/jittest/base.py
--- a/spyvm/test/jittest/base.py
+++ b/spyvm/test/jittest/base.py
@@ -1,13 +1,43 @@
 import subprocess
 import os
+import sys
 
 # TODO:
 from pypy.tool.jitlogparser.parser import SimpleParser, Op
 from pypy.tool.jitlogparser.storage import LoopStorage
 
+from rpython.jit.metainterp.test.support import LLJitMixin
 from rpython.jit.metainterp.resoperation import opname
 from rpython.jit.tool import oparser
 from rpython.tool import logparser
+from rpython import conftest
+
+class o:
+    view = False
+    viewloops = True
+conftest.option = o
+
+
+sys.setrecursionlimit(5000)
+# expose the bytecode's values as global constants.
+# Bytecodes that have a whole range are exposed as global functions:
+# call them with an argument 'n' to get the bytecode number 'base + n'.
+# XXX hackish
+def setup():
+    from spyvm import interpreter
+    def make_getter(entry):
+        def get_opcode_chr(n):
+            opcode = entry[0] + n
+            assert entry[0] <= opcode <= entry[1]
+            return chr(opcode)
+        return get_opcode_chr
+    for entry in interpreter.BYTECODE_RANGES:
+        name = entry[-1]
+        if len(entry) == 2:     # no range
+            globals()[name] = chr(entry[0])
+        else:
+            globals()[name] = make_getter(entry)
+setup()
 
 
 BasePath = os.path.abspath(
@@ -19,10 +49,17 @@
 )
 BenchmarkImage = os.path.join(os.path.dirname(__file__), "benchmark.image")
 
-class BaseJITTest(object):
+class BaseJITTest(LLJitMixin):
     def run(self, spy, tmpdir, code):
+        code = code.replace("\n", "\r\n")
+        if spy:
+            return self.run_binary(spy, tmpdir, code)
+        else:
+            return self.run_simulated(tmpdir, code)
+
+    def run_binary(self, spy, tmpdir, code):
         proc = subprocess.Popen(
-            [str(spy), "-r", code.replace("\n", "\r\n"), BenchmarkImage],
+            [str(spy), "-r", code, BenchmarkImage],
             cwd=str(tmpdir),
             env={"PYPYLOG": "jit-log-opt:%s" % tmpdir.join("x.pypylog")}
         )
@@ -41,6 +78,68 @@
                 traces_w[len(traces_w) - 1].addbridge(trace)
         return traces_w
 
+    def run_simulated(self, tmpdir, code):
+        import targetimageloadingsmalltalk
+
+        info = {"interpreter": None, "selector": None}
+
+        old_run_code = targetimageloadingsmalltalk._run_code
+        def new_run_code(interp, code, as_benchmark=False):
+            info["interpreter"] = interp
+            return old_run_code(interp, code, as_benchmark=as_benchmark, raise_selector=True)
+        targetimageloadingsmalltalk._run_code = new_run_code
+
+        try:
+            targetimageloadingsmalltalk.entry_point(
+                [str(tmpdir), "-r", code, BenchmarkImage]
+            )
+        except targetimageloadingsmalltalk.SelectorNotification as e:
+            info["selector"] = e.selector
+
+        interp = info["interpreter"]
+        selector = info["selector"]
+        def interpret():
+            return interp.perform(interp.space.wrap_int(0), selector)
+
+        # XXX custom fishing, depends on the exact env var and format
+        logfile = tmpdir.join("x.pypylog")
+        os.environ['PYPYLOG'] = "jit-log-opt:%s" % logfile
+        self.meta_interp(interpret, [], listcomp=True, listops=True, backendopt=True, inline=True)
+
+        from rpython.jit.metainterp.warmspot import get_stats
+        import re
+        loops = get_stats().get_all_loops()
+        logstr = "[bed8a96917a] {jit-log-opt-loop\n"
+        logstr += "# Loop 0 (exp: eval) : entry bridge with %d ops\n" % len(loops[len(loops) -1].operations)
+        logstr += "[p0, p1]\n"
+        counter = 1
+        for op in loops[len(loops) -1].operations:
+            counter += 1
+            op = str(op)
+            match = re.match("[a-zA-Z0-9]+\.[a-zA-Z0-9]+:\d+", op)
+            if match:
+                op = op[0:match.span()[1]].strip()
+            if op.startswith("i"):
+                op = "+%d: %s" % (counter, op)
+            logstr += op
+            logstr += "\n"
+        logfile.write(logstr + "[bed8a999a87] jit-log-opt-loop}\n")
+
+        import pdb; pdb.set_trace()
+        data = logparser.parse_log_file(str(tmpdir.join("x.pypylog")), verbose=False)
+        data = logparser.extract_category(data, "jit-log-opt-")
+
+        storage = LoopStorage()
+        traces = [SimpleParser.parse_from_input(t) for t in data]
+        main_loops = storage.reconnect_loops(traces)
+        traces_w = []
+        for trace in traces:
+            if trace in main_loops:
+                traces_w.append(Trace(trace))
+            else:
+                traces_w[len(traces_w) - 1].addbridge(trace)
+        return traces_w
+
     def assert_matches(self, trace, expected):
         expected_lines = [
             line.strip()
diff --git a/spyvm/test/jittest/conftest.py b/spyvm/test/jittest/conftest.py
--- a/spyvm/test/jittest/conftest.py
+++ b/spyvm/test/jittest/conftest.py
@@ -12,4 +12,7 @@
 
 
 def pytest_funcarg__spy(request):
-    return str(py.path.local(request.config.getvalueorskip("spy")))
+    if request.config.getvalue("spy"):
+        return str(py.path.local(request.config.getvalueorskip("spy")))
+    else:
+        return None
diff --git a/spyvm/test/jittest/test_basic.py b/spyvm/test/jittest/test_basic.py
--- a/spyvm/test/jittest/test_basic.py
+++ b/spyvm/test/jittest/test_basic.py
@@ -4,9 +4,15 @@
 
 
 class TestBasic(BaseJITTest):
+    def test_empty(self, spy, tmpdir):
+        traces = self.run(spy, tmpdir, """
+        ^ self
+        """)
+        assert True
+
     def test_while_loop(self, spy, tmpdir):
         traces = self.run(spy, tmpdir, """
-        0 to: 1000000000 do: [:t|nil].
+        0 to: 100 do: [:t|nil].
         """)
         self.assert_matches(traces[0].loop, """
         guard_not_invalidated(descr=<Guard0xa15ec7c>)
@@ -130,3 +136,35 @@
         guard_false(i78, descr=<Guard0x967e718>),
         jump(p0, p3, i74, p8, p10, p12, p14, p20, p22, p24, p26, p28, p30, p32, p34, p36, p38, p40, p42, p44, p46, i77, descr=TargetToken(157713840))
         """)
+
+    def test_bitInvert32(self, spy, tmpdir):
+        traces = self.run(spy, tmpdir, """
+        | srcWord dstWord |
+        srcWord := 16rCAFFEE.
+        dstWord := 16r987654.
+        1 to: 1000000 do: [:t|
+          srcWord := srcWord bitInvert32.
+        ].
+        """)
+        self.assert_matches(traces[0].loop, """
+        guard_not_invalidated(descr=<Guard0x2b48f70>),
+        i90 = int_le(i79, 1000000),
+        guard_true(i90, descr=<Guard0x2b49590>),
+        setfield_gc(ConstPtr(ptr60), i67, descr=<FieldS spyvm.interpreter.Interpreter.inst_remaining_stack_depth 56>),
+        i91 = int_ge(i73, 0),
+        guard_true(i91, descr=<Guard0x2b49520>),
+        i92 = int_xor(i73, i72),
+        i93 = int_sub(i92, -4611686018427387904),
+        i94 = uint_lt(i93, -9223372036854775808),
+        guard_true(i94, descr=<Guard0x2b494b0>),
+        i95 = int_add(i79, 1),
+        i96 = int_sub(i95, -4611686018427387904),
+        setfield_gc(ConstPtr(ptr60), i63, descr=<FieldS spyvm.interpreter.Interpreter.inst_remaining_stack_depth 56>),
+        i97 = uint_lt(i96, -9223372036854775808),
+        guard_true(i97, descr=<Guard0x2b49440>),
+        i98 = int_sub(i87, 3),
+        setfield_gc(ConstPtr(ptr60), i98, descr=<FieldS spyvm.interpreter.Interpreter.inst_interrupt_check_counter 24>),
+        i99 = int_le(i98, 0),
+        guard_false(i99, descr=<Guard0x2b493d0>),
+        jump(p0, p3, i92, p8, i95, p16, p18, p20, p22, p24, p26, p28, p30, p32, p34, p36, p38, p40, p42, i67, i52, i72, i63, i98, descr=TargetToken(44203440))
+        """)
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
old mode 100644
new mode 100755
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 import sys, time
 import os
 
@@ -60,7 +61,12 @@
     except error.Exit, e:
         print e.msg
 
-def _run_code(interp, code, as_benchmark=False):
+
+class SelectorNotification(Exception):
+    def __init__(self, sel):
+        self.selector = sel
+
+def _run_code(interp, code, as_benchmark=False, raise_selector=False):
     import time
     selector = "codeTest%d" % int(time.time())
     try:
@@ -78,6 +84,9 @@
         print e.msg
         return 1
 
+    if raise_selector:
+        raise SelectorNotification(selector)
+
     if not as_benchmark:
         try:
             w_result = interp.perform(space.wrap_int(0), selector)


More information about the pypy-commit mailing list