[pypy-commit] pypy heapcache-refactor: escape
arigo
pypy.commits at gmail.com
Thu Mar 17 10:54:20 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: heapcache-refactor
Changeset: r83111:1d11223aec92
Date: 2016-03-17 15:53 +0100
http://bitbucket.org/pypy/pypy/changeset/1d11223aec92/
Log: escape
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
@@ -90,7 +90,7 @@
def _invalidate_unescaped(self, d):
for ref_box in d.keys():
- if not self.heapcache._check_flag(ref_box, HF_IS_UNESCAPED):
+ if not self.heapcache.is_unescaped(ref_box):
del d[ref_box]
@@ -168,15 +168,11 @@
self.clear_caches(opnum, descr, argboxes)
def _escape_from_write(self, box, fieldbox):
- value = self.getvalue(box, create=False)
- fieldvalue = self.getvalue(fieldbox, create=False)
- if (value is not None and value.is_unescaped and
- fieldvalue is not None and fieldvalue.is_unescaped):
- if value.dependencies is None:
- value.dependencies = []
- value.dependencies.append(fieldvalue)
- elif fieldvalue is not None:
- self._escape(fieldvalue)
+ if self.is_unescaped(box) and self.is_unescaped(fieldbox):
+ deps = self._get_deps(box)
+ deps.append(fieldbox)
+ elif fieldbox is not None:
+ self._escape_box(fieldbox)
def mark_escaped(self, opnum, descr, argboxes):
if opnum == rop.SETFIELD_GC:
@@ -213,15 +209,18 @@
def _escape_box(self, box):
if isinstance(box, RefFrontendOp):
remove_flags(box, HF_LIKELY_VIRTUAL | HF_IS_UNESCAPED)
- deps = self._get_deps(box)
- if deps is not None and len(deps) > 1:
- # 'deps[0]' is abused to store the array length, keep it
- if deps[0] is None:
+ deps = box._heapc_deps
+ if deps is not None:
+ if not self.test_head_version(box):
box._heapc_deps = None
else:
- box._heapc_deps = [deps[0]]
- for i in range(1, len(deps)):
- self._escape(deps[i])
+ # 'deps[0]' is abused to store the array length, keep it
+ if deps[0] is None:
+ box._heapc_deps = None
+ else:
+ box._heapc_deps = [deps[0]]
+ for i in range(1, len(deps)):
+ self._escape_box(deps[i])
def clear_caches(self, opnum, descr, argboxes):
if (opnum == rop.SETFIELD_GC or
diff --git a/rpython/jit/metainterp/test/test_heapcache.py b/rpython/jit/metainterp/test/test_heapcache.py
--- a/rpython/jit/metainterp/test/test_heapcache.py
+++ b/rpython/jit/metainterp/test/test_heapcache.py
@@ -582,6 +582,8 @@
def test_unescaped(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box2 = RefFrontendOp(2)
assert not h.is_unescaped(box1)
h.new(box2)
assert h.is_unescaped(box2)
@@ -592,6 +594,9 @@
def test_unescaped_testing(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box2 = RefFrontendOp(2)
+ box3 = RefFrontendOp(3)
h.new(box1)
h.new(box2)
assert h.is_unescaped(box1)
@@ -610,6 +615,8 @@
def test_ops_dont_escape(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box2 = RefFrontendOp(2)
h.new(box1)
h.new(box2)
assert h.is_unescaped(box1)
@@ -623,6 +630,9 @@
def test_circular_virtuals(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box2 = RefFrontendOp(2)
+ box3 = RefFrontendOp(3)
h.new(box1)
h.new(box2)
h.invalidate_caches(rop.SETFIELD_GC, None, [box1, box2])
@@ -631,6 +641,10 @@
def test_unescaped_array(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box2 = RefFrontendOp(2)
+ lengthbox1 = IntFrontendOp(11)
+ lengthbox2 = IntFrontendOp(12)
h.new_array(box1, lengthbox1)
assert h.is_unescaped(box1)
h.invalidate_caches(rop.SETARRAYITEM_GC, None, [box1, index1, box2])
@@ -654,6 +668,8 @@
def test_call_doesnt_invalidate_unescaped_boxes(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box2 = RefFrontendOp(2)
h.new(box1)
assert h.is_unescaped(box1)
h.setfield(box1, box2, descr1)
@@ -665,6 +681,9 @@
def test_call_doesnt_invalidate_unescaped_array_boxes(self):
h = HeapCache()
+ box1 = RefFrontendOp(1)
+ box3 = RefFrontendOp(3)
+ lengthbox1 = IntFrontendOp(11)
h.new_array(box1, lengthbox1)
assert h.is_unescaped(box1)
h.setarrayitem(box1, index1, box3, descr1)
More information about the pypy-commit
mailing list