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

Reply via email to