[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