[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