[pypy-commit] pypy jit-targets: hack to support aliased virtuals

hakanardo noreply at buildbot.pypy.org
Wed Nov 30 19:49:30 CET 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r50026:0b4126532f16
Date: 2011-11-30 09:22 +0100
http://bitbucket.org/pypy/pypy/changeset/0b4126532f16/

Log:	hack to support aliased virtuals

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
@@ -7041,6 +7041,26 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_imported_aliased_virtual_in_failargs(self):
+        ops = """
+        [p1, p2, i0]
+        i2 = int_lt(i0, 10)
+        guard_true(i2) [p1, p2]
+        p3 = new_with_vtable(ConstClass(node_vtable))
+        setfield_gc(p3, p3, descr=nextdescr)
+        p4 = getfield_gc(p3, descr=nextdescr)
+        i1 = int_add(i0, 1)
+        jump(p3, p4, i1)
+        """
+        expected = """
+        [i0]
+        i2 = int_lt(i0, 10)
+        guard_true(i2) []
+        i1 = int_add(i0, 1)        
+        jump(i1)
+        """
+        self.optimize_loop(ops, expected)
+
     def test_chained_virtuals(self):
         ops = """
         [p0, p1]
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
@@ -148,9 +148,13 @@
                 constant_inputargs[box] = const
 
         short_boxes = ShortBoxes(self.optimizer, inputargs + constant_inputargs.keys())
+        aliased_vrituals = {}
         for i in range(len(original_jump_args)):
-            if original_jump_args[i] is not jump_args[i] and not values[i].is_virtual():
-                short_boxes.alias(original_jump_args[i], jump_args[i])
+            if original_jump_args[i] is not jump_args[i]:
+                if values[i].is_virtual():
+                    aliased_vrituals[original_jump_args[i]] = jump_args[i] 
+                else:
+                    short_boxes.alias(original_jump_args[i], jump_args[i])
 
         self.optimizer.clear_newoperations()
         for box in short_inputargs:
@@ -166,7 +170,8 @@
         target_token.short_preamble = [ResOperation(rop.LABEL, short_inputargs, None)]
         target_token.start_resumedescr = start_resumedescr
         target_token.exported_state = ExportedState(constant_inputargs, short_boxes,
-                                                    inputarg_setup_ops, self.optimizer)
+                                                    inputarg_setup_ops, self.optimizer,
+                                                    aliased_vrituals)
 
     def import_state(self, targetop):
         self.did_import = False
@@ -229,6 +234,9 @@
         self.optimizer.flush()
         self.optimizer.emitting_dissabled = False
 
+        for box, key_box in exported_state.aliased_vrituals.items():
+            self.optimizer.make_equal_to(box, self.getvalue(key_box))
+
     def close_bridge(self, start_label):
         inputargs = self.inputargs        
         short_jumpargs = inputargs[:]
@@ -576,9 +584,9 @@
 
 class ExportedState(object):
     def __init__(self, constant_inputargs,
-                 short_boxes, inputarg_setup_ops, optimizer):
+                 short_boxes, inputarg_setup_ops, optimizer, aliased_vrituals):
         self.constant_inputargs = constant_inputargs
         self.short_boxes = short_boxes
         self.inputarg_setup_ops = inputarg_setup_ops
         self.optimizer = optimizer
-        
+        self.aliased_vrituals = aliased_vrituals


More information about the pypy-commit mailing list