[pypy-svn] r68014 - in pypy/branch/kill-jumptarget/pypy/jit: backend/llgraph backend/test metainterp metainterp/test

arigo at codespeak.net arigo at codespeak.net
Wed Sep 30 11:35:26 CEST 2009


Author: arigo
Date: Wed Sep 30 11:35:25 2009
New Revision: 68014

Modified:
   pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py
   pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py
   pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py
   pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py
   pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py
Log:
Start the refactoring.


Modified: pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/kill-jumptarget/pypy/jit/backend/llgraph/runner.py	Wed Sep 30 11:35:25 2009
@@ -104,17 +104,22 @@
             llimpl.set_class_size(self.memo_cast, vtable, size)
 
     def compile_bridge(self, faildescr, inputargs, operations):
-        c = self.compile_loop(inputargs, operations)
+        c = llimpl.compile_start()
+        self._compile_loop_or_bridge(c, inputargs, operations)
         old, oldindex = faildescr._compiled_fail
         llimpl.compile_redirect_fail(old, oldindex, c)
 
-    def compile_loop(self, inputargs, operations):
+    def compile_loop(self, inputargs, operations, loopdescr):
         """In a real assembler backend, this should assemble the given
         list of operations.  Here we just generate a similar CompiledLoop
         instance.  The code here is RPython, whereas the code in llimpl
         is not.
         """
         c = llimpl.compile_start()
+        loopdescr._llgraph_compiled_version = c
+        self._compile_loop_or_bridge(c, inputargs, operations)
+
+    def _compile_loop_or_bridge(self, c, inputargs, operations):
         var2index = {}
         for box in inputargs:
             if isinstance(box, history.BoxInt):
@@ -174,12 +179,10 @@
         op = operations[-1]
         assert op.is_final()
         if op.opnum == rop.JUMP:
-            target = op.jump_target
-            if target is None:
-                target = c
-            else:
-                target = target.executable_token
-            llimpl.compile_add_jump_target(c, target)
+            targettoken = op.descr
+            assert isinstance(targettoken, history.LoopToken)
+            compiled_version = targettoken._llgraph_compiled_version
+            llimpl.compile_add_jump_target(c, compiled_version)
         elif op.opnum == rop.FINISH:
             llimpl.compile_add_fail(c, len(self.fail_descrs))
             faildescr = op.descr
@@ -188,10 +191,11 @@
         else:
             assert False, "unknown operation"
 
-    def execute_token(self, compiled_version):
+    def execute_token(self, loop_token):
         """Calls the assembler generated for the given loop.
         Returns the ResOperation that failed, of type rop.FAIL.
         """
+        compiled_version = loop_token._llgraph_compiled_version
         frame = llimpl.new_frame(self.memo_cast, self.is_oo)
         # setup the frame
         llimpl.frame_clear(frame, compiled_version)

Modified: pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py	(original)
+++ pypy/branch/kill-jumptarget/pypy/jit/backend/test/runner_test.py	Wed Sep 30 11:35:25 2009
@@ -24,7 +24,8 @@
                                                                 result_type,
                                                                 valueboxes,
                                                                 descr)
-        executable_token = self.cpu.compile_loop(inputargs, operations)
+        looptoken = LoopToken()
+        self.cpu.compile_loop(inputargs, operations, looptoken)
         j = 0
         for box in valueboxes:
             if isinstance(box, BoxInt):
@@ -38,7 +39,7 @@
                 j += 1
             else:
                 assert isinstance(box, Const)
-        res = self.cpu.execute_token(executable_token)
+        res = self.cpu.execute_token(looptoken)
         if res is operations[-1].descr:
             self.guard_failed = False
         else:
@@ -96,9 +97,10 @@
             ResOperation(rop.FINISH, [i1], None, descr=faildescr)
             ]
         inputargs = [i0]
-        executable_token = self.cpu.compile_loop(inputargs, operations)
+        looptoken = LoopToken()
+        self.cpu.compile_loop(inputargs, operations, looptoken)
         self.cpu.set_future_value_int(0, 2)
-        fail = self.cpu.execute_token(executable_token)
+        fail = self.cpu.execute_token(looptoken)
         res = self.cpu.get_latest_value_int(0)
         assert res == 3        
         assert fail is faildescr
@@ -108,19 +110,19 @@
         i1 = BoxInt()
         i2 = BoxInt()
         faildescr = BasicFailDescr()
+        looptoken = LoopToken()
         operations = [
             ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
             ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
             ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr),
-            ResOperation(rop.JUMP, [i1], None),
+            ResOperation(rop.JUMP, [i1], None, descr=looptoken),
             ]
         inputargs = [i0]
         operations[2].fail_args = [i1]
-        operations[-1].jump_target = None
         
-        executable_token = self.cpu.compile_loop(inputargs, operations)
+        self.cpu.compile_loop(inputargs, operations, looptoken)
         self.cpu.set_future_value_int(0, 2)
-        fail = self.cpu.execute_token(executable_token)
+        fail = self.cpu.execute_token(looptoken)
         assert fail is faildescr
         res = self.cpu.get_latest_value_int(0)
         assert res == 10
@@ -131,19 +133,19 @@
         i0 = BoxInt()
         i1 = BoxInt()
         i2 = BoxInt()
-        faildescr = BasicFailDescr()                
+        faildescr = BasicFailDescr()
+        looptoken = LoopToken()
         operations = [
             ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
             ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
             ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr),
-            ResOperation(rop.JUMP, [i1], None),
+            ResOperation(rop.JUMP, [i1], None, descr=looptoken),
             ]
         inputargs = [i0]
         operations[2].fail_args = [i1]
-        operations[-1].jump_target = None
         wr_i1 = weakref.ref(i1)
         wr_guard = weakref.ref(operations[2])
-        executable_token = self.cpu.compile_loop(inputargs, operations)
+        self.cpu.compile_loop(inputargs, operations, looptoken)
         del i0, i1, i2
         del inputargs
         del operations
@@ -156,33 +158,30 @@
         i2 = BoxInt()
         faildescr1 = BasicFailDescr()
         faildescr2 = BasicFailDescr()
+        looptoken = LoopToken()
         operations = [
             ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
             ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
             ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr1),
-            ResOperation(rop.JUMP, [i1], None),
+            ResOperation(rop.JUMP, [i1], None, descr=looptoken),
             ]
         inputargs = [i0]
         operations[2].fail_args = [i1]
-        operations[-1].jump_target = None       
-        executable_token = self.cpu.compile_loop(inputargs, operations)
-        loop_token = LoopToken()
-        loop_token.executable_token = executable_token
+        self.cpu.compile_loop(inputargs, operations, looptoken)
 
         i1b = BoxInt()
         i3 = BoxInt()
         bridge = [
             ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
             ResOperation(rop.GUARD_TRUE, [i3], None, descr=faildescr2),
-            ResOperation(rop.JUMP, [i1b], None),            
+            ResOperation(rop.JUMP, [i1b], None, descr=looptoken),
         ]
         bridge[1].fail_args = [i1b]
-        bridge[-1].jump_target = loop_token
 
         self.cpu.compile_bridge(faildescr1, [i1b], bridge)        
 
         self.cpu.set_future_value_int(0, 2)
-        fail = self.cpu.execute_token(executable_token)
+        fail = self.cpu.execute_token(looptoken)
         assert fail is faildescr2
         res = self.cpu.get_latest_value_int(0)
         assert res == 20
@@ -193,30 +192,33 @@
             def __setattr__(self, name, value):
                 py.test.fail("finish descrs should not be touched")
         faildescr = UntouchableFailDescr() # to check that is not touched
+        looptoken = LoopToken()
         operations = [
             ResOperation(rop.FINISH, [i0], None, descr=faildescr)
             ]
-        executable_token = self.cpu.compile_loop([i0], operations)
+        self.cpu.compile_loop([i0], operations, looptoken)
         self.cpu.set_future_value_int(0, 99)
-        fail = self.cpu.execute_token(executable_token)
+        fail = self.cpu.execute_token(looptoken)
         assert fail is faildescr
         res = self.cpu.get_latest_value_int(0)
         assert res == 99
 
+        looptoken = LoopToken()
         operations = [
             ResOperation(rop.FINISH, [ConstInt(42)], None, descr=faildescr)
             ]
-        executable_token = self.cpu.compile_loop([], operations)
-        fail = self.cpu.execute_token(executable_token)
+        self.cpu.compile_loop([], operations, looptoken)
+        fail = self.cpu.execute_token(looptoken)
         assert fail is faildescr        
         res = self.cpu.get_latest_value_int(0)
         assert res == 42
 
+        looptoken = LoopToken()
         operations = [
             ResOperation(rop.FINISH, [], None, descr=faildescr)
             ]
-        executable_token = self.cpu.compile_loop([], operations)
-        fail = self.cpu.execute_token(executable_token)
+        self.cpu.compile_loop([], operations, looptoken)
+        fail = self.cpu.execute_token(looptoken)
         assert fail is faildescr
         
     def test_do_call(self):
@@ -406,13 +408,14 @@
                     ]
                 ops[1].fail_args = [v_res]
             #
-            executable_token = self.cpu.compile_loop([v1, v2], ops)
+            looptoken = LoopToken()
+            self.cpu.compile_loop([v1, v2], ops, looptoken)
             for x, y, z in testcases:
                 assert not self.cpu.get_exception()
                 assert not self.cpu.get_exc_value()
                 self.cpu.set_future_value_int(0, x)
                 self.cpu.set_future_value_int(1, y)
-                fail = self.cpu.execute_token(executable_token)
+                fail = self.cpu.execute_token(looptoken)
                 if (z == boom) ^ reversed:
                     assert fail is ops[1].descr
                 else:
@@ -1045,15 +1048,14 @@
         exc_tp = xtp
         exc_ptr = xptr
         loop = parse(ops, self.cpu, namespace=locals())
-        executable_token = self.cpu.compile_loop(loop.inputargs,
-                                                 loop.operations)
+        self.cpu.compile_loop(loop.inputargs, loop.operations, loop.token)
         self.cpu.set_future_value_int(0, 1)
-        self.cpu.execute_token(executable_token)
+        self.cpu.execute_token(loop.token)
         assert self.cpu.get_latest_value_int(0) == 0
         assert self.cpu.get_latest_value_ref(1) == xptr
         self.cpu.clear_exception()
         self.cpu.set_future_value_int(0, 0)
-        self.cpu.execute_token(executable_token)
+        self.cpu.execute_token(loop.token)
         assert self.cpu.get_latest_value_int(0) == 1
         self.cpu.clear_exception()
 
@@ -1069,10 +1071,9 @@
         exc_tp = ytp
         exc_ptr = yptr
         loop = parse(ops, self.cpu, namespace=locals())
-        executable_token = self.cpu.compile_loop(loop.inputargs,
-                                                 loop.operations)
+        self.cpu.compile_loop(loop.inputargs, loop.operations, loop.token)
         self.cpu.set_future_value_int(0, 1)
-        self.cpu.execute_token(executable_token)
+        self.cpu.execute_token(loop.token)
         assert self.cpu.get_latest_value_int(0) == 1
         self.cpu.clear_exception()
 
@@ -1086,14 +1087,13 @@
         finish(0)
         '''
         loop = parse(ops, self.cpu, namespace=locals())
-        executable_token = self.cpu.compile_loop(loop.inputargs,
-                                                 loop.operations)
+        self.cpu.compile_loop(loop.inputargs, loop.operations, loop.token)
         self.cpu.set_future_value_int(0, 1)
-        self.cpu.execute_token(executable_token)
+        self.cpu.execute_token(loop.token)
         assert self.cpu.get_latest_value_int(0) == 1
         self.cpu.clear_exception()
         self.cpu.set_future_value_int(0, 0)
-        self.cpu.execute_token(executable_token)
+        self.cpu.execute_token(loop.token)
         assert self.cpu.get_latest_value_int(0) == 0
         self.cpu.clear_exception()
 

Modified: pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py	(original)
+++ pypy/branch/kill-jumptarget/pypy/jit/metainterp/history.py	Wed Sep 30 11:35:25 2009
@@ -644,16 +644,18 @@
 # of operations.  Each branch ends in a jump which can go either to
 # the top of the same loop, or to another TreeLoop; or it ends in a FINISH.
 
-class Base(object):
-    """Common base class for TreeLoop and History."""
-
-class LoopToken(object):
-    """loop token"""
+class LoopToken(AbstractDescr):
+    """Used for rop.JUMP, giving the target of the jump.
+    This is different from TreeLoop: the TreeLoop class contains the
+    whole loop, including 'operations', and goes away after the loop
+    was compiled; but the LoopDescr remains alive and points to the
+    generated assembler.
+    """
     terminating = False # see TerminatingLoopToken in compile.py
     # specnodes
     # executable_token
 
-class TreeLoop(Base):
+class TreeLoop(object):
     inputargs = None
     specnodes = None
     operations = None
@@ -764,7 +766,7 @@
 # ____________________________________________________________
 
 
-class History(Base):
+class History(object):
     def __init__(self, cpu):
         self.cpu = cpu
         self.inputargs = None

Modified: pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py	(original)
+++ pypy/branch/kill-jumptarget/pypy/jit/metainterp/resoperation.py	Wed Sep 30 11:35:25 2009
@@ -5,16 +5,13 @@
     """The central ResOperation class, representing one operation."""
 
     # for 'jump': points to the target loop;
-    jump_target = None
+    jump_target = property(lambda x: crash, lambda x, y: crash)  # XXX temp
 
     # for 'guard_*'
     suboperations = property(lambda x: crash, lambda x, y: crash)  # XXX temp
     optimized = property(lambda x: crash, lambda x, y: crash)  # XXX temp
     fail_args = None
 
-    # for x86 backend and guards
-    inputargs = None
-
     # debug
     name = ""
     pc = 0

Modified: pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py	(original)
+++ pypy/branch/kill-jumptarget/pypy/jit/metainterp/test/oparser.py	Wed Sep 30 11:35:25 2009
@@ -4,7 +4,7 @@
 """
 
 from pypy.jit.metainterp.history import TreeLoop, BoxInt, ConstInt,\
-     ConstAddr, ConstObj, ConstPtr, Box, BasicFailDescr
+     ConstAddr, ConstObj, ConstPtr, Box, BasicFailDescr, LoopToken
 from pypy.jit.metainterp.resoperation import rop, ResOperation
 from pypy.jit.metainterp.typesystem import llhelper
 from pypy.rpython.lltypesystem import lltype, llmemory
@@ -49,15 +49,14 @@
 
 
 class OpParser(object):
-    def __init__(self, descr, cpu, namespace, type_system, boxkinds, jump_target, invent_fail_descr=default_fail_descr):
+    def __init__(self, descr, cpu, namespace, type_system, boxkinds,
+                 invent_fail_descr=default_fail_descr):
         self.descr = descr
         self.vars = {}
         self.cpu = cpu
         self.consts = namespace
         self.type_system = type_system
         self.boxkinds = boxkinds or {}
-        self.jumps = []
-        self.jump_target = jump_target
         self._cache = namespace.setdefault('_CACHE_', {})
         self.invent_fail_descr = invent_fail_descr
 
@@ -208,7 +207,7 @@
         res = ResOperation(opnum, args, None, descr)
         res.fail_args = fail_args
         if opnum == rop.JUMP:
-            self.jumps.append(res)
+            assert res.descr is not None
         return res
 
     def parse_next_op(self, line):
@@ -240,12 +239,7 @@
         if num < len(newlines):
             raise ParseError("unexpected dedent at line: %s" % newlines[num])
         loop = ExtendedTreeLoop("loop")
-        if len(self.jumps) > 1:
-            raise ParseError("Multiple jumps??")
-        if self.jump_target is not None and len(self.jumps) != 1:
-            raise ParseError("A jump is expected if a jump_target is given")
-        for jump in self.jumps:
-            jump.jump_target = self.jump_target
+        loop.token = LoopToken()
         loop.operations = ops
         loop.inputargs = inpargs
         return loop
@@ -276,11 +270,10 @@
         return base_indent, inpargs
 
 def parse(descr, cpu=None, namespace=None, type_system='lltype',
-          boxkinds=None, jump_target=None,
-          invent_fail_descr=default_fail_descr):
+          boxkinds=None, invent_fail_descr=default_fail_descr):
     if namespace is None:
         namespace = {}
-    return OpParser(descr, cpu, namespace, type_system, boxkinds, jump_target,
+    return OpParser(descr, cpu, namespace, type_system, boxkinds,
                     invent_fail_descr).parse()
 
 def pure_parse(*args, **kwds):



More information about the Pypy-commit mailing list