[pypy-svn] r67415 - in pypy/trunk/pypy/jit: backend backend/cli backend/test backend/x86 metainterp
fijal at codespeak.net
fijal at codespeak.net
Tue Sep 1 19:41:20 CEST 2009
Author: fijal
Date: Tue Sep 1 19:41:20 2009
New Revision: 67415
Added:
pypy/trunk/pypy/jit/backend/loopviewer.py (contents, props changed)
pypy/trunk/pypy/jit/backend/test/test_logger.py (contents, props changed)
Modified:
pypy/trunk/pypy/jit/backend/cli/method.py
pypy/trunk/pypy/jit/backend/logger.py
pypy/trunk/pypy/jit/backend/x86/assembler.py
pypy/trunk/pypy/jit/metainterp/optimize.py
Log:
Change logger to use oparser storage type. Additionally add a viewer for
that and make everyone adapt.
Modified: pypy/trunk/pypy/jit/backend/cli/method.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/cli/method.py (original)
+++ pypy/trunk/pypy/jit/backend/cli/method.py Tue Sep 1 19:41:20 2009
@@ -152,7 +152,7 @@
# ----
cpu.logger.create_log()
- cpu.logger.eventually_log_loop(loop)
+ cpu.logger.log_loop(loop)
# ----
self.box2type = {}
if self.nocast:
Modified: pypy/trunk/pypy/jit/backend/logger.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/logger.py (original)
+++ pypy/trunk/pypy/jit/backend/logger.py Tue Sep 1 19:41:20 2009
@@ -3,31 +3,30 @@
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.history import Const, ConstInt, Box, \
BoxInt, ConstAddr
+from pypy.rlib.streamio import open_file_as_stream
class Logger(object):
def __init__(self, ts):
- self._log_fd = -1
+ self.log_stream = None
self.ts = ts
def create_log(self, extension='.ops'):
- if self._log_fd != -1:
- return self._log_fd
+ if self.log_stream is not None:
+ return self.log_stream
s = os.environ.get('PYPYJITLOG')
if not s:
- return -1
+ return None
s += extension
try:
- flags = os.O_WRONLY|os.O_CREAT|os.O_TRUNC
- self._log_fd = os.open(s, flags, 0666)
+ self.log_stream = open_file_as_stream(s, 'w')
except OSError:
os.write(2, "could not create log file\n")
- return -1
- return self._log_fd
+ return None
+ return self.log_stream
- def eventually_log_loop(self, loop):
- self.eventually_log_operations(loop.inputargs, loop.operations, None,
- compute_unique_id(loop))
+ def log_loop(self, loop):
+ self.log_operations(loop.inputargs, loop.operations, {})
def repr_of_descr(self, descr):
return descr.repr_of_descr()
@@ -39,83 +38,41 @@
mv = len(memo)
memo[arg] = mv
if isinstance(arg, ConstInt):
- return "ci(%d,%d)" % (mv, arg.value)
+ return str(arg.value)
elif isinstance(arg, BoxInt):
- return "bi(%d,%d)" % (mv, arg.value)
+ return 'i' + str(mv)
elif isinstance(arg, self.ts.ConstRef):
- return "cr(%d,%d)" % (mv, arg.get_())
+ return 'ConstPtr(ptr' + str(mv) + ')'
elif isinstance(arg, self.ts.BoxRef):
- return "br(%d,%d)" % (mv, arg.get_())
+ return 'p' + str(mv)
elif isinstance(arg, self.ts.ConstAddr):
- return "ca(%d,%d)" % (mv, arg.get_())
+ return 'ConstClass(cls' + str(mv) + ')'
else:
- #raise NotImplementedError
- return "?%r" % (arg,)
+ raise NotImplementedError
- def eventually_log_operations(self, inputargs, operations, memo=None,
- myid=0, indent=0):
- if self._log_fd == -1:
+ def log_operations(self, inputargs, operations, memo, indent=0):
+ if self.log_stream is None:
return
pre = " " * indent
- if memo is None:
- memo = {}
- if inputargs is None:
- os.write(self._log_fd, pre + "BEGIN(%s)\n" % myid)
- else:
- args = ",".join([self.repr_of_arg(memo, arg) for arg in inputargs])
- os.write(self._log_fd, pre + "LOOP %s\n" % args)
+ if inputargs is not None:
+ args = ", ".join([self.repr_of_arg(memo, arg) for arg in inputargs])
+ self.log_stream.write(pre + '[' + args + ']\n')
for i in range(len(operations)):
op = operations[i]
if op.opnum == rop.DEBUG_MERGE_POINT:
loc = op.args[0]._get_str()
- os.write(self._log_fd, pre + "#%s\n" % (loc,))
+ self.log_stream.write(pre + "debug_merge_point('%s')\n" % (loc,))
continue
- args = ",".join([self.repr_of_arg(memo, arg) for arg in op.args])
- if op.descr is not None:
- descr = self.repr_of_descr(op.descr)
- os.write(self._log_fd, pre + "%d:%s %s[%s]\n" %
- (i, op.getopname(), args, descr))
- else:
- os.write(self._log_fd, pre + "%d:%s %s\n" %
- (i, op.getopname(), args))
+ args = ", ".join([self.repr_of_arg(memo, arg) for arg in op.args])
if op.result is not None:
- os.write(self._log_fd, pre + " => %s\n" %
- self.repr_of_arg(memo, op.result))
+ res = self.repr_of_arg(memo, op.result) + " = "
+ else:
+ res = ""
+ if op.descr is not None:
+ args += ', descr=' + self.repr_of_descr(op.descr)
+ self.log_stream.write(pre + res + op.getopname() +
+ '(' + args + ')\n')
if op.is_guard():
- self.eventually_log_operations(None, op.suboperations, memo,
- indent=indent+2)
-# if operations[-1].opnum == rop.JUMP:
-# if operations[-1].jump_target is not None:
-
-# else:
-# # XXX hack for the annotator
-# jump_target = 13
-# os.write(self._log_fd, pre + 'JUMPTO:%s\n' % jump_target)
- if inputargs is None:
- os.write(self._log_fd, pre + "END\n")
- else:
- os.write(self._log_fd, pre + "LOOP END\n")
-
- def log_failure_recovery(self, gf, guard_index):
- if self._log_fd == -1:
- return
- return # XXX
- os.write(self._log_fd, 'xxxxxxxxxx\n')
- memo = {}
- reprs = []
- for j in range(len(gf.guard_op.liveboxes)):
- valuebox = gf.cpu.getvaluebox(gf.frame, gf.guard_op, j)
- reprs.append(self.repr_of_arg(memo, valuebox))
- jmp = gf.guard_op._jmp_from
- os.write(self._log_fd, "%d %d %s\n" % (guard_index, jmp,
- ",".join(reprs)))
- os.write(self._log_fd, 'xxxxxxxxxx\n')
-
- def log_call(self, valueboxes):
- if self._log_fd == -1:
- return
- return # XXX
- memo = {}
- args_s = ','.join([self.repr_of_arg(memo, box) for box in valueboxes])
- os.write(self._log_fd, "CALL\n")
- os.write(self._log_fd, "%s %s\n" % (name, args_s))
+ self.log_operations(None, op.suboperations, memo,
+ indent=indent+2)
+ self.log_stream.flush()
Added: pypy/trunk/pypy/jit/backend/loopviewer.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/backend/loopviewer.py Tue Sep 1 19:41:20 2009
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+""" Usage: loopviewer.py [loopnum] loopfile
+"""
+
+import py
+import sys
+from pypy.jit.metainterp.test.oparser import parse
+
+def main(loopnum, loopfile):
+ data = py.path.local(loopfile).read()
+ loops = [i for i in data.split("[") if i]
+ inp = "[" + loops[loopnum]
+ loop = parse(inp)
+ loop.show()
+
+if __name__ == '__main__':
+ if len(sys.argv) == 2:
+ loopnum = -1
+ loopfile = sys.argv[1]
+ elif len(sys.argv) == 3:
+ loopnum = int(sys.argv[1])
+ loopfile = sys.argv[2]
+ else:
+ print __doc__
+ sys.exit(1)
+ main(loopnum, loopfile)
Added: pypy/trunk/pypy/jit/backend/test/test_logger.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/backend/test/test_logger.py Tue Sep 1 19:41:20 2009
@@ -0,0 +1,78 @@
+
+from pypy.jit.metainterp.test.oparser import parse
+from pypy.jit.backend import logger
+from pypy.jit.metainterp.typesystem import llhelper
+from StringIO import StringIO
+from pypy.jit.metainterp.test.test_optimizeopt import equaloplists
+from pypy.jit.metainterp.history import AbstractDescr
+
+class Descr(AbstractDescr):
+ pass
+
+class Logger(logger.Logger):
+ def log_loop(self, loop, namespace={}):
+ self.log_stream = StringIO()
+ self.namespace = namespace
+ logger.Logger.log_loop(self, loop)
+ return self.log_stream.getvalue()
+
+ def repr_of_descr(self, descr):
+ for k, v in self.namespace.items():
+ if v == descr:
+ return k
+ return "???"
+
+class TestLogger(object):
+ ts = llhelper
+
+ def reparse(self, inp, namespace=None):
+ """ parse loop once, then log it and parse again,
+ return both
+ """
+ loop = parse(inp, namespace=namespace)
+ logger = Logger(self.ts)
+ output = logger.log_loop(loop, namespace)
+ oloop = parse(output, namespace=namespace)
+ return loop, oloop
+
+ def test_simple(self):
+ inp = '''
+ [i0, i1, i2, p3, p4, p5]
+ i6 = int_add(i1, i2)
+ i8 = int_add(i6, 3)
+ jump(i0, i8, i6, p3, p4, p5)
+ '''
+ loop, oloop = self.reparse(inp)
+ equaloplists(oloop.operations, loop.operations)
+ assert oloop.inputargs == loop.inputargs
+
+ def test_descr(self):
+ inp = '''
+ [p0]
+ setfield_gc(p0, 3, descr=somedescr)
+ '''
+ somedescr = Descr()
+ loop, oloop = self.reparse(inp, namespace=locals())
+ equaloplists(loop.operations, oloop.operations)
+
+ def test_guard(self):
+ inp = '''
+ [i0]
+ guard_true(i0)
+ i1 = int_add(i0, 1)
+ guard_true(i1)
+ fail(i1)
+ fail(i1)
+ fail(i0)
+ '''
+ loop, oloop = self.reparse(inp)
+ equaloplists(loop.operations, oloop.operations)
+
+ def test_debug_merge_point(self):
+ inp = '''
+ []
+ debug_merge_point("info")
+ '''
+ loop, oloop = self.reparse(inp)
+ assert oloop.operations[0].args[0]._get_str() == 'info'
+
Modified: pypy/trunk/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/trunk/pypy/jit/backend/x86/assembler.py Tue Sep 1 19:41:20 2009
@@ -170,7 +170,7 @@
self.tree = tree
self.make_sure_mc_exists()
inputargs = tree.inputargs
- self.logger.eventually_log_loop(tree)
+ self.logger.log_loop(tree)
regalloc = RegAlloc(self, tree, self.cpu.translate_support_code)
self._regalloc = regalloc
regalloc.walk_operations(tree)
Modified: pypy/trunk/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/optimize.py (original)
+++ pypy/trunk/pypy/jit/metainterp/optimize.py Tue Sep 1 19:41:20 2009
@@ -11,7 +11,7 @@
else:
return None
if options.logger_noopt is not None:
- options.logger_noopt.eventually_log_loop(loop)
+ options.logger_noopt.log_loop(loop)
finder = PerfectSpecializationFinder()
finder.find_nodes_loop(loop)
for old_loop in old_loops:
@@ -29,7 +29,7 @@
if not options.specialize: # for tests only
return old_loops[0]
if options.logger_noopt is not None:
- options.logger_noopt.eventually_log_loop(bridge)
+ options.logger_noopt.log_loop(bridge)
finder = BridgeSpecializationFinder()
finder.find_nodes_bridge(bridge)
for old_loop in old_loops:
More information about the Pypy-commit
mailing list