Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79328:00a0ca84a79d
Date: 2015-08-31 19:12 +0200
http://bitbucket.org/pypy/pypy/changeset/00a0ca84a79d/
Log: finish the weird modify-short-preamble-in-place
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -344,7 +344,32 @@
empty_info = EmptyInfo()
class AbstractShortPreambleBuilder(object):
- pass
+ def use_box(self, box, preamble_op, optimizer=None):
+ for arg in preamble_op.getarglist():
+ if isinstance(arg, Const):
+ continue
+ if isinstance(arg, AbstractInputArg):
+ info = arg.get_forwarded()
+ if info is not None and info is not empty_info:
+ info.make_guards(arg, self.short)
+ elif arg.get_forwarded() is None:
+ pass
+ else:
+ self.short.append(arg)
+ info = arg.get_forwarded()
+ if info is not empty_info:
+ info.make_guards(arg, self.short)
+ arg.set_forwarded(None)
+ self.short.append(preamble_op)
+ if preamble_op.is_ovf():
+ self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
+ info = preamble_op.get_forwarded()
+ preamble_op.set_forwarded(None)
+ if optimizer is not None:
+ optimizer.setinfo_from_preamble(box, info, None)
+ if info is not empty_info:
+ info.make_guards(preamble_op, self.short)
+ return preamble_op
class ShortPreambleBuilder(AbstractShortPreambleBuilder):
""" ShortPreambleBuilder is used during optimizing of the peeled loop,
@@ -372,33 +397,6 @@
self.extra_same_as = []
self.short_inputargs = short_inputargs
- def use_box(self, box, preamble_op, optimizer=None):
- for arg in preamble_op.getarglist():
- if isinstance(arg, Const):
- continue
- if isinstance(arg, AbstractInputArg):
- info = arg.get_forwarded()
- if info is not None and info is not empty_info:
- info.make_guards(arg, self.short)
- elif arg.get_forwarded() is None:
- pass
- else:
- self.short.append(arg)
- info = arg.get_forwarded()
- if info is not empty_info:
- info.make_guards(arg, self.short)
- arg.set_forwarded(None)
- self.short.append(preamble_op)
- if preamble_op.is_ovf():
- self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
- info = preamble_op.get_forwarded()
- preamble_op.set_forwarded(None)
- if optimizer is not None:
- optimizer.setinfo_from_preamble(box, info, None)
- if info is not empty_info:
- info.make_guards(preamble_op, self.short)
- return preamble_op
-
def add_preamble_op(self, preamble_op):
""" Notice that we're actually using the preamble_op, add it to
label and jump
@@ -444,3 +442,8 @@
self.sb.label_dict[op] = None
self.label_args.append(op)
self.jump_args.append(preamble_op.preamble_op)
+
+ def use_box(self, box, preamble_op, optimizer=None):
+ jump_op = self.short.pop()
+ AbstractShortPreambleBuilder.use_box(self, box, preamble_op, optimizer)
+ self.short.append(jump_op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -8372,9 +8372,9 @@
expected = """
[p1, p2]
call_n(p2, descr=nonwritedescr)
+ ifoo = arraylen_gc(p1, descr=gcarraydescr) # killed
p3 = new_with_vtable(descr=nodesize)
setarrayitem_gc(p1, 3, p3, descr=gcarraydescr)
- ifoo = arraylen_gc(p1, descr=gcarraydescr) # killed
jump(p1, p3)
"""
self.optimize_loop(ops, expected)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit