[pypy-commit] pypy jit-targets: reintroduce inputargs on loops

hakanardo noreply at buildbot.pypy.org
Sun Nov 6 10:46:27 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r48815:50843084d602
Date: 2011-11-06 10:46 +0100
http://bitbucket.org/pypy/pypy/changeset/50843084d602/

Log:	reintroduce inputargs on loops

diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -772,6 +772,7 @@
         self.exported_state = None
         
 class TreeLoop(object):
+    inputargs = None
     operations = None
     token = None
     call_pure_results = None
@@ -784,20 +785,6 @@
         #   ops of the kind 'guard_xxx' contain a further list of operations,
         #   which may itself contain 'guard_xxx' and so on, making a tree.
 
-    _inputargs = None
-    
-    def get_inputargs(self):
-        "NOT_RPYTHON"
-        if self._inputargs is not None:
-            return self._inputargs
-        assert self.operations[0].getopnum() == rop.LABEL
-        return self.operations[0].getarglist()
-
-    def set_inputargs(self, inputargs):
-        self._inputargs = inputargs
-
-    inputargs = property(get_inputargs, set_inputargs)
-
     def _all_operations(self, omit_finish=False):
         "NOT_RPYTHON"
         result = []
@@ -825,14 +812,15 @@
 
     def check_consistency(self):     # for testing
         "NOT_RPYTHON"
-        seen = dict.fromkeys(self.inputargs)        
-        self.check_consistency_of_branch(self.operations, seen)
+        self.check_consistency_of(self.inputargs, self.operations)
 
     @staticmethod
-    def check_consistency_of(operations):
-        assert operations[0].getopnum() == rop.LABEL
-        inputargs = operations[0].getarglist()
+    def check_consistency_of(inputargs, operations):
+        for box in inputargs:
+            assert isinstance(box, Box), "Loop.inputargs contains %r" % (box,)
         seen = dict.fromkeys(inputargs)
+        assert len(seen) == len(inputargs), (
+               "duplicate Box in the Loop.inputargs")
         TreeLoop.check_consistency_of_branch(operations, seen)
 
     @staticmethod
@@ -875,7 +863,7 @@
 
     def dump(self):
         # RPython-friendly
-        print '%r: ' % self
+        print '%r: inputargs =' % self, self._dump_args(self.inputargs)        
         for op in self.operations:
             args = op.getarglist()
             print '\t', op.getopname(), self._dump_args(args), \
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -7,7 +7,7 @@
 from pypy.jit.metainterp.optimizeopt import optimize_loop_1, ALL_OPTS_DICT, build_opt_chain
 from pypy.jit.metainterp.optimize import InvalidLoop
 from pypy.jit.metainterp.history import AbstractDescr, ConstInt, BoxInt
-from pypy.jit.metainterp.history import TreeLoop, LoopToken, TargetToken
+from pypy.jit.metainterp.history import TreeLoop, ProcedureToken, TargetToken
 from pypy.jit.metainterp.jitprof import EmptyProfiler
 from pypy.jit.metainterp import executor, compile, resume, history
 from pypy.jit.metainterp.resoperation import rop, opname, ResOperation
@@ -83,18 +83,16 @@
         jumpop = operations[-1]
         assert jumpop.getopnum() == rop.JUMP
         inputargs = loop.inputargs
-        loop.inputargs = None
 
         jump_args = jumpop.getarglist()[:]
         operations = operations[:-1]
         cloned_operations = [op.clone() for op in operations]
         
         preamble = TreeLoop('preamble')
-        #loop.preamble.inputargs = loop.inputargs
-        #loop.preamble.token = LoopToken()
+        preamble.inputargs = inputargs
         preamble.start_resumedescr = FakeDescr()
 
-        token = LoopToken() # FIXME: Make this a MergePointToken?
+        token = ProcedureToken() 
         preamble.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(token))] + \
                               operations +  \
                               [ResOperation(rop.LABEL, jump_args, None, descr=TargetToken(token))]
@@ -107,6 +105,8 @@
                           [ResOperation(rop.LABEL, [inliner.inline_arg(a) for a in jump_args],
                                         None, descr=TargetToken(token))] 
                           #[inliner.inline_op(jumpop)]
+        assert loop.operations[0].getopnum() == rop.LABEL
+        loop.inputargs = loop.operations[0].getarglist()
 
         self._do_optimize_loop(loop, call_pure_results)
         extra_same_as = []
@@ -146,6 +146,8 @@
             assert preamble.operations[-1].getdescr() == loop.operations[0].getdescr()
         if expected_short:
             short_preamble = TreeLoop('short preamble')
+            assert short[0].getopnum() == rop.LABEL
+            short_preamble.inputargs = short[0].getarglist()
             short_preamble.operations = short
             self.assert_equal(short_preamble, convert_old_style_to_targets(expected_short, jump=True),
                               text_right='expected short preamble')
@@ -155,6 +157,7 @@
 
 def convert_old_style_to_targets(loop, jump):
     newloop = TreeLoop(loop.name)
+    newloop.inputargs = loop.inputargs
     newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, None, descr=FakeDescr())] + \
                       loop.operations
     if not jump:
diff --git a/pypy/jit/metainterp/test/test_compile.py b/pypy/jit/metainterp/test/test_compile.py
--- a/pypy/jit/metainterp/test/test_compile.py
+++ b/pypy/jit/metainterp/test/test_compile.py
@@ -1,7 +1,7 @@
 from pypy.config.pypyoption import get_pypy_config
-from pypy.jit.metainterp.history import LoopToken, ConstInt, History, Stats
+from pypy.jit.metainterp.history import ProcedureToken, TargetToken, ConstInt, History, Stats
 from pypy.jit.metainterp.history import BoxInt, INT
-from pypy.jit.metainterp.compile import insert_loop_token, compile_new_loop
+from pypy.jit.metainterp.compile import insert_loop_token, compile_procedure
 from pypy.jit.metainterp.compile import ResumeGuardDescr
 from pypy.jit.metainterp.compile import ResumeGuardCountersInt
 from pypy.jit.metainterp.compile import compile_tmp_callback
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -70,7 +70,7 @@
         self.invent_fail_descr = invent_fail_descr
         self.nonstrict = nonstrict
         self.model = get_model(self.use_mock_model)
-        self.looptoken = self.model.LoopToken()
+        self.looptoken = self.model.ProcedureToken()
 
     def get_const(self, name, typ):
         if self._consts is None:
diff --git a/pypy/jit/tool/oparser_model.py b/pypy/jit/tool/oparser_model.py
--- a/pypy/jit/tool/oparser_model.py
+++ b/pypy/jit/tool/oparser_model.py
@@ -3,7 +3,7 @@
 
 def get_real_model():
     class LoopModel(object):
-        from pypy.jit.metainterp.history import TreeLoop, LoopToken
+        from pypy.jit.metainterp.history import TreeLoop, ProcedureToken
         from pypy.jit.metainterp.history import Box, BoxInt, BoxFloat
         from pypy.jit.metainterp.history import ConstInt, ConstObj, ConstPtr, ConstFloat
         from pypy.jit.metainterp.history import BasicFailDescr


More information about the pypy-commit mailing list