Author: fijal
Branch: jit-leaner-frontend
Changeset: r83360:f364f082cc14
Date: 2016-03-25 16:05 +0200
http://bitbucket.org/pypy/pypy/changeset/f364f082cc14/
Log: try to make an option for having two different models in case one
wants to have really long traces
diff --git a/rpython/config/translationoption.py
b/rpython/config/translationoption.py
--- a/rpython/config/translationoption.py
+++ b/rpython/config/translationoption.py
@@ -126,6 +126,9 @@
ChoiceOption("jit_profiler", "integrate profiler support into the JIT",
["off", "oprofile"],
default="off"),
+ ChoiceOption("jit_opencoder_model", "the model limits the maximal length"
+ " of traces. Use big if you want to go bigger than "
+ "the default", ["big", "normal"], default="normal"),
BoolOption("check_str_without_nul",
"Forbid NUL chars in strings in some external function calls",
default=False, cmdline=None),
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -4,6 +4,7 @@
from rpython.rlib.objectmodel import compute_unique_id, specialize
from rpython.rlib.rarithmetic import r_int64, is_valid_int
from rpython.rlib.rarithmetic import LONG_BIT, intmask, r_uint
+from rpython.rlib.jit import Counters
from rpython.conftest import option
@@ -12,6 +13,7 @@
opclasses
from rpython.jit.codewriter import heaptracker, longlong
import weakref
+from rpython.jit.metainterp import jitexc
# ____________________________________________________________
@@ -25,6 +27,15 @@
FAILARGS_LIMIT = 1000
+class SwitchToBlackhole(jitexc.JitException):
+ def __init__(self, reason, raising_exception=False):
+ self.reason = reason
+ self.raising_exception = raising_exception
+ # ^^^ must be set to True if the SwitchToBlackhole is raised at a
+ # point where the exception on metainterp.last_exc_value
+ # is supposed to be raised. The default False means that it
+ # should just be copied into the blackhole interp, but not raised.
+
def getkind(TYPE, supports_floats=True,
supports_longlong=True,
supports_singlefloats=True):
@@ -712,12 +723,23 @@
assert lltype.typeOf(value) == llmemory.GCREF
op.setref_base(value)
+ def _record_op(self, opnum, argboxes, descr=None):
+ from rpython.jit.metainterp.opencoder import FrontendTagOverflow
+
+ try:
+ return self.trace.record_op(opnum, argboxes, descr)
+ except FrontendTagOverflow:
+ # note that with the default settings this one should not
+ # happen - however if we hit that case, we don't get
+ # anything disabled
+ raise SwitchToBlackhole(Counters.ABORT_TOO_LONG)
+
@specialize.argtype(3)
def record(self, opnum, argboxes, value, descr=None):
if self.trace is None:
pos = 2**14 - 1
else:
- pos = self.trace.record_op(opnum, argboxes, descr)
+ pos = self._record_op(opnum, argboxes, descr)
if value is None:
op = FrontendOp(pos)
elif isinstance(value, bool):
@@ -735,7 +757,7 @@
def record_nospec(self, opnum, argboxes, descr=None):
tp = opclasses[opnum].type
- pos = self.trace.record_op(opnum, argboxes, descr)
+ pos = self._record_op(opnum, argboxes, descr)
if tp == 'v':
return FrontendOp(pos)
elif tp == 'i':
diff --git a/rpython/jit/metainterp/opencoder.py
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -19,21 +19,32 @@
TAGMASK = 0x3
TAGSHIFT = 2
-STORAGE_TP = rffi.USHORT
-MAX_SIZE = 2**16-1
+class Model:
+ STORAGE_TP = rffi.USHORT
+ # this is the initial size of the trace - note that we probably
+ # want something that would fit the inital "max_trace_length"
+ INIT_SIZE = 30000
+ MIN_SHORT = 0
+ MAX_SHORT = 2**16 - 1
+ check_range = True
+
+class BigModel:
+ INIT_SIZE = 30000
+ STORAGE_TP = lltype.Signed
+ check_range = False
+ # we can move SMALL ints here, if necessary
+
[email protected]()
+def get_model(self):
+ return getattr(self.metainterp_sd, 'opencoder_model', Model)
+
SMALL_INT_STOP = (2 ** (15 - TAGSHIFT)) - 1
SMALL_INT_START = -SMALL_INT_STOP # we might want to distribute them uneven
-MIN_SHORT = 0
-MAX_SHORT = 2**16 - 1
def expand_sizes_to_signed():
""" This function will make sure we can use sizes all the
way up to lltype.Signed for indexes everywhere
"""
- globals()['STORAGE_TP'] = lltype.Signed
- globals()['MAX_SIZE'] = 2**31-1
- globals()['MIN_SHORT'] = -2**31
- globals()['MAX_SHORT'] = 2**31 - 1
class FrontendTagOverflow(Exception):
pass
@@ -252,7 +263,8 @@
_deadranges = (-1, None)
def __init__(self, inputargs, metainterp_sd):
- self._ops = [rffi.cast(STORAGE_TP, 0)] * MAX_SIZE
+ self.metainterp_sd = metainterp_sd
+ self._ops = [rffi.cast(get_model(self).STORAGE_TP, 0)] *
get_model(self).INIT_SIZE
self._pos = 0
self._consts_bigint = 0
self._consts_float = 0
@@ -273,15 +285,16 @@
self._start = len(inputargs)
self._pos = self._start
self.inputargs = inputargs
- self.metainterp_sd = metainterp_sd
def append(self, v):
+ model = get_model(self)
if self._pos >= len(self._ops):
# grow by 2X
- self._ops = self._ops + [rffi.cast(STORAGE_TP, 0)] * len(self._ops)
- if not MIN_SHORT <= v <= MAX_SHORT:
- raise FrontendTagOverflow
- self._ops[self._pos] = rffi.cast(STORAGE_TP, v)
+ self._ops = self._ops + [rffi.cast(model.STORAGE_TP, 0)] *
len(self._ops)
+ if model.check_range:
+ if not model.MIN_SHORT <= v <= model.MAX_SHORT:
+ raise FrontendTagOverflow
+ self._ops[self._pos] = rffi.cast(model.STORAGE_TP, v)
self._pos += 1
def done(self):
@@ -387,16 +400,16 @@
return len(self._descrs) - 1 + len(self.metainterp_sd.all_descrs) + 1
def _list_of_boxes(self, boxes):
- array = [rffi.cast(STORAGE_TP, 0)] * len(boxes)
+ array = [rffi.cast(get_model(self).STORAGE_TP, 0)] * len(boxes)
for i in range(len(boxes)):
array[i] = self._encode_cast(boxes[i])
return array
def new_array(self, lgt):
- return [rffi.cast(STORAGE_TP, 0)] * lgt
+ return [rffi.cast(get_model(self).STORAGE_TP, 0)] * lgt
def _encode_cast(self, i):
- return rffi.cast(STORAGE_TP, self._encode(i))
+ return rffi.cast(get_model(self).STORAGE_TP, self._encode(i))
def create_top_snapshot(self, jitcode, pc, frame, flag, vable_boxes,
vref_boxes):
self._total_snapshots += 1
@@ -408,7 +421,7 @@
assert rffi.cast(lltype.Signed, self._ops[self._pos - 1]) == 0
# guards have no descr
self._snapshots.append(s)
- self._ops[self._pos - 1] = rffi.cast(STORAGE_TP, len(self._snapshots)
- 1)
+ self._ops[self._pos - 1] = rffi.cast(get_model(self).STORAGE_TP,
len(self._snapshots) - 1)
return s
def create_empty_top_snapshot(self, vable_boxes, vref_boxes):
@@ -420,7 +433,7 @@
assert rffi.cast(lltype.Signed, self._ops[self._pos - 1]) == 0
# guards have no descr
self._snapshots.append(s)
- self._ops[self._pos - 1] = rffi.cast(STORAGE_TP, len(self._snapshots)
- 1)
+ self._ops[self._pos - 1] = rffi.cast(get_model(self).STORAGE_TP,
len(self._snapshots) - 1)
return s
def create_snapshot(self, jitcode, pc, frame, flag):
@@ -474,8 +487,6 @@
return iter.inputargs, ops
def tag(kind, pos):
- #if not SMALL_INT_START <= pos < SMALL_INT_STOP:
- # raise some error
return (pos << TAGSHIFT) | kind
@specialize.ll()
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
@@ -8,7 +8,7 @@
from rpython.jit.metainterp import history, compile, resume, executor, jitexc
from rpython.jit.metainterp.heapcache import HeapCache
from rpython.jit.metainterp.history import (Const, ConstInt, ConstPtr,
- ConstFloat, TargetToken, MissingValue)
+ ConstFloat, TargetToken, MissingValue, SwitchToBlackhole)
from rpython.jit.metainterp.jitprof import EmptyProfiler
from rpython.jit.metainterp.logger import Logger
from rpython.jit.metainterp.optimizeopt.util import args_dict
@@ -3187,15 +3187,6 @@
"""Raised after we mutated metainterp.framestack, in order to force
it to reload the current top-of-stack frame that gets interpreted."""
-class SwitchToBlackhole(jitexc.JitException):
- def __init__(self, reason, raising_exception=False):
- self.reason = reason
- self.raising_exception = raising_exception
- # ^^^ must be set to True if the SwitchToBlackhole is raised at a
- # point where the exception on metainterp.last_exc_value
- # is supposed to be raised. The default False means that it
- # should just be copied into the blackhole interp, but not raised.
-
NOT_HANDLED = history.CONST_FALSE
# ____________________________________________________________
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
@@ -239,7 +239,8 @@
elif self.opt.listops:
self.prejit_optimizations_minimal_inline(policy, graphs)
- self.build_meta_interp(ProfilerClass)
+ self.build_meta_interp(ProfilerClass,
+ translator.config.translation.jit_opencoder_model)
self.make_args_specifications()
#
from rpython.jit.metainterp.virtualref import VirtualRefInfo
@@ -478,11 +479,16 @@
cpu.supports_singlefloats = False
self.cpu = cpu
- def build_meta_interp(self, ProfilerClass):
+ def build_meta_interp(self, ProfilerClass, opencoder_model):
+ from rpython.jit.metainterp.opencoder import Model, BigModel
self.metainterp_sd = MetaInterpStaticData(self.cpu,
self.opt,
ProfilerClass=ProfilerClass,
warmrunnerdesc=self)
+ if opencoder_model == 'big':
+ self.metainterp_sd.opencoder_model = BigModel
+ else:
+ self.metainterp_sd.opencoder_model = Model
self.stats.metainterp_sd = self.metainterp_sd
def make_virtualizable_infos(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit