Author: Hakan Ardo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit