Author: Maciej Fijalkowski <[email protected]>
Branch: kill-gen-store-back-in
Changeset: r62771:b21e10d01f46
Date: 2013-03-25 17:08 -0700
http://bitbucket.org/pypy/pypy/changeset/b21e10d01f46/
Log: start working on removal of gen_store_back - for now we have a new
operation that checks if we have a fresh virtualizable
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -286,7 +286,7 @@
def get_savedata_ref(self, deadframe):
assert deadframe._saved_data is not None
return deadframe._saved_data
-
+
# ------------------------------------------------------------
def calldescrof(self, FUNC, ARGS, RESULT, effect_info):
@@ -334,7 +334,7 @@
except KeyError:
descr = InteriorFieldDescr(A, fieldname)
self.descrs[key] = descr
- return descr
+ return descr
def _calldescr_dynamic_for_tests(self, atypes, rtype,
abiname='FFI_DEFAULT_ABI'):
@@ -566,6 +566,10 @@
def bh_read_timestamp(self):
return read_timestamp()
+ def bh_force_virtualizable(self, v, descr):
+ vinfo = descr.vinfo
+ vinfo.clear_vable_token(v)
+
def store_fail_descr(self, deadframe, descr):
pass # I *think*
@@ -789,7 +793,7 @@
else:
ovf = False
self.overflow_flag = ovf
- return z
+ return z
def execute_guard_no_overflow(self, descr):
if self.overflow_flag:
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
@@ -1299,6 +1299,10 @@
from rpython.jit.metainterp import quasiimmut
quasiimmut.do_force_quasi_immutable(cpu, struct, mutatefielddescr)
+ @arguments("cpu", "r", "d")
+ def bhimpl_force_virtualizable(cpu, v, descr):
+ cpu.bh_force_virtualizable(v, descr)
+
@arguments("cpu", "d", returns="r")
def bhimpl_new(cpu, descr):
return cpu.bh_new(descr)
diff --git a/rpython/jit/metainterp/executor.py
b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -276,6 +276,9 @@
def do_keepalive(cpu, _, x):
pass
+def do_force_virtualizable(cpu, _, v, descr):
+ cpu.bh_force_virtualizable(v.getref_base(), descr)
+
# ____________________________________________________________
##def do_force_token(cpu):
diff --git a/rpython/jit/metainterp/heapcache.py
b/rpython/jit/metainterp/heapcache.py
--- a/rpython/jit/metainterp/heapcache.py
+++ b/rpython/jit/metainterp/heapcache.py
@@ -143,6 +143,7 @@
self.heap_cache.clear()
self.heap_array_cache.clear()
+ self.nonstandard_virtualizables.clear()
def is_class_known(self, box):
return box in self.known_class_boxes
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
@@ -603,7 +603,7 @@
def _opimpl_getfield_gc_greenfield_any(self, box, fielddescr, pc):
ginfo = self.metainterp.jitdriver_sd.greenfield_info
if (ginfo is not None and fielddescr in ginfo.green_field_descrs
- and not self._nonstandard_virtualizable(pc, box)):
+ and not self._nonstandard_virtualizable(pc, box, fielddescr)):
# fetch the result, but consider it as a Const box and don't
# record any operation
resbox = executor.execute(self.metainterp.cpu, self.metainterp,
@@ -699,7 +699,7 @@
raise SwitchToBlackhole(Counters.ABORT_FORCE_QUASIIMMUT)
self.generate_guard(rop.GUARD_ISNULL, mutatebox, resumepc=orgpc)
- def _nonstandard_virtualizable(self, pc, box):
+ def _nonstandard_virtualizable(self, pc, box, fielddescr):
# returns True if 'box' is actually not the "standard" virtualizable
# that is stored in metainterp.virtualizable_boxes[-1]
if (self.metainterp.jitdriver_sd.virtualizable_info is None and
@@ -710,6 +710,10 @@
return False
if self.metainterp.heapcache.is_nonstandard_virtualizable(box):
return True
+ vinfo = self.metainterp.jitdriver_sd.virtualizable_info
+ if vinfo is not fielddescr.vinfo:
+ self.metainterp.heapcache.nonstandard_virtualizables_now_known(box)
+ return True
eqbox = self.metainterp.execute_and_record(rop.PTR_EQ, None,
box, standard_box)
eqbox = self.implement_guard_value(eqbox, pc)
@@ -717,6 +721,9 @@
if isstandard:
self.metainterp.replace_box(box, standard_box)
else:
+ if not self.metainterp.heapcache.is_unescaped(box):
+ self.metainterp.execute_and_record(rop.FORCE_VIRTUALIZABLE,
+ fielddescr, box)
self.metainterp.heapcache.nonstandard_virtualizables_now_known(box)
return not isstandard
@@ -728,7 +735,7 @@
@arguments("box", "descr", "orgpc")
def _opimpl_getfield_vable(self, box, fielddescr, pc):
- if self._nonstandard_virtualizable(pc, box):
+ if self._nonstandard_virtualizable(pc, box, fielddescr):
return self._opimpl_getfield_gc_any(box, fielddescr)
self.metainterp.check_synchronized_virtualizable()
index = self._get_virtualizable_field_index(fielddescr)
@@ -740,7 +747,7 @@
@arguments("box", "box", "descr", "orgpc")
def _opimpl_setfield_vable(self, box, valuebox, fielddescr, pc):
- if self._nonstandard_virtualizable(pc, box):
+ if self._nonstandard_virtualizable(pc, box, fielddescr):
return self._opimpl_setfield_gc_any(box, valuebox, fielddescr)
index = self._get_virtualizable_field_index(fielddescr)
self.metainterp.virtualizable_boxes[index] = valuebox
@@ -770,7 +777,7 @@
@arguments("box", "box", "descr", "descr", "orgpc")
def _opimpl_getarrayitem_vable(self, box, indexbox, fdescr, adescr, pc):
- if self._nonstandard_virtualizable(pc, box):
+ if self._nonstandard_virtualizable(pc, box, fdescr):
arraybox = self._opimpl_getfield_gc_any(box, fdescr)
return self._opimpl_getarrayitem_gc_any(arraybox, indexbox, adescr)
self.metainterp.check_synchronized_virtualizable()
@@ -784,7 +791,7 @@
@arguments("box", "box", "box", "descr", "descr", "orgpc")
def _opimpl_setarrayitem_vable(self, box, indexbox, valuebox,
fdescr, adescr, pc):
- if self._nonstandard_virtualizable(pc, box):
+ if self._nonstandard_virtualizable(pc, box, fdescr):
arraybox = self._opimpl_getfield_gc_any(box, fdescr)
self._opimpl_setarrayitem_gc_any(arraybox, indexbox, valuebox,
adescr)
@@ -800,7 +807,7 @@
@arguments("box", "descr", "descr", "orgpc")
def opimpl_arraylen_vable(self, box, fdescr, adescr, pc):
- if self._nonstandard_virtualizable(pc, box):
+ if self._nonstandard_virtualizable(pc, box, fdescr):
arraybox = self._opimpl_getfield_gc_any(box, fdescr)
return self.opimpl_arraylen_gc(arraybox, adescr)
vinfo = self.metainterp.jitdriver_sd.virtualizable_info
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -494,6 +494,7 @@
'VIRTUAL_REF/2', # removed before it's passed to the backend
'READ_TIMESTAMP/0',
'MARK_OPAQUE_PTR/1b',
+ 'FORCE_VIRTUALIZABLE/1d', # forces a non-standard virtualizable
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
'SETARRAYITEM_GC/3d',
diff --git a/rpython/jit/metainterp/test/test_virtualizable.py
b/rpython/jit/metainterp/test/test_virtualizable.py
--- a/rpython/jit/metainterp/test/test_virtualizable.py
+++ b/rpython/jit/metainterp/test/test_virtualizable.py
@@ -73,7 +73,7 @@
x = xy.inst_x
xy.inst_x = x + 1
n -= 1
- promote_virtualizable(xy, 'inst_x')
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
res = self.meta_interp(f, [20])
assert res == 30
@@ -97,7 +97,7 @@
x = xy.inst_x
xy.inst_x = x + 10
n -= 1
- promote_virtualizable(xy, 'inst_x')
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
assert f(5) == 185
res = self.meta_interp(f, [5])
@@ -118,10 +118,10 @@
x = xy.inst_x
if n <= 10:
x += 1000
- promote_virtualizable(xy, 'inst_x')
+ promote_virtualizable(xy, 'inst_x')
xy.inst_x = x + 1
n -= 1
- promote_virtualizable(xy, 'inst_x')
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
res = self.meta_interp(f, [18])
assert res == 10118
@@ -164,7 +164,7 @@
xy.inst_x = x + 1
m = (m+1) & 3 # the loop gets unrolled 4 times
n -= 1
- promote_virtualizable(xy, 'inst_x')
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
def f(n):
res = 0
@@ -194,11 +194,11 @@
promote_virtualizable(xy, 'inst_x')
xy.inst_x = value + 100 # virtualized away
n -= 1
- promote_virtualizable(xy, 'inst_x')
+ promote_virtualizable(xy, 'inst_x')
return xy.inst_x
res = self.meta_interp(f, [20])
assert res == 134
- self.check_simple_loop(setfield_gc=1, getfield_gc=0)
+ self.check_simple_loop(setfield_gc=1, getfield_gc=0,
force_virtualizable=1)
self.check_resops(setfield_gc=2, getfield_gc=3)
# ------------------------------
@@ -241,11 +241,11 @@
while n > 0:
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
- promote_virtualizable(xy2, 'inst_l1')
+ promote_virtualizable(xy2, 'inst_l1')
promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l1[2] += xy2.inst_l2[0]
n -= 1
- promote_virtualizable(xy2, 'inst_l1')
+ promote_virtualizable(xy2, 'inst_l1')
return xy2.inst_l1[2]
res = self.meta_interp(f, [16])
assert res == 3001 + 16 * 80
@@ -292,7 +292,7 @@
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
promote_virtualizable(xy2, 'inst_l1')
- promote_virtualizable(xy2, 'inst_l2')
+ promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l1[1] += len(xy2.inst_l2)
n -= 1
def f(n):
@@ -373,7 +373,7 @@
promote_virtualizable(xy2, 'inst_l2')
xy2.inst_l2[0] = value + 100 # virtualized away
n -= 1
- promote_virtualizable(xy2, 'inst_l2')
+ promote_virtualizable(xy2, 'inst_l2')
return xy2.inst_l2[0]
expected = f(20)
res = self.meta_interp(f, [20], enable_opts='')
@@ -406,8 +406,8 @@
myjitdriver.can_enter_jit(xy2=xy2, n=n)
myjitdriver.jit_merge_point(xy2=xy2, n=n)
parent = xy2.parent
- promote_virtualizable(parent, 'inst_x')
- promote_virtualizable(parent, 'inst_l2')
+ promote_virtualizable(parent, 'inst_x')
+ promote_virtualizable(parent, 'inst_l2')
parent.inst_l2[0] += parent.inst_x
n -= 1
def f(n):
@@ -473,7 +473,7 @@
def __init__(self, l, s):
self.l = l
self.s = s
-
+
def f(n, a):
frame = Frame([a,a+1,a+2,a+3], 0)
x = 0
@@ -560,7 +560,7 @@
def test_external_read(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -592,7 +592,7 @@
def test_external_read_with_exception(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -663,7 +663,7 @@
def test_external_read_sometimes(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -699,7 +699,7 @@
def test_external_read_sometimes_with_virtuals(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class Y:
@@ -742,7 +742,7 @@
def test_external_read_sometimes_changing_virtuals(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class Y:
@@ -790,7 +790,7 @@
def test_external_read_sometimes_with_exception(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class FooBarError(Exception):
@@ -832,7 +832,7 @@
def test_external_read_sometimes_dont_compile_guard(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -868,7 +868,7 @@
def test_external_read_sometimes_recursive(self):
jitdriver = JitDriver(greens = [], reds = ['rec', 'frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -919,7 +919,7 @@
def test_external_write_sometimes(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -955,7 +955,7 @@
def test_bridge_forces(self):
jitdriver = JitDriver(greens = [], reds = ['frame'],
virtualizables = ['frame'])
-
+
class Frame(object):
_virtualizable2_ = ['x', 'y']
class SomewhereElse:
@@ -1262,7 +1262,7 @@
somewhere_else = SomewhereElse()
def jump_back(frame, fail):
- myjitdriver.can_enter_jit(frame=frame, fail=fail)
+ myjitdriver.can_enter_jit(frame=frame, fail=fail)
def f(n, fail):
frame = Frame(n, 0)
@@ -1428,7 +1428,7 @@
OOJitMixin):
pass
-
+
class TestLLtype(ExplicitVirtualizableTests,
ImplicitVirtualizableTests,
LLJitMixin):
diff --git a/rpython/jit/metainterp/virtualizable.py
b/rpython/jit/metainterp/virtualizable.py
--- a/rpython/jit/metainterp/virtualizable.py
+++ b/rpython/jit/metainterp/virtualizable.py
@@ -65,6 +65,12 @@
for name in static_fields]
self.array_field_descrs = [cpu.fielddescrof(VTYPE, name)
for name in array_fields]
+
+ for descr in self.static_field_descrs:
+ descr.vinfo = self
+ for descr in self.array_field_descrs:
+ descr.vinfo = self
+
self.static_field_by_descrs = dict(
[(descr, i) for (i, descr) in enumerate(self.static_field_descrs)])
self.array_field_by_descrs = dict(
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit