Author: Carl Friedrich Bolz <[email protected]>
Branch:
Changeset: r78166:11818af6e56c
Date: 2015-06-18 10:44 +0200
http://bitbucket.org/pypy/pypy/changeset/11818af6e56c/
Log: don't create HeapCacheValue entries just to escape them
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
@@ -98,9 +98,9 @@
self.heap_cache = {}
self.heap_array_cache = {}
- def getvalue(self, box):
+ def getvalue(self, box, create=True):
value = self.values.get(box, None)
- if not value:
+ if not value and create:
value = self.values[box] = HeapCacheValue(box)
return value
@@ -111,25 +111,26 @@
self.mark_escaped(opnum, descr, argboxes)
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)
+
def mark_escaped(self, opnum, descr, argboxes):
if opnum == rop.SETFIELD_GC:
assert len(argboxes) == 2
- value, fieldvalue = self.getvalues(argboxes)
- if value.is_unescaped and fieldvalue.is_unescaped:
- if value.dependencies is None:
- value.dependencies = []
- value.dependencies.append(fieldvalue)
- else:
- self._escape(fieldvalue)
+ box, fieldbox = argboxes
+ self._escape_from_write(box, fieldbox)
elif opnum == rop.SETARRAYITEM_GC:
assert len(argboxes) == 3
- value, indexvalue, fieldvalue = self.getvalues(argboxes)
- if value.is_unescaped and fieldvalue.is_unescaped:
- if value.dependencies is None:
- value.dependencies = []
- value.dependencies.append(fieldvalue)
- else:
- self._escape(fieldvalue)
+ box, indexbox, fieldbox = argboxes
+ self._escape_from_write(box, fieldbox)
elif (opnum == rop.CALL and
descr.get_extra_info().oopspecindex ==
descr.get_extra_info().OS_ARRAYCOPY and
isinstance(argboxes[3], ConstInt) and
@@ -153,7 +154,7 @@
self._escape_box(box)
def _escape_box(self, box):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if not value:
return
self._escape(value)
@@ -261,7 +262,7 @@
self.reset_keep_likely_virtuals()
def is_class_known(self, box):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value:
return value.known_class
return False
@@ -270,7 +271,7 @@
self.getvalue(box).known_class = True
def is_nonstandard_virtualizable(self, box):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value:
return value.nonstandard_virtualizable
return False
@@ -279,13 +280,13 @@
self.getvalue(box).nonstandard_virtualizable = True
def is_unescaped(self, box):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value:
return value.is_unescaped
return False
def is_likely_virtual(self, box):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value:
return value.likely_virtual
return False
@@ -301,7 +302,7 @@
self.arraylen_now_known(box, lengthbox)
def getfield(self, box, descr):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value:
cache = self.heap_cache.get(descr, None)
if cache:
@@ -329,7 +330,7 @@
def getarrayitem(self, box, indexbox, descr):
if not isinstance(indexbox, ConstInt):
return None
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value is None:
return None
index = indexbox.getint()
@@ -373,7 +374,7 @@
indexcache.do_write_with_aliasing(value, fieldvalue)
def arraylen(self, box):
- value = self.values.get(box, None)
+ value = self.getvalue(box, create=False)
if value and value.length:
return value.length.box
return None
@@ -383,7 +384,7 @@
value.length = self.getvalue(lengthbox)
def replace_box(self, oldbox, newbox):
- value = self.values.get(oldbox, None)
+ value = self.getvalue(oldbox, create=False)
if value is None:
return
value.box = newbox
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit