Author: Hakan Ardo <ha...@debian.org> Branch: jit-short_from_state Changeset: r45186:65d00e745124 Date: 2011-06-29 18:43 +0200 http://bitbucket.org/pypy/pypy/changeset/65d00e745124/
Log: enable getfield_gc in short preamble diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py --- a/pypy/jit/metainterp/optimizeopt/heap.py +++ b/pypy/jit/metainterp/optimizeopt/heap.py @@ -98,7 +98,7 @@ cf = CachedField() for structvalue, fieldvalue in self._cached_fields.iteritems(): op = self._cached_fields_getfield_op.get(structvalue, None) - if op and op.result in short_boxes: + if op and op.result in short_boxes and short_boxes[op.result] is op: structvalue2 = structvalue.get_cloned(optimizer, valuemap) fieldvalue2 = fieldvalue .get_cloned(optimizer, valuemap) cf._cached_fields[structvalue2] = fieldvalue2 @@ -146,10 +146,10 @@ def reconstruct_for_next_iteration(self, short_boxes, surviving_boxes, optimizer, valuemap): new = OptHeap() - return new for descr, d in self.cached_fields.items(): new.cached_fields[descr] = d.get_cloned(optimizer, valuemap, short_boxes) + return new new.cached_arrayitems = {} for descr, d in self.cached_arrayitems.items(): @@ -175,10 +175,10 @@ return new def produce_potential_short_preamble_ops(self, potential_ops): - return for descr, d in self.cached_fields.items(): d.produce_potential_short_preamble_ops(self.optimizer, potential_ops, descr) + return for descr, d in self.cached_arrayitems.items(): for value, cache in d.items(): diff --git a/pypy/jit/metainterp/test/test_virtual.py b/pypy/jit/metainterp/test/test_virtual.py --- a/pypy/jit/metainterp/test/test_virtual.py +++ b/pypy/jit/metainterp/test/test_virtual.py @@ -919,6 +919,30 @@ res = self.meta_interp(f, [16]) assert res == f(16) + + def test_virtual_loop_invariant_getitem(self): + mydriver = JitDriver(reds = ['i', 'sa', 'n', 'node1', 'node2'], greens = []) + class A(object): + def __init__(self, v1, v2): + self.v1 = v1 + self.v2 = v2 + def f(n): + i = sa = 0 + node1 = A(1, 2) + node2 = A(n, n) + while i < n: + mydriver.jit_merge_point(i=i, sa=sa, n=n, node1=node1, node2=node2) + sa += node1.v1 + node2.v1 + node2.v2 + if i < n/2: + node1 = A(node2.v1, 2) + else: + node1 = A(i, 2) + i += 1 + return sa + + res = self.meta_interp(f, [16]) + assert res == f(16) + self.check_loops(getfield_gc=2) # ____________________________________________________________ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit