[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