[pypy-commit] pypy optresult-unroll: another go, do it in two steps. There is an open question whether we're getting better results or we have bugs
fijal
noreply at buildbot.pypy.org
Sun Jul 12 20:45:13 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78532:e127ddd8a9ec
Date: 2015-07-12 20:45 +0200
http://bitbucket.org/pypy/pypy/changeset/e127ddd8a9ec/
Log: another go, do it in two steps. There is an open question whether
we're getting better results or we have bugs
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
@@ -854,14 +854,13 @@
jump(i1, p2, p2sub)
"""
expected = """
- [i1, p2, p2sub]
- i3 = getfield_gc_i(p2sub, descr=valuedescr)
+ [i1, p2, i3]
escape_n(i3)
p1 = new_with_vtable(descr=nodesize)
p3sub = new_with_vtable(descr=nodesize2)
setfield_gc(p3sub, i1, descr=valuedescr)
setfield_gc(p1, p3sub, descr=nextdescr)
- jump(i1, p1, p3sub)
+ jump(i1, p1, i1)
"""
self.optimize_loop(ops, expected, preamble)
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -223,6 +223,8 @@
infos = {}
for arg in end_args:
infos[arg] = self.optimizer.getinfo(arg)
+ for box in sb.short_boxes:
+ infos[box] = self.optimizer.getinfo(box)
label_args = virtual_state.make_inputargs(end_args, self.optimizer)
for arg in end_args:
if arg.get_forwarded() is not None:
@@ -278,28 +280,32 @@
def import_state(self, targetop, exported_state):
# the mapping between input args (from old label) and what we need
- # to actually emit
+ # to actually emit. Update the info
self.ops_to_import = {}
for source, target in exported_state.inputarg_mapping:
if source is not target:
source.set_forwarded(target)
+ info = exported_state.exported_infos.get(target, None)
+ if info is not None:
+ self.optimizer.setinfo_from_preamble(source, info)
# import the optimizer state, starting from boxes that can be produced
# by short preamble
for op, preamble_op in exported_state.short_boxes.items():
self.ops_to_import[op] = preamble_op
if preamble_op.is_always_pure():
- self.pure(op.getopnum(), op)
+ self.pure(op.getopnum(), PreambleOp(op, preamble_op,
+ exported_state.exported_infos.get(op, None)))
else:
assert preamble_op.is_getfield()
optheap = self.optimizer.optheap
if optheap is None:
continue
opinfo = self.optimizer.ensure_ptr_info_arg0(preamble_op)
+ pre_info = exported_state.exported_infos[op]
+ pop = PreambleOp(op, preamble_op, pre_info)
assert not opinfo.is_virtual()
- opinfo._fields[preamble_op.getdescr().get_index()] = op
+ opinfo._fields[preamble_op.getdescr().get_index()] = pop
- for op, info in exported_state.exported_infos.iteritems():
- self.optimizer.setinfo_from_preamble(op, info)
return
self.inputargs = targetop.getarglist()
target_token = targetop.getdescr()
More information about the pypy-commit
mailing list