[pypy-svn] r75309 - in pypy/branch/multijit-4/pypy/jit: codewriter metainterp metainterp/test

arigo at codespeak.net arigo at codespeak.net
Sat Jun 12 10:30:05 CEST 2010


Author: arigo
Date: Sat Jun 12 10:30:03 2010
New Revision: 75309

Modified:
   pypy/branch/multijit-4/pypy/jit/codewriter/jtransform.py
   pypy/branch/multijit-4/pypy/jit/metainterp/blackhole.py
   pypy/branch/multijit-4/pypy/jit/metainterp/compile.py
   pypy/branch/multijit-4/pypy/jit/metainterp/jitdriver.py
   pypy/branch/multijit-4/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/multijit-4/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/multijit-4/pypy/jit/metainterp/test/test_compile.py
   pypy/branch/multijit-4/pypy/jit/metainterp/warmspot.py
   pypy/branch/multijit-4/pypy/jit/metainterp/warmstate.py
Log:
Fix bugs.


Modified: pypy/branch/multijit-4/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/codewriter/jtransform.py	Sat Jun 12 10:30:03 2010
@@ -326,7 +326,8 @@
 
     def handle_recursive_call(self, op):
         jitdriver_sd = self.callcontrol.jitdriver_sd_from_portal_runner_ptr(
-            op.args[0])
+            op.args[0].value)
+        assert jitdriver_sd is not None
         ops = self.promote_greens(op.args[1:], jitdriver_sd.jitdriver)
         num_green_args = len(jitdriver_sd.jitdriver.greens)
         args = ([Constant(jitdriver_sd.index, lltype.Signed)] +

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/blackhole.py	Sat Jun 12 10:30:03 2010
@@ -775,24 +775,23 @@
             # call the interpreter main loop from here, and just return its
             # result.
             sd = self.builder.metainterp_sd
-            xxxxxxxxxxxx
-            if sd.result_type == 'void':
+            result_type = sd.jitdrivers_sd[jdindex].result_type
+            if result_type == 'v':
                 self.bhimpl_recursive_call_v(jdindex, *args)
                 self.bhimpl_void_return()
-            elif sd.result_type == 'int':
+            elif result_type == 'i':
                 x = self.bhimpl_recursive_call_i(jdindex, *args)
                 self.bhimpl_int_return(x)
-            elif sd.result_type == 'ref':
+            elif result_type == 'r':
                 x = self.bhimpl_recursive_call_r(jdindex, *args)
                 self.bhimpl_ref_return(x)
-            elif sd.result_type == 'float':
+            elif result_type == 'f':
                 x = self.bhimpl_recursive_call_f(jdindex, *args)
                 self.bhimpl_float_return(x)
             assert False
 
     def get_portal_runner(self, jdindex):
-        metainterp_sd = self.builder.metainterp_sd
-        jitdriver_sd = metainterp_sd.jitdrivers_sd[jdindex]
+        jitdriver_sd = self.builder.metainterp_sd.jitdrivers_sd[jdindex]
         fnptr = llmemory.cast_ptr_to_adr(jitdriver_sd.portal_runner_ptr)
         fnptr = heaptracker.adr2int(fnptr)
         calldescr = jitdriver_sd.mainjitcode.calldescr

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/compile.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/compile.py	Sat Jun 12 10:30:03 2010
@@ -68,7 +68,7 @@
     loop.token = loop_token
     loop.operations[-1].descr = loop_token     # patch the target of the JUMP
     try:
-        old_loop_token = jitdriver_sd._state.optimize_loop(
+        old_loop_token = jitdriver_sd.warmstate.optimize_loop(
             metainterp_sd, old_loop_tokens, loop)
     except InvalidLoop:
         return None
@@ -279,7 +279,7 @@
     _trace_and_compile_from_bridge._dont_inline_ = True
 
     def must_compile(self, metainterp_sd, jitdriver_sd):
-        trace_eagerness = jitdriver_sd._state.trace_eagerness
+        trace_eagerness = jitdriver_sd.warmstate.trace_eagerness
         if self._counter >= 0:
             self._counter += 1
             return self._counter >= trace_eagerness
@@ -478,7 +478,7 @@
         new_loop.token = new_loop_token
         send_loop_to_backend(metainterp_sd, new_loop, "entry bridge")
         # send the new_loop to warmspot.py, to be called directly the next time
-        jitdriver_sd._state.attach_unoptimized_bridge_from_interp(
+        jitdriver_sd.warmstate.attach_unoptimized_bridge_from_interp(
             self.original_greenkey,
             new_loop_token)
         # store the new loop in compiled_merge_points too
@@ -506,11 +506,11 @@
     # clone ops, as optimize_bridge can mutate the ops
     new_loop.operations = [op.clone() for op in metainterp.history.operations]
     metainterp_sd = metainterp.staticdata
-    jitdriver_sd = metainterp.jitdriver_sd
+    state = metainterp.jitdriver_sd.warmstate
     try:
-        target_loop_token = jitdriver_sd._state.optimize_bridge(metainterp_sd,
-                                                                old_loop_tokens,
-                                                                new_loop)
+        target_loop_token = state.optimize_bridge(metainterp_sd,
+                                                  old_loop_tokens,
+                                                  new_loop)
     except InvalidLoop:
         # XXX I am fairly convinced that optimize_bridge cannot actually raise
         # InvalidLoop

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/jitdriver.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/jitdriver.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/jitdriver.py	Sat Jun 12 10:30:03 2010
@@ -10,6 +10,7 @@
     #    self.num_green_args    ... pypy.jit.metainterp.warmspot
     #    self.result_type       ... pypy.jit.metainterp.warmspot
     #    self.virtualizable_info... pypy.jit.metainterp.warmspot
+    #    self.warmstate         ... pypy.jit.metainterp.warmspot
     #    self.index             ... pypy.jit.codewriter.call
     #    self.mainjitcode       ... pypy.jit.codewriter.call
 

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/pyjitpl.py	Sat Jun 12 10:30:03 2010
@@ -659,11 +659,10 @@
 
     @arguments("int", "boxes3", "boxes3")
     def _opimpl_recursive_call(self, jdindex, greenboxes, redboxes):
+        targetjitdriver_sd = self.metainterp.staticdata.jitdrivers_sd[jdindex]
         allboxes = greenboxes + redboxes
-        metainterp_sd = self.metainterp.staticdata
-        xxxx
-        portal_code = metainterp_sd.portal_code
-        warmrunnerstate = metainterp_sd.state
+        portal_code = targetjitdriver_sd.mainjitcode
+        warmrunnerstate = targetjitdriver_sd.warmstate
         token = None
         if warmrunnerstate.inlining:
             if warmrunnerstate.can_inline_callable(greenboxes):
@@ -672,12 +671,13 @@
             token = warmrunnerstate.get_assembler_token(greenboxes)
             # verify that we have all green args, needed to make sure
             # that assembler that we call is still correct
-            self.verify_green_args(greenboxes)
+            self.verify_green_args(targetjitdriver_sd, greenboxes)
         #
-        k = llmemory.cast_ptr_to_adr(metainterp_sd._portal_runner_ptr)
+        k = llmemory.cast_ptr_to_adr(targetjitdriver_sd.portal_runner_ptr)
         funcbox = ConstInt(heaptracker.adr2int(k))
         return self.do_residual_call(funcbox, portal_code.calldescr,
-                                     allboxes, assembler_call_token=token)
+                                     allboxes, assembler_call_token=token,
+                                     assembler_call_jd=targetjitdriver_sd)
 
     opimpl_recursive_call_i = _opimpl_recursive_call
     opimpl_recursive_call_r = _opimpl_recursive_call
@@ -768,18 +768,18 @@
             raise CannotInlineCanEnterJit()
         self.metainterp.seen_can_enter_jit = True
 
-    def verify_green_args(self, jdindex, varargs):
-        jitdriver = self.metainterp.staticdata.jitdrivers_sd[jdindex]
-        num_green_args = jitdriver.num_green_args
+    def verify_green_args(self, jitdriver_sd, varargs):
+        num_green_args = jitdriver_sd.num_green_args
         assert len(varargs) == num_green_args
         for i in range(num_green_args):
             assert isinstance(varargs[i], Const)
 
     @arguments("orgpc", "int", "boxes3", "boxes3")
     def opimpl_jit_merge_point(self, orgpc, jdindex, greenboxes, redboxes):
-        self.verify_green_args(jdindex, greenboxes)
+        jitdriver_sd = self.metainterp.staticdata.jitdrivers_sd[jdindex]
+        self.verify_green_args(jitdriver_sd, greenboxes)
         # xxx we may disable the following line in some context later
-        self.debug_merge_point(jdindex, greenboxes)
+        self.debug_merge_point(jitdriver_sd, greenboxes)
         if self.metainterp.seen_can_enter_jit:
             self.metainterp.seen_can_enter_jit = False
             # Assert that it's impossible to arrive here with in_recursion
@@ -787,7 +787,7 @@
             # to True by opimpl_can_enter_jit, which should be executed
             # just before opimpl_jit_merge_point (no recursion inbetween).
             assert not self.metainterp.in_recursion
-            assert jdindex == self.metainterp.jitdriver_sd.index
+            assert jitdriver_sd is self.metainterp.jitdriver_sd
             # Set self.pc to point to jit_merge_point instead of just after:
             # if reached_can_enter_jit() raises SwitchToBlackhole, then the
             # pc is still at the jit_merge_point, which is a point that is
@@ -797,10 +797,9 @@
             self.metainterp.reached_can_enter_jit(greenboxes, redboxes)
             self.pc = saved_pc
 
-    def debug_merge_point(self, jdindex, greenkey):
+    def debug_merge_point(self, jitdriver_sd, greenkey):
         # debugging: produce a DEBUG_MERGE_POINT operation
-        jitdriver = self.metainterp.staticdata.jitdrivers_sd[jdindex]
-        loc = jitdriver._state.get_location_str(greenkey)
+        loc = jitdriver_sd.warmstate.get_location_str(greenkey)
         debug_print(loc)
         constloc = self.metainterp.cpu.ts.conststr(loc)
         self.metainterp.history.record(rop.DEBUG_MERGE_POINT,
@@ -1002,7 +1001,8 @@
         return resbox
 
     def do_residual_call(self, funcbox, descr, argboxes,
-                         assembler_call_token=None):
+                         assembler_call_token=None,
+                         assembler_call_jd=None):
         # First build allboxes: it may need some reordering from the
         # list provided in argboxes, depending on the order in which
         # the arguments are expected by the function
@@ -1047,7 +1047,8 @@
                 rop.CALL_MAY_FORCE, allboxes, descr=descr)
             self.metainterp.vrefs_after_residual_call()
             if assembler_call_token is not None:
-                self.metainterp.direct_assembler_call(assembler_call_token)
+                self.metainterp.direct_assembler_call(assembler_call_token,
+                                                      assembler_call_jd)
             if resbox is not None:
                 self.make_result_of_lastop(resbox)
             self.metainterp.vable_after_residual_call()
@@ -1135,7 +1136,7 @@
     def setup_jitdrivers_sd(self, optimizer):
         if optimizer is not None:
             for jd in self.jitdrivers_sd:
-                jd._state.set_param_optimizer(optimizer)
+                jd.warmstate.set_param_optimizer(optimizer)
 
     def finish_setup(self, codewriter, optimizer=None):
         from pypy.jit.metainterp.blackhole import BlackholeInterpBuilder
@@ -1468,7 +1469,7 @@
         self.resumekey.reset_counter_from_failure()
 
     def blackhole_if_trace_too_long(self):
-        warmrunnerstate = self.jitdriver_sd._state
+        warmrunnerstate = self.jitdriver_sd.warmstate
         if len(self.history.operations) > warmrunnerstate.trace_limit:
             greenkey_of_huge_function = self.find_biggest_function()
             self.portal_trace_positions = None
@@ -1678,7 +1679,7 @@
             raise NotImplementedError(opname[opnum])
 
     def get_compiled_merge_points(self, greenkey):
-        cell = self.jitdriver_sd._state.jit_cell_at_key(greenkey)
+        cell = self.jitdriver_sd.warmstate.jit_cell_at_key(greenkey)
         if cell.compiled_merge_points is None:
             cell.compiled_merge_points = []
         return cell.compiled_merge_points
@@ -1975,8 +1976,7 @@
                                             abox, ConstInt(j), itembox)
             assert i + 1 == len(self.virtualizable_boxes)
 
-    def gen_load_from_other_virtualizable(self, vbox):
-        vinfo = self.jitdriver_sd.virtualizable_info
+    def gen_load_from_other_virtualizable(self, vinfo, vbox):
         boxes = []
         assert vinfo is not None
         for i in range(vinfo.num_static_extra_boxes):
@@ -2048,19 +2048,19 @@
         op.args = [resbox_as_const] + op.args
         return resbox
 
-    def direct_assembler_call(self, token):
+    def direct_assembler_call(self, token, targetjitdriver_sd):
         """ Generate a direct call to assembler for portal entry point,
         patching the CALL_MAY_FORCE that occurred just now.
         """
         op = self.history.operations.pop()
         assert op.opnum == rop.CALL_MAY_FORCE
-        num_green_args = self.staticdata.num_green_args
+        num_green_args = targetjitdriver_sd.num_green_args
         args = op.args[num_green_args + 1:]
-        vinfo = self.jitdriver_sd.virtualizable_info
+        vinfo = targetjitdriver_sd.virtualizable_info
         if vinfo is not None:
             vindex = vinfo.index_of_virtualizable
             vbox = args[vindex - num_green_args]
-            args = args + self.gen_load_from_other_virtualizable(vbox)
+            args = args + self.gen_load_from_other_virtualizable(vinfo, vbox)
             # ^^^ and not "+=", which makes 'args' a resizable list
         op.opnum = rop.CALL_ASSEMBLER
         op.args = args

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/test/test_basic.py	Sat Jun 12 10:30:03 2010
@@ -53,8 +53,9 @@
     testself.cw = cw
     cw.find_all_graphs(JitPolicy())
     #
-    testself.warmrunnerstate = FakeJitDriverSD._state = FakeWarmRunnerState()
+    testself.warmrunnerstate = FakeWarmRunnerState()
     testself.warmrunnerstate.cpu = cpu
+    FakeJitDriverSD.warmstate = testself.warmrunnerstate
     if hasattr(testself, 'finish_setup_for_interp_operations'):
         testself.finish_setup_for_interp_operations()
     #
@@ -831,7 +832,7 @@
         translator.config.translation.gc = "boehm"
         warmrunnerdesc = WarmRunnerDesc(translator,
                                         CPUClass=self.CPUClass)
-        state = warmrunnerdesc.jitdrivers_sd[0]._state
+        state = warmrunnerdesc.jitdrivers_sd[0].warmstate
         state.set_param_threshold(3)          # for tests
         state.set_param_trace_eagerness(0)    # for tests
         warmrunnerdesc.finish()

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/test/test_compile.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/test/test_compile.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/test/test_compile.py	Sat Jun 12 10:30:03 2010
@@ -58,7 +58,7 @@
 
 class FakeMetaInterp:
     class jitdriver_sd:
-        _state = FakeState()
+        warmstate = FakeState()
 
 def test_compile_new_loop():
     cpu = FakeCPU()

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/warmspot.py	Sat Jun 12 10:30:03 2010
@@ -71,11 +71,11 @@
     translator.config.translation.list_comprehension_operations = True
     warmrunnerdesc = WarmRunnerDesc(translator, backendopt=backendopt, **kwds)
     for jd in warmrunnerdesc.jitdrivers_sd:
-        jd._state.set_param_threshold(3)          # for tests
-        jd._state.set_param_trace_eagerness(2)    # for tests
-        jd._state.set_param_trace_limit(trace_limit)
-        jd._state.set_param_inlining(inline)
-        jd._state.set_param_debug(debug_level)
+        jd.warmstate.set_param_threshold(3)          # for tests
+        jd.warmstate.set_param_trace_eagerness(2)    # for tests
+        jd.warmstate.set_param_trace_limit(trace_limit)
+        jd.warmstate.set_param_inlining(inline)
+        jd.warmstate.set_param_debug(debug_level)
     warmrunnerdesc.finish()
     res = interp.eval_graph(graph, args)
     if not kwds.get('translate_support_code', False):
@@ -361,7 +361,7 @@
         from pypy.jit.metainterp.warmstate import WarmEnterState
         state = WarmEnterState(self, jd)
         maybe_compile_and_run = state.make_entry_point()
-        jd._state = state
+        jd.warmstate = state
 
         def crash_in_jit(e):
             if not we_are_translated():
@@ -699,7 +699,7 @@
         _, PTR_SET_PARAM_FUNCTYPE = self.cpu.ts.get_FuncType([lltype.Signed],
                                                              lltype.Void)
         def make_closure(jd, fullfuncname):
-            state = jd._state
+            state = jd.warmstate
             def closure(i):
                 getattr(state, fullfuncname)(i)
             funcptr = self.helper_func(PTR_SET_PARAM_FUNCTYPE, closure)

Modified: pypy/branch/multijit-4/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/multijit-4/pypy/jit/metainterp/warmstate.py	(original)
+++ pypy/branch/multijit-4/pypy/jit/metainterp/warmstate.py	Sat Jun 12 10:30:03 2010
@@ -187,8 +187,7 @@
         cell = self.jit_cell_at_key(greenkey)
         cell.dont_trace_here = True
         debug_start("jit-disableinlining")
-        sd = self.warmrunnerdesc.metainterp_sd
-        loc = sd.state.get_location_str(greenkey)
+        loc = self.get_location_str(greenkey)
         debug_print("disabled inlining", loc)
         debug_stop("jit-disableinlining")
 



More information about the Pypy-commit mailing list