Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r78478:7b6353983251 Date: 2015-07-06 17:04 +0200 http://bitbucket.org/pypy/pypy/changeset/7b6353983251/
Log: fix fix fix diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -285,14 +285,6 @@ else: zzz - def setinfo_from_preamble(self, op, old_info): - if isinstance(old_info, info.PtrInfo): - if op.is_constant(): - return # nothing we can learn - known_class = old_info.get_known_class(self.cpu) - if known_class: - self.make_constant_class(op, known_class, False) - def get_box_replacement(self, op): from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp 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 @@ -81,7 +81,6 @@ if expected_preamble: self.assert_equal(preamble, convert_old_style_to_targets(expected_preamble, jump=False), text_right='expected preamble') - assert preamble.operations[-1].getdescr() == loop.operations[0].getdescr() if expected_short: short_preamble = TreeLoop('short preamble') assert short[0].getopnum() == rop.LABEL diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py --- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py @@ -10,6 +10,7 @@ from rpython.jit.metainterp.compile import LoopCompileData from rpython.jit.metainterp.optimizeopt.virtualstate import \ NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN +from rpython.jit.codewriter import heaptracker class FakeOptimizer(object): optearlyforce = None @@ -71,3 +72,16 @@ assert vs.state[0].level == LEVEL_UNKNOWN op = preamble.operations[0] assert es.short_boxes == {op: op} + + def test_guard_class(self): + loop = """ + [p0] + guard_class(p0, ConstClass(node_vtable)) [] + jump(p0) + """ + es, loop, preamble = self.optimize(loop) + p0 = loop.inputargs[0] + assert (heaptracker.adr2int(self.node_vtable_adr) == + es.exported_infos[p0]._known_class.getint()) + + diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py --- a/rpython/jit/metainterp/optimizeopt/test/test_util.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py @@ -513,7 +513,7 @@ loop.operations if not jump: assert newloop.operations[-1].getopnum() == rop.JUMP - newloop.operations[-1] = ResOperation(rop.LABEL, newloop.operations[-1].getarglist(), descr=FakeDescr()) + newloop.operations = newloop.operations[:-1] return newloop # ____________________________________________________________ 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 @@ -3,6 +3,7 @@ from rpython.jit.metainterp.history import TargetToken, JitCellToken, Const from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes from rpython.jit.metainterp.optimize import InvalidLoop +from rpython.jit.metainterp.optimizeopt import info from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\ Optimization from rpython.jit.metainterp.optimizeopt.virtualstate import (VirtualStateConstructor, @@ -35,6 +36,15 @@ preamble_op.info.make_guards(op, self.optunroll.short) return op + def setinfo_from_preamble(self, op, old_info): + op = self.get_box_replacement(op) + if isinstance(old_info, info.PtrInfo): + if op.is_constant(): + return # nothing we can learn + known_class = old_info.get_known_class(self.cpu) + if known_class: + self.make_constant_class(op, known_class, False) + class UnrollOptimizer(Optimization): """Unroll the loop into two iterations. The first one will @@ -173,7 +183,11 @@ inparg_mapping = [(start_label.getarg(i), end_args[i]) for i in range(len(end_args)) if start_label.getarg(i) is not end_args[i]] - return ExportedState(inparg_mapping, virtual_state, [], sb.short_boxes) + infos = {} + for arg in end_args: + infos[arg] = self.optimizer.getinfo(arg) + return ExportedState(inparg_mapping, virtual_state, infos, + sb.short_boxes) inputargs = virtual_state.make_inputargs(jump_args, self.optimizer) @@ -224,7 +238,8 @@ # the mapping between input args (from old label) and what we need # to actually emit for source, target in exported_state.inputarg_mapping: - xxx + if source is not target: + source.set_forwarded(target) # import the optimizer state, starting from boxes that can be produced # by short preamble for op, preamble_op in exported_state.short_boxes.items(): @@ -232,6 +247,9 @@ self.pure(op.getopnum(), PreambleOp(op, preamble_op, None)) else: yyy + + 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() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit