[pypy-commit] pypy jit-short_from_state: test framwork for testing bridges

hakanardo noreply at buildbot.pypy.org
Tue Aug 2 14:08:11 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r46194:cd0beddbc920
Date: 2011-08-02 12:26 +0200
http://bitbucket.org/pypy/pypy/changeset/cd0beddbc920/

Log:	test framwork for testing bridges

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -317,6 +317,9 @@
         self.config = get_pypy_config(translating=True)
         self.config.translation.jit_ffi = True
 
+    class warmrunnerdesc:
+        class memory_manager:
+            retrace_limit = 5
 
 class Storage(compile.ResumeGuardDescr):
     "for tests."
diff --git a/pypy/jit/metainterp/test/test_virtualstate.py b/pypy/jit/metainterp/test/test_virtualstate.py
--- a/pypy/jit/metainterp/test/test_virtualstate.py
+++ b/pypy/jit/metainterp/test/test_virtualstate.py
@@ -5,9 +5,11 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import OptValue
 from pypy.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr, ConstInt, ConstPtr
 from pypy.rpython.lltypesystem import lltype
-from pypy.jit.metainterp.test.test_optimizeutil import LLtypeMixin, BaseTest
+from pypy.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, equaloplists
 from pypy.jit.metainterp.optimizeopt.intutils import IntBound
-from pypy.jit.metainterp.test.test_optimizebasic import equaloplists
+from pypy.jit.metainterp.history import TreeLoop, LoopToken
+from pypy.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeDescr, FakeMetaInterpStaticData
+from pypy.jit.metainterp.optimize import RetraceLoop
 
 class TestBasic:
     someptr1 = LLtypeMixin.myptr
@@ -181,24 +183,83 @@
         loop = self.parse(expected)
         assert equaloplists(guards, loop.operations, False,
                             {loop.inputargs[0]: box})        
+
+class BaseTestBridges(BaseTest):
+    enable_opts = "intbounds:rewrite:virtualize:string:heap:unroll"
+
+    def _do_optimize_bridge(self, bridge, call_pure_results):
+        from pypy.jit.metainterp.optimizeopt import optimize_bridge_1, build_opt_chain
+        from pypy.jit.metainterp.optimizeopt.util import args_dict
+
+        self.bridge = bridge
+        bridge.call_pure_results = args_dict()
+        if call_pure_results is not None:
+            for k, v in call_pure_results.items():
+                bridge.call_pure_results[list(k)] = v
+        metainterp_sd = FakeMetaInterpStaticData(self.cpu)
+        if hasattr(self, 'vrefinfo'):
+            metainterp_sd.virtualref_info = self.vrefinfo
+        if hasattr(self, 'callinfocollection'):
+            metainterp_sd.callinfocollection = self.callinfocollection
+        #
+        d = {}
+        for name in self.enable_opts.split(":"):
+            d[name] = None
+        optimize_bridge_1(metainterp_sd, bridge,  d)
         
-    
+    def optimize_bridge(self, loop, bridge, expected, expected_target='Loop', **boxvalues):
+        loop = self.parse(loop)
+        bridge = self.parse(bridge)
+        loop.preamble = TreeLoop('preamble')
+        loop.preamble.inputargs = loop.inputargs
+        loop.preamble.token = LoopToken()
+        loop.preamble.start_resumedescr = FakeDescr()        
+        self._do_optimize_loop(loop, None)
+
+        boxes = {}
+        for b in bridge.inputargs + [op.result for op in bridge.operations]:
+            boxes[str(b)] = b
+        for b, v in boxvalues.items():
+            boxes[b].value = v
+        bridge.operations[-1].setdescr(loop.preamble.token)
+        try:
+            self._do_optimize_bridge(bridge, None)
+        except RetraceLoop:
+            assert expected == 'RETRACE'
+            return
+
+        print '\n'.join([str(o) for o in bridge.operations])
+        expected = self.parse(expected)
+        self.assert_equal(bridge, expected)
+
+        if expected_target == 'Preamble':
+            assert bridge.operations[-1].getdescr() is loop.preamble.token
+        elif expected_target == 'Loop':
+            assert bridge.operations[-1].getdescr() is loop.token
+        else:
+            assert False
 
     def test_nonnull(self):
-        ops1 = """
+        loop = """
+        [p0]
+        p1 = getfield_gc(p0, descr=nextdescr)
+        jump(p0)
+        """
+        bridge = """
         [p0]
         jump(p0)
         """
-        ops2 = """
+        expected = """
         [p0]
-        p1 = getfield_gc(p0, descr=nextdescr]
+        guard_nonnull(p0) []
         jump(p0)
         """
-        self.general_order(ops1, ops2)
+        self.optimize_bridge(loop, bridge, 'RETRACE')
+        self.optimize_bridge(loop, bridge, expected, p0=self.node)
 
-    def general_order(self, ops1, ops2):
-        loop1 = self.parse(ops1)
-        loop2 = self.parse(ops2)
-        
-class TestLLtype(BaseTestGenerateGuards, LLtypeMixin):
+class TestLLtypeGuards(BaseTestGenerateGuards, LLtypeMixin):
     pass
+
+class TestLLtypeBridges(BaseTestBridges, LLtypeMixin):
+    pass
+


More information about the pypy-commit mailing list