[pypy-commit] pypy compress-numbering: pack jitcode and pc into one slot

fijal noreply at buildbot.pypy.org
Wed Oct 7 13:31:11 CEST 2015


Author: fijal
Branch: compress-numbering
Changeset: r80018:51545f543b79
Date: 2015-10-07 13:29 +0200
http://bitbucket.org/pypy/pypy/changeset/51545f543b79/

Log:	pack jitcode and pc into one slot

diff --git a/rpython/jit/codewriter/codewriter.py b/rpython/jit/codewriter/codewriter.py
--- a/rpython/jit/codewriter/codewriter.py
+++ b/rpython/jit/codewriter/codewriter.py
@@ -28,7 +28,7 @@
         self.transform_graph_to_jitcode(graph, jitcode, True)
         return jitcode
 
-    def transform_graph_to_jitcode(self, graph, jitcode, verbose):
+    def transform_graph_to_jitcode(self, graph, jitcode, verbose, index):
         """Transform a graph into a JitCode containing the same bytecode
         in a different format.
         """
@@ -58,6 +58,7 @@
         # constants are cast to their normalized type (Signed, GCREF or
         # Float).
         self.assembler.assemble(ssarepr, jitcode)
+        jitcode.index = index
         #
         # print the resulting assembler
         if self.debug:
@@ -67,13 +68,16 @@
         log.info("making JitCodes...")
         self.callcontrol.grab_initial_jitcodes()
         count = 0
+        all_jitcodes = []
         for graph, jitcode in self.callcontrol.enum_pending_graphs():
-            self.transform_graph_to_jitcode(graph, jitcode, verbose)
+            self.transform_graph_to_jitcode(graph, jitcode, verbose, len(all_jitcodes))
+            all_jitcodes.append(jitcode)
             count += 1
             if not count % 500:
                 log.info("Produced %d jitcodes" % count)
         self.assembler.finished(self.callcontrol.callinfocollection)
         log.info("there are %d JitCode instances." % count)
+        return all_jitcodes
 
     def setup_vrefinfo(self, vrefinfo):
         # must be called at most once
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1611,6 +1611,7 @@
     #debug_start('jit-blackhole')
     blackholeinterp = blackhole_from_resumedata(
         metainterp_sd.blackholeinterpbuilder,
+        metainterp_sd.jitcodes,
         jitdriver_sd,
         resumedescr,
         deadframe,
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -26,13 +26,21 @@
         self.prev = prev
         self.boxes = boxes
 
+def combine_uint(index1, index2):
+    assert 0 <= index1 < 65536
+    assert 0 <= index2 < 65536
+    return index1 << 16 | index2 # it's ok to return signed here,
+    # we need only 32bit, but 64 is ok for now
+
+def unpack_uint(packed):
+    return packed >> 16, packed & 0xffff
+
 class FrameInfo(object):
-    __slots__ = ('prev', 'jitcode', 'pc')
+    __slots__ = ('prev', 'packed_jitcode_pc')
 
     def __init__(self, prev, jitcode, pc):
         self.prev = prev
-        self.jitcode = jitcode
-        self.pc = pc
+        self.packed_jitcode_pc = combine_uint(jitcode.index, pc)
 
 def _ensure_parent_resumedata(framestack, n):
     target = framestack[n]
@@ -40,7 +48,8 @@
         return
     back = framestack[n - 1]
     if target.parent_resumedata_frame_info_list is not None:
-        assert target.parent_resumedata_frame_info_list.pc == back.pc
+        _, pc = unpack_uint(target.parent_resumedata_frame_info_list.packed_jitcode_pc)
+        assert pc == back.pc
         return
     _ensure_parent_resumedata(framestack, n - 1)
     target.parent_resumedata_frame_info_list = FrameInfo(
@@ -970,8 +979,10 @@
     virtualizable_boxes, virtualref_boxes = boxes
     frameinfo = storage.rd_frame_info_list
     while True:
-        f = metainterp.newframe(frameinfo.jitcode)
-        f.setup_resume_at_op(frameinfo.pc)
+        jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
+        jitcode = metainterp.staticdata.jitcodes[jitcode_pos]
+        f = metainterp.newframe(jitcode)
+        f.setup_resume_at_op(pc)
         resumereader.consume_boxes(f.get_current_position_info(),
                                    f.registers_i, f.registers_r, f.registers_f)
         frameinfo = frameinfo.prev
@@ -1225,7 +1236,8 @@
 
 # ---------- when resuming for blackholing, get direct values ----------
 
-def blackhole_from_resumedata(blackholeinterpbuilder, jitdriver_sd, storage,
+def blackhole_from_resumedata(blackholeinterpbuilder, jitcodes,
+                              jitdriver_sd, storage,
                               deadframe, all_virtuals=None):
     # The initialization is stack-critical code: it must not be interrupted by
     # StackOverflow, otherwise the jit_virtual_refs are left in a dangling state.
@@ -1259,7 +1271,9 @@
     curbh = firstbh
     frameinfo = storage.rd_frame_info_list
     while True:
-        curbh.setposition(frameinfo.jitcode, frameinfo.pc)
+        jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
+        jitcode = jitcodes[jitcode_pos]
+        curbh.setposition(jitcode, pc)
         resumereader.consume_one_section(curbh)
         curbh = curbh.nextblackholeinterp
         frameinfo = frameinfo.prev
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -243,7 +243,8 @@
         verbose = False # not self.cpu.translate_support_code
         self.rewrite_access_helpers()
         self.create_jit_entry_points()
-        self.codewriter.make_jitcodes(verbose=verbose)
+        jitcodes = self.codewriter.make_jitcodes(verbose=verbose)
+        self.metainterp_sd.jitcodes = jitcodes
         self.rewrite_can_enter_jits()
         self.rewrite_set_param_and_get_stats()
         self.rewrite_force_virtual(vrefinfo)


More information about the pypy-commit mailing list