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