Author: Armin Rigo <[email protected]>
Branch: jit-counter
Changeset: r67743:c5a737d0b87a
Date: 2013-10-30 18:17 +0100
http://bitbucket.org/pypy/pypy/changeset/c5a737d0b87a/
Log: still in-progress
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2208,7 +2208,10 @@
raise NotImplementedError(opname[opnum])
def get_procedure_token(self, greenkey, with_compiled_targets=False):
- cell = self.jitdriver_sd.warmstate.jit_cell_at_key(greenkey)
+ JitCell = self.jitdriver_sd.warmstate.JitCell
+ cell = JitCell.get_jit_cell_at_key(greenkey)
+ if cell is None:
+ return None
token = cell.get_procedure_token()
if with_compiled_targets:
if not token:
diff --git a/rpython/jit/metainterp/test/support.py
b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -28,8 +28,8 @@
class FakeWarmRunnerState(object):
def attach_procedure_to_interp(self, greenkey, procedure_token):
- cell = self.jit_cell_at_key(greenkey)
- cell.set_procedure_token(procedure_token)
+ assert greenkey == []
+ self._cell.set_procedure_token(procedure_token)
def helper_func(self, FUNCPTR, func):
from rpython.rtyper.annlowlevel import llhelper
@@ -38,9 +38,11 @@
def get_location_str(self, args):
return 'location'
- def jit_cell_at_key(self, greenkey):
- assert greenkey == []
- return self._cell
+ class JitCell:
+ @staticmethod
+ def get_jit_cell_at_key(greenkey):
+ assert greenkey == []
+ return FakeWarmRunnerState._cell
_cell = FakeJitCell()
trace_limit = sys.maxint
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
@@ -512,12 +512,6 @@
jd._maybe_compile_and_run_fn = maybe_compile_and_run
def make_driverhook_graphs(self):
- from rpython.rlib.jit import BaseJitCell
- bk = self.rtyper.annotator.bookkeeper
- classdef = bk.getuniqueclassdef(BaseJitCell)
- s_BaseJitCell_or_None = annmodel.SomeInstance(classdef,
- can_be_None=True)
- s_BaseJitCell_not_None = annmodel.SomeInstance(classdef)
s_Str = annmodel.SomeString()
#
annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
diff --git a/rpython/jit/metainterp/warmstate.py
b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -236,7 +236,7 @@
self.warmrunnerdesc.memory_manager.max_unroll_loops = value
def disable_noninlinable_function(self, greenkey):
- cell = self.jit_cell_at_key(greenkey)
+ cell = self.JitCell.ensure_jit_cell_at_key(greenkey)
cell.dont_trace_here = chr(20)
debug_start("jit-disableinlining")
loc = self.get_location_str(greenkey)
@@ -244,7 +244,7 @@
debug_stop("jit-disableinlining")
def attach_procedure_to_interp(self, greenkey, procedure_token):
- cell = self.jit_cell_at_key(greenkey)
+ cell = self.JitCell.ensure_jit_cell_at_key(greenkey)
old_token = cell.get_procedure_token()
cell.set_procedure_token(procedure_token)
if old_token is not None:
@@ -332,7 +332,9 @@
"""
# Look for the cell corresponding to the current greenargs.
# Search for the JitCell that is of the correct subclass of
- # BaseJitCell, and that stores a key that compares equal
+ # BaseJitCell, and that stores a key that compares equal.
+ # These few lines inline some logic that is also on the
+ # JitCell class, to avoid computing the hash several times.
greenargs = args[:num_green_args]
index = JitCell.get_index(*greenargs)
cell = jitcounter.lookup_chain(index)
@@ -410,6 +412,7 @@
jitdriver_sd = self.jitdriver_sd
green_args_spec = unrolling_iterable([('g%d' % i, TYPE)
for i, TYPE in enumerate(jitdriver_sd._green_args_spec)])
+ unwrap_greenkey = self.make_unwrap_greenkey()
#
class JitCell(BaseJitCell):
def __init__(self, *greenargs):
@@ -437,6 +440,34 @@
x = intmask((x ^ y) * 1405695061) # prime number, 2**30~31
i = i + 1
return jitcounter.get_index(x)
+
+ @staticmethod
+ def get_jitcell(*greenargs):
+ index = JitCell.get_index(*greenargs)
+ cell = jitcounter.lookup_chain(index)
+ while cell is not None:
+ if (isinstance(cell, JitCell) and
+ cell.comparekey(*greenargs)):
+ return cell
+ return None
+
+ @staticmethod
+ def get_jit_cell_at_key(greenkey):
+ greenargs = unwrap_greenkey(greenkey)
+ return JitCell.get_jitcell(*greenargs)
+
+ @staticmethod
+ def ensure_jit_cell_at_key(greenkey):
+ greenargs = unwrap_greenkey(greenkey)
+ index = JitCell.get_index(*greenargs)
+ cell = jitcounter.lookup_chain(index)
+ while cell is not None:
+ if (isinstance(cell, JitCell) and
+ cell.comparekey(*greenargs)):
+ return cell
+ newcell = JitCell(*greenargs)
+ jitcounter.install_new_cell(index, newcell)
+ return newcell
#
self.JitCell = JitCell
return JitCell
@@ -449,14 +480,14 @@
#
warmrunnerdesc = self.warmrunnerdesc
unwrap_greenkey = self.make_unwrap_greenkey()
- jit_getter = self.make_jitcell_getter()
+ JitCell = self.make_jitcell_subclass()
jd = self.jitdriver_sd
cpu = self.cpu
def can_inline_greenargs(*greenargs):
if can_never_inline(*greenargs):
return False
- cell = jit_getter(False, *greenargs)
+ cell = JitCell.get_jitcell(*greenargs)
if cell is not None and ord(cell.dont_trace_here) != 0:
return False
return True
@@ -481,7 +512,7 @@
redargtypes = ''.join([kind[0] for kind in jd.red_args_types])
def get_assembler_token(greenkey):
- cell = self.jit_cell_at_key(greenkey)
+ cell = self.ensure_jit_cell_at_key(greenkey)
procedure_token = cell.get_procedure_token()
if procedure_token is None:
from rpython.jit.metainterp.compile import compile_tmp_callback
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit