Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r44468:a7d6860a7031
Date: 2011-05-25 17:34 +0200
http://bitbucket.org/pypy/pypy/changeset/a7d6860a7031/

Log:    flush out any posponed op (such as lazy setfields) before fixing
        jumpargs

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
@@ -139,6 +139,9 @@
 
     def force_at_end_of_preamble(self):
         self.force_all_lazy_setfields()
+
+    def flush(self):
+        self.force_all_lazy_setfields()        
         
     def reconstruct_for_next_iteration(self,  short_boxes, surviving_boxes,
                                        optimizer, valuemap):
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py 
b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -18,6 +18,9 @@
         assert self.posponedop is None
         return OptIntBounds()
 
+    def flush(self):
+        assert self.posponedop is None
+        
     def propagate_forward(self, op):
         if op.is_ovf():
             self.posponedop = op
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py 
b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -294,6 +294,10 @@
                                        optimizer=None, valuemap=None):
         raise NotImplementedError
 
+    # Called after last operation has been propagated to flush out any 
posponed ops
+    def flush(self):
+        pass
+
     def produce_potential_short_preamble_ops(self, potential_ops):
         pass
 
@@ -341,6 +345,11 @@
     def force_at_end_of_preamble(self):
         for o in self.optimizations:
             o.force_at_end_of_preamble()
+
+    def flush(self):
+        for o in self.optimizations:
+            o.flush()
+        assert self.posponedop is None
             
     def reconstruct_for_next_iteration(self, short_boxes, surviving_boxes=None,
                                        optimizer=None, valuemap=None):
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py 
b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -155,6 +155,7 @@
             assert jumpop.getdescr() is loop.token
             jump_args = jumpop.getarglist()
             jumpop.initarglist([])
+            self.optimizer.flush()
 
             loop.preamble.operations = self.optimizer.newoperations
 
@@ -200,6 +201,7 @@
             inputargs, short_inputargs, short = 
self.inline(self.cloned_operations,
                                            loop.inputargs, jump_args,
                                            virtual_state)
+            
             #except KeyError:
             #    debug_print("Unrolling failed.")
             #    loop.preamble.operations = None
@@ -298,6 +300,8 @@
                 for op in self.getvalue(result).make_guards(result):
                     self.add_op_to_short(op, short, short_seen)
 
+        self.optimizer.flush()
+
         i = j = 0
         while i < len(self.optimizer.newoperations):
             op = self.optimizer.newoperations[i]
@@ -350,6 +354,7 @@
         
     def import_box(self, box, inputargs, short, short_jumpargs,
                    jumpargs, short_seen):
+
         if isinstance(box, Const) or box in inputargs:
             return
         if box in self.boxes_created_this_iteration:
diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py 
b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -6335,3 +6335,70 @@
         jump(ConstPtr(myptr))
         """
         self.optimize_loop(ops, expected)
+
+    def test_dont_cache_setfields(self):
+        # Caching the last two getfields here would specialize the loop to the 
state where
+        # the first two getfields return the same value. This state needs to 
be guarded for
+        # in the short preamble.
+        ops = """
+        [p0, p1, ii, ii2]
+        i1 = getfield_gc(p0, descr=valuedescr)
+        i2 = getfield_gc(p1, descr=otherdescr)
+        i3 = int_add(i1, i2)
+        setfield_gc(p0, ii, descr=valuedescr)
+        setfield_gc(p1, ii, descr=otherdescr)
+        i4 = getfield_gc(p0, descr=valuedescr)
+        i5 = getfield_gc(p1, descr=otherdescr)
+        jump(p0, p1, ii2, ii)
+        """
+        expected = """
+        [p0, p1, ii, ii2]
+        i1 = getfield_gc(p0, descr=valuedescr)
+        i2 = getfield_gc(p1, descr=otherdescr)
+        i3 = int_add(i1, i2)
+        setfield_gc(p0, ii, descr=valuedescr)
+        setfield_gc(p1, ii, descr=otherdescr)
+        jump(p0, p1, ii2, ii)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_dont_specialize_on_boxes_equal(self):
+        ops = """
+        [p0, p1, p3, ii, ii2]
+        i1 = getfield_gc(p0, descr=valuedescr)
+        i2 = getfield_gc(p1, descr=otherdescr)
+        setfield_gc(p3, i1, descr=adescr)
+        setfield_gc(p3, i2, descr=bdescr)
+        i4 = int_eq(i1, i2)
+        guard_true(i4) []
+        i5 = int_gt(ii, 42)
+        guard_true(i5) []
+        jump(p0, p1, p3, ii2, ii)
+        """
+        expected = """
+        [p0, p1, p3, ii, ii2, i1, i2]
+        setfield_gc(p3, i1, descr=adescr)
+        setfield_gc(p3, i2, descr=bdescr)
+        i5 = int_gt(ii, 42)
+        guard_true(i5) []        
+        jump(p0, p1, p3, ii2, ii, i1, i2)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_lazy_setfield_forced_by_jump_needing_additionall_inputargs(self):
+        ops = """
+        [p0, p3]
+        i1 = getfield_gc(p0, descr=valuedescr)
+        setfield_gc(p3, i1, descr=otherdescr)
+        jump(p0, p3)
+        """
+        expected = """
+        [p0, p3, i1]
+        setfield_gc(p3, i1, descr=otherdescr)
+        jump(p0, p3, i1)
+        """
+        self.optimize_loop(ops, expected)
+        
+    def test_forcing_jumpargs_resulting_in_additional_inputargs_needed(self):
+        #FIXME
+        assert False
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to