[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