Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r45768:5c992bef0561
Date: 2011-07-20 10:19 +0200
http://bitbucket.org/pypy/pypy/changeset/5c992bef0561/

Log:    allow boxes to be replaced during initial setup of the peeled loop
        optimizer

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -6460,12 +6460,25 @@
         call(i843, descr=nonwritedescr)
         jump(p9)
         """
+        preamble = """
+        [p9]
+        i843 = strlen(p9)
+        call(i843, descr=nonwritedescr)
+        jump(p9, i843)
+        """
+        short = """
+        [p9]
+        i843 = strlen(p9)
+        i848 = int_ge(i843, 0)
+        guard_true(i848)[]
+        jump(p9, i843)
+        """
         expected = """
         [p9, i2]
         call(i2, descr=nonwritedescr)
         jump(p9, i2)
         """
-        self.optimize_loop(ops, expected)
+        self.optimize_loop(ops, expected, preamble, expected_short=short)
 
     def test_loopinvariant_strlen_with_bound(self):
         ops = """
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
@@ -241,6 +241,10 @@
                     value = preamble_optimizer.getvalue(op.result)
                     for guard in value.make_guards(op.result):
                         self.optimizer.send_extra_operation(guard)
+                    newresult = 
self.optimizer.getvalue(op.result).get_key_box()
+                    if newresult is not op.result:
+                        self.short_boxes.alias(newresult, op.result)
+                    
             self.optimizer.flush()
             self.optimizer.emitting_dissabled = False
 
@@ -259,7 +263,8 @@
             #    preamble_optimizer.send_extra_operation(jumpop)
             #    return
             loop.inputargs = inputargs
-            jmp = ResOperation(rop.JUMP, loop.inputargs[:], None)
+            args = [self.short_boxes.original(a) for a in inputargs]
+            jmp = ResOperation(rop.JUMP, args, None)
             jmp.setdescr(loop.token)
             loop.preamble.operations.append(jmp)
 
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py 
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -458,6 +458,7 @@
         self.potential_ops = {}
         optimizer.produce_potential_short_preamble_ops(self)
             
+        self.aliases = {}
         self.short_boxes = {}
         for box in surviving_boxes:
             self.short_boxes[box] = None
@@ -502,3 +503,11 @@
     def has_producer(self, box):
         return box in self.short_boxes
     
+    def alias(self, newbox, oldbox):
+        self.short_boxes[newbox] = self.short_boxes[oldbox]
+        self.aliases[newbox] = oldbox
+        
+    def original(self, box):
+        while box in self.aliases:
+            box = self.aliases[box]
+        return box
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to