[pypy-svn] r78723 - in pypy/branch/jit-unroll-loops/pypy/jit/metainterp: optimizeopt test
hakanardo at codespeak.net
hakanardo at codespeak.net
Fri Nov 5 11:49:06 CET 2010
Author: hakanardo
Date: Fri Nov 5 11:49:05 2010
New Revision: 78723
Modified:
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Keep track of boxes created in second iteration insted of trying to figure out all places where boxes were stored during the first. Fixes a problem with boxes proven to be consatant first after 2 iterations.
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/unroll.py Fri Nov 5 11:49:05 2010
@@ -40,15 +40,9 @@
assert len(loop_args) == len(jump_args)
for i in range(len(loop_args)):
argmap[loop_args[i]] = jump_args[i]
-
+
for v in self.optimizer.values.values():
v.last_guard_index = -1 # FIXME: Are there any more indexes stored?
- if not v.is_constant() and v.box:
- v.fromstart = True # XXX do we really need to use an attribute?
-
- for op in self.optimizer.pure_operations.values():
- v = self.getvalue(op.result)
- v.fromstart = True
self.snapshot_map = {None: None}
inputargs = []
@@ -83,29 +77,34 @@
#print 'P: ', str(newop)
self.emit_operation(newop)
- jmp = self.optimizer.newoperations[-1]
+ # Remove jump to make sure forced code are placed before it
+ newoperations = self.optimizer.newoperations
+ jmp = newoperations[-1]
assert jmp.getopnum() == rop.JUMP
+ self.optimizer.newoperations = newoperations[:-1]
+
+ boxes_created_this_iteration = {}
jumpargs = jmp.getarglist()
- for op in self.optimizer.newoperations:
+
+ # FIXME: Should also loop over operations added by forcing things in this loop
+ for op in newoperations:
#print 'E: ', str(op)
+ boxes_created_this_iteration[op.result] = True
args = op.getarglist()
if op.is_guard():
args = args + op.getfailargs()
for a in args:
- if not isinstance(a, Const) and a in self.optimizer.values:
- v = self.getvalue(a)
- if v.fromstart and not v.is_constant():
- b = v.force_box()
- if b not in inputargs:
- #boxes = []
- #v.enum_forced_boxes(boxes, seen_inputargs)
- #for b in boxes:
- inputargs.append(b)
- newval = self.getvalue(argmap[b])
- jumpargs.append(newval.force_box())
+ if not isinstance(a, Const) and not a in boxes_created_this_iteration:
+ if a not in inputargs:
+ inputargs.append(a)
+ b = self.getvalue(a).force_box()
+ if not isinstance(b, Const):
+ b = self.getvalue(argmap[b]).force_box()
+ jumpargs.append(b)
jmp.initarglist(jumpargs)
+ self.optimizer.newoperations.append(jmp)
return inputargs
def inline_arg(self, arg):
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py Fri Nov 5 11:49:05 2010
@@ -3932,6 +3932,69 @@
"""
self.optimize_loop(ops, expected, preamble)
+ def test_value_proven_to_be_constant_after_two_iterations(self):
+ class FakeDescr(AbstractDescr):
+ def __init__(self, name):
+ self.name = name
+ def sort_key(self):
+ return id(self)
+
+
+ for n in ('inst_w_seq', 'inst_index', 'inst_w_list', 'inst_length',
+ 'inst_start', 'inst_step'):
+ self.namespace[n] = FakeDescr(n)
+ ops = """
+ [p0, p1, p2, p3, i4, p5, i6, p7, p8, p9, p14]
+ guard_value(i4, 3) []
+ guard_class(p9, 17278984) []
+ guard_class(p9, 17278984) []
+ p22 = getfield_gc(p9, descr=inst_w_seq)
+ guard_nonnull(p22) []
+ i23 = getfield_gc(p9, descr=inst_index)
+ p24 = getfield_gc(p22, descr=inst_w_list)
+ guard_isnull(p24) []
+ i25 = getfield_gc(p22, descr=inst_length)
+ i26 = int_ge(i23, i25)
+ guard_true(i26) []
+ setfield_gc(p9, ConstPtr(myptr), descr=inst_w_seq)
+
+ guard_nonnull(p14) []
+ guard_class(p14, 17273920) []
+ guard_class(p14, 17273920) []
+
+ p75 = new_with_vtable(17278984)
+ setfield_gc(p75, p14, descr=inst_w_seq)
+ setfield_gc(p75, 0, descr=inst_index)
+ guard_class(p75, 17278984) []
+ guard_class(p75, 17278984) []
+ p79 = getfield_gc(p75, descr=inst_w_seq)
+ guard_nonnull(p79) []
+ i80 = getfield_gc(p75, descr=inst_index)
+ p81 = getfield_gc(p79, descr=inst_w_list)
+ guard_isnull(p81) []
+ i82 = getfield_gc(p79, descr=inst_length)
+ i83 = int_ge(i80, i82)
+ guard_false(i83) []
+ i84 = getfield_gc(p79, descr=inst_start)
+ i85 = getfield_gc(p79, descr=inst_step)
+ i86 = int_mul(i80, i85)
+ i87 = int_add(i84, i86)
+ i91 = int_add(i80, 1)
+ setfield_gc(p75, i91, descr=inst_index)
+
+ p110 = same_as(ConstPtr(myptr))
+ i112 = same_as(3)
+ i114 = same_as(39)
+ jump(p0, p1, p110, p3, i112, p5, i114, p7, p8, p75, p14)
+ """
+ expected = """
+ [p0, p1, p3, p5, p7, p8, p14, i82]
+ i115 = int_ge(1, i82)
+ guard_true(i115) []
+ jump(p0, p1, p3, p5, p7, p8, p14, 1)
+ """
+ self.optimize_loop(ops, expected)
+
# ----------
def optimize_strunicode_loop(self, ops, optops, preamble=None):
if not preamble:
More information about the Pypy-commit
mailing list