Author: Maciej Fijalkowski <[email protected]>
Branch: improve-consecutive-dict-lookups
Changeset: r70007:ae17d4126ade
Date: 2014-03-17 11:46 +0200
http://bitbucket.org/pypy/pypy/changeset/ae17d4126ade/
Log: pass the first test
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -1,6 +1,7 @@
import os
from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.jit.metainterp.optimizeopt.util import args_dict
from rpython.jit.metainterp.history import Const
from rpython.jit.metainterp.jitexc import JitException
from rpython.jit.metainterp.optimizeopt.optimizer import Optimization,
MODE_ARRAY, LEVEL_KNOWNCLASS
@@ -169,6 +170,7 @@
self.cached_fields = {}
# cached array items: {array descr: {index: CachedField}}
self.cached_arrayitems = {}
+ # cached dict items: {dict descr: {(optval, index): box-or-const}}
self.cached_dict_reads = {}
#
self._lazy_setfields_and_arrayitems = []
@@ -177,9 +179,11 @@
self.postponed_op = None
def force_at_end_of_preamble(self):
+ self.cached_dict_reads.clear()
self.force_all_lazy_setfields_and_arrayitems()
def flush(self):
+ self.cached_dict_reads.clear()
self.force_all_lazy_setfields_and_arrayitems()
if self.postponed_op:
postponed_op = self.postponed_op
@@ -208,6 +212,7 @@
del self._lazy_setfields_and_arrayitems[:]
self.cached_fields.clear()
self.cached_arrayitems.clear()
+ self.cached_dict_reads.clear()
def field_cache(self, descr):
try:
@@ -291,7 +296,22 @@
self.emit_operation(op)
def _optimize_CALL_DICT_LOOKUP(self, op):
- xxx
+ args = self.optimizer.make_args_key(op)
+ descr = op.getdescr()
+ res_v = self.getvalue(op.result)
+ if descr in self.cached_dict_reads:
+ d = self.cached_dict_reads[descr]
+ else:
+ d = args_dict()
+ try:
+ res_v = d[args]
+ self.optimizer.make_equal_to(op.result, res_v, True)
+ res = True
+ except KeyError:
+ d[args] = res_v
+ res = False
+ self.cached_dict_reads[descr] = d
+ return res
def force_from_effectinfo(self, effectinfo):
# XXX we can get the wrong complexity here, if the lists
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit