[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