Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r78352:fdaae9ee19c7 Date: 2015-06-29 17:19 +0200 http://bitbucket.org/pypy/pypy/changeset/fdaae9ee19c7/
Log: start passing construction of args 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 @@ -297,9 +297,15 @@ self.make_constant_class(op, known_class, False) def get_box_replacement(self, op): + from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp + + orig_op = op if op is None: return op - return op.get_box_replacement() + res = op.get_box_replacement() + if isinstance(res, PreambleOp): + xxx + return res def force_box(self, op): op = self.get_box_replacement(op) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py @@ -1,22 +1,26 @@ from __future__ import with_statement import py -from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo, VStructStateInfo, \ - VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes, GenerateGuardState, \ - VirtualStatesCantMatch, VArrayStructStateInfo -from rpython.jit.metainterp.optimizeopt.optimizer import OptValue, PtrOptValue,\ - IntOptValue -from rpython.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr, ConstInt, ConstPtr +from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo,\ + VStructStateInfo, LEVEL_CONSTANT,\ + VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes,\ + GenerateGuardState, VirtualStatesCantMatch, VArrayStructStateInfo +from rpython.jit.metainterp.history import ConstInt, ConstPtr +from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef,\ + InputArgFloat from rpython.rtyper.lltypesystem import lltype, llmemory from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \ equaloplists from rpython.jit.metainterp.optimizeopt.intutils import IntBound -from rpython.jit.metainterp.optimizeopt.virtualize import (VirtualValue, - VArrayValue, VStructValue, VArrayStructValue) from rpython.jit.metainterp.history import TreeLoop, JitCellToken from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData +from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer from rpython.jit.metainterp.resoperation import ResOperation, rop from rpython.jit.metainterp import resume +class FakeOptimizer(Optimizer): + def __init__(self): + self.optearlyforce = None + class BaseTestGenerateGuards(BaseTest): def _box_or_value(self, box_or_value=None): @@ -74,6 +78,14 @@ with py.test.raises(VirtualStatesCantMatch): info1.generate_guards(info2, value, state) + def test_make_inputargs(self): + optimizer = FakeOptimizer() + args = [InputArgInt()] + info0 = NotVirtualStateInfo(optimizer, args[0]) + vs = VirtualState([info0]) + assert vs.make_inputargs(args, optimizer) == args + info0.level = LEVEL_CONSTANT + assert vs.make_inputargs(args, optimizer) == [] def test_position_generalization(self): def postest(info1, info2): @@ -95,7 +107,7 @@ self.check_invalid(info1, info2, state=state) assert info1 in state.bad and info2 in state.bad - for BoxType in (BoxInt, BoxFloat, BoxPtr): + for BoxType in (InputArgInt, InputArgFloat, InputArgPtr): info1 = NotVirtualStateInfo(OptValue(BoxType())) info2 = NotVirtualStateInfo(OptValue(BoxType())) postest(info1, info2) @@ -1386,16 +1398,6 @@ class TestLLtypeBridges(BaseTestBridges, LLtypeMixin): pass -class FakeOptimizer: - def __init__(self): - self.opaque_pointers = {} - self.values = {} - def make_equal_to(*args): - pass - def getvalue(*args): - pass - def emit_operation(*args): - pass class TestShortBoxes: 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 @@ -137,7 +137,13 @@ if start_label and self.jump_to_start_label(start_label, stop_label): # Initial label matches, jump to it - jumpop = ResOperation(rop.JUMP, stop_label.getarglist(), + vs = start_label.getdescr().virtual_state + if vs is not None: + args = vs.make_inputargs(stop_label.getarglist(), + self.optimizer) + else: + args = stop_label.getarglist() + jumpop = ResOperation(rop.JUMP, args, descr=start_label.getdescr()) #if self.short: # # Construct our short preamble @@ -222,7 +228,7 @@ short_boxes = ShortBoxes(self.optimizer, inputargs) - inputarg_setup_ops = [] + proven_constants = [] for i in range(len(original_jump_args)): srcbox = jump_args[i] if srcbox is not original_jump_args[i]: @@ -231,7 +237,7 @@ if info and info.is_virtual(): xxx if original_jump_args[i] is not srcbox and srcbox.is_constant(): - inputarg_setup_ops.append((original_jump_args[i], srcbox)) + proven_constants.append((original_jump_args[i], srcbox)) #opnum = OpHelpers.same_as_for_type(original_jump_args[i].type) #op = ResOperation(opnum, [srcbox]) #self.optimizer.emit_operation(op) @@ -264,7 +270,7 @@ if op and op.type != 'v': exported_values[op] = self.optimizer.getinfo(op) - return ExportedState(short_boxes, inputarg_setup_ops, exported_values) + return ExportedState(short_boxes, proven_constants, exported_values) def import_state(self, targetop, exported_state): if not targetop: # Trace did not start with a label @@ -291,6 +297,8 @@ for box in self.inputargs: preamble_info = exported_state.exported_values[box] self.optimizer.setinfo_from_preamble(box, preamble_info) + for box, const in exported_state.proven_constants: + box.set_forwarded(const) # Setup the state of the new optimizer by emiting the # short operations and discarding the result @@ -309,6 +317,7 @@ return seen = {} for op in self.short_boxes.operations(): + yyy self.ensure_short_op_emitted(op, self.optimizer, seen) if op and op.type != 'v': preamble_value = exported_state.exported_values[op] @@ -709,9 +718,9 @@ class ExportedState(object): - def __init__(self, short_boxes, inputarg_setup_ops, exported_values): + def __init__(self, short_boxes, proven_constants, exported_values): self.short_boxes = short_boxes - self.inputarg_setup_ops = inputarg_setup_ops + self.proven_constants = proven_constants self.exported_values = exported_values def dump(self, metainterp_sd): diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py @@ -282,7 +282,14 @@ lenbound = None intbound = None - def __init__(self, cpu, ptrinfo, is_opaque=False): + def __init__(self, optimizer, box): + info = optimizer.getinfo(box) + if info and info.is_constant(): + self.level = LEVEL_CONSTANT + else: + self.level = LEVEL_UNKNOWN + return + yyy self.level = LEVEL_UNKNOWN if ptrinfo is not None: self.known_class = ptrinfo.get_known_class(cpu) @@ -461,15 +468,6 @@ debug_print(indent + mark + 'NotVirtualInfo(%d' % self.position + ', ' + l + ', ' + self.intbound.__repr__() + lb + ')') -class IntNotVirtualStateInfo(NotVirtualStateInfo): - def __init__(self, intbound): - # XXX do we care about non null? - self.intbound = intbound - if intbound.is_constant(): - self.level = LEVEL_CONSTANT - else: - self.level = LEVEL_UNKNOWN - class VirtualState(object): def __init__(self, state): @@ -502,8 +500,11 @@ if optimizer.optearlyforce: optimizer = optimizer.optearlyforce assert len(inputargs) == len(self.state) - return [x for x in inputargs if not isinstance(x, Const)] - return inputargs + inpargs = [] + for i, state in enumerate(self.state): + if state.level != LEVEL_CONSTANT: + inpargs.append(inputargs[i]) + return inpargs inputargs = [None] * self.numnotvirtuals # We try twice. The first time around we allow boxes to be forced @@ -597,16 +598,9 @@ return VirtualState(state) - def visit_not_ptr(self, box, intbound): - return IntNotVirtualStateInfo(intbound=intbound) - def visit_not_virtual(self, box): is_opaque = box in self.optimizer.opaque_pointers - if box.type == 'r': - ptrinfo = self.optimizer.getptrinfo(box) - else: - return self.visit_not_ptr(box, self.optimizer.getintbound(box)) - return NotVirtualStateInfo(self.optimizer.cpu, ptrinfo, is_opaque) + return NotVirtualStateInfo(self.optimizer, box) def visit_virtual(self, known_class, fielddescrs): return VirtualStateInfo(known_class, fielddescrs) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit