Author: fijal Branch: jit-leaner-frontend Changeset: r83069:5413d954e8a2 Date: 2016-03-15 15:28 +0200 http://bitbucket.org/pypy/pypy/changeset/5413d954e8a2/
Log: try to not have position on resop at all diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py --- a/rpython/jit/metainterp/history.py +++ b/rpython/jit/metainterp/history.py @@ -7,7 +7,8 @@ from rpython.conftest import option from rpython.jit.metainterp.resoperation import ResOperation, rop,\ - AbstractValue, oparity, AbstractResOp, IntOp, RefOp, FloatOp + AbstractValue, oparity, AbstractResOp, IntOp, RefOp, FloatOp,\ + opclasses from rpython.jit.codewriter import heaptracker, longlong import weakref @@ -647,15 +648,27 @@ def __init__(self, pos): self.position = pos + def get_position(self): + return self.position + class IntFrontendOp(IntOp, FrontendOp): _attrs_ = ('position', '_resint') + def copy_value_from(self, other): + self._resint = other.getint() + class FloatFrontendOp(FloatOp, FrontendOp): _attrs_ = ('position', '_resfloat') + def copy_value_from(self, other): + self._resfloat = other.getfloatstorage() + class RefFrontendOp(RefOp, FrontendOp): _attrs_ = ('position', '_resref') + def copy_value_from(self, other): + self._resref = other.getref_base() + class History(object): ends_with_jump = False trace = None @@ -673,12 +686,9 @@ self.inputargs = inpargs if self._cache: # hack to record the ops *after* we know our inputargs - for op in self._cache: - newop = self.trace.record_op(op.getopnum(), op.getarglist(), - op.getdescr()) - op.position = newop.position - if op.type != 'v': - newop.copy_value_from(op) + for (opnum, argboxes, op, descr) in self._cache: + pos = self.trace.record_op(opnum, argboxes, descr) + op.position = pos self._cache = None def length(self): @@ -710,29 +720,39 @@ @specialize.argtype(3) def record(self, opnum, argboxes, value, descr=None): if self.trace is None: - op = ResOperation(opnum, argboxes, -1, descr) - self._cache.append(op) + pos = -1 else: - pos = self.trace._record_op(opnum, argboxes, descr) - if value is None: - op = FrontendOp(pos) - elif isinstance(value, bool): - op = IntFrontendOp(pos) - elif lltype.typeOf(value) == lltype.Signed: - op = IntFrontendOp(pos) - elif lltype.typeOf(value) is longlong.FLOATSTORAGE: - op = FloatFrontendOp(pos) - else: - op = RefFrontendOp(pos) + pos = self.trace.record_op(opnum, argboxes, descr) + if value is None: + op = FrontendOp(pos) + elif isinstance(value, bool): + op = IntFrontendOp(pos) + elif lltype.typeOf(value) == lltype.Signed: + op = IntFrontendOp(pos) + elif lltype.typeOf(value) is longlong.FLOATSTORAGE: + op = FloatFrontendOp(pos) + else: + op = RefFrontendOp(pos) + if self.trace is None: + self._cache.append((opnum, argboxes, op, descr)) self.set_op_value(op, value) return op def record_nospec(self, opnum, argboxes, descr=None): - return self.trace.record_op(opnum, argboxes, descr) + tp = opclasses[opnum].type + pos = self.trace.record_op(opnum, argboxes, descr) + if tp == 'v': + return FrontendOp(pos) + elif tp == 'i': + return IntFrontendOp(pos) + elif tp == 'f': + return FloatFrontendOp(pos) + assert tp == 'r' + return RefFrontendOp(pos) def record_default_val(self, opnum, argboxes, descr=None): assert rop.is_same_as(opnum) - op = self.trace.record_op(opnum, argboxes, descr) + op = self.record_nospec(opnum, argboxes, descr) op.copy_value_from(argboxes[0]) return op diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py --- a/rpython/jit/metainterp/opencoder.py +++ b/rpython/jit/metainterp/opencoder.py @@ -133,7 +133,7 @@ descr = self.trace._descrs[descr_index] else: descr = None - res = ResOperation(opnum, args, -1, descr=descr) + res = ResOperation(opnum, args, descr=descr) if rop.is_guard(opnum): assert isinstance(res, GuardResOp) res.rd_resume_position = descr_index @@ -288,7 +288,7 @@ else: assert False, "unreachable code" - def _record_op(self, opnum, argboxes, descr=None): + def record_op(self, opnum, argboxes, descr=None): pos = self._count self.append(opnum) expected_arity = oparity[opnum] @@ -319,12 +319,6 @@ self.append(-upper-1) self.append(lower) - def record_op(self, opnum, argboxes, descr=None): - # return an ResOperation instance, ideally die in hell - pos = self._record_op(opnum, argboxes, descr) - assert opnum >= 0 - return ResOperation(opnum, argboxes, pos, descr) - def _list_of_boxes(self, boxes): array = [rffi.cast(rffi.SHORT, 0)] * len(boxes) for i in range(len(boxes)): diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py --- a/rpython/jit/metainterp/optimizeopt/pure.py +++ b/rpython/jit/metainterp/optimizeopt/pure.py @@ -206,7 +206,7 @@ def pure_from_args(self, opnum, args, op, descr=None): newop = ResOperation(opnum, [self.get_box_replacement(arg) for arg in args], - -1, descr=descr) + descr=descr) newop.set_forwarded(op) self.pure(opnum, newop) diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -56,13 +56,13 @@ arg0 = op.getarg(0) arg1 = op.getarg(1) if oldopnum != -1: - top = ResOperation(oldopnum, [arg0, arg1], -1) + top = ResOperation(oldopnum, [arg0, arg1]) if self.try_boolinvers(op, top): return True oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL if oldopnum != -1: - top = ResOperation(oldopnum, [arg1, arg0], -1) + top = ResOperation(oldopnum, [arg1, arg0]) oldop = self.get_pure_result(top) if oldop is not None: self.optimizer.make_equal_to(op, oldop) @@ -72,7 +72,7 @@ return False oldopnum = opclasses[op.boolreflex].boolinverse if oldopnum != -1: - top = ResOperation(oldopnum, [arg1, arg0], -1) + top = ResOperation(oldopnum, [arg1, arg0]) if self.try_boolinvers(op, top): return True diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py --- a/rpython/jit/metainterp/pyjitpl.py +++ b/rpython/jit/metainterp/pyjitpl.py @@ -2540,9 +2540,7 @@ i = len(self.history._cache) op1 = self.history.record(rop.SAVE_EXC_CLASS, [], exc_class) op2 = self.history.record(rop.SAVE_EXCEPTION, [], exception) - assert op1 is self.history._cache[i] - assert op2 is self.history._cache[i + 1] - self.history._cache = [op1, op2] + self.history._cache[:i] + self.history._cache = self.history._cache[i:] + self.history._cache[:i] self.history.record(rop.RESTORE_EXCEPTION, [op1, op2], None) self.history.set_inputargs(inputargs) if exception_obj: diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -81,12 +81,10 @@ return False -def ResOperation(opnum, args, position=-1, descr=None): +def ResOperation(opnum, args, descr=None): cls = opclasses[opnum] op = cls() op.initarglist(args) - assert isinstance(position, int) - op.position = position if descr is not None: assert isinstance(op, ResOpWithDescr) if opnum == rop.FINISH: @@ -331,7 +329,7 @@ descr = self.getdescr() if descr is DONT_CHANGE: descr = None - newop = ResOperation(opnum, args, -1, descr) + newop = ResOperation(opnum, args, descr) if self.type != 'v': newop.copy_value_from(self) return newop diff --git a/rpython/jit/metainterp/test/test_opencoder.py b/rpython/jit/metainterp/test/test_opencoder.py --- a/rpython/jit/metainterp/test/test_opencoder.py +++ b/rpython/jit/metainterp/test/test_opencoder.py @@ -1,6 +1,6 @@ from rpython.jit.metainterp.opencoder import Trace, untag, TAGINT, TAGBOX -from rpython.jit.metainterp.resoperation import rop, InputArgInt +from rpython.jit.metainterp.resoperation import rop, InputArgInt, AbstractResOp from rpython.jit.metainterp.history import ConstInt from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer from rpython.jit.metainterp import resume @@ -16,6 +16,13 @@ class metainterp_sd(object): pass +class FakeOp(AbstractResOp): + def __init__(self, pos): + self.pos = pos + + def get_position(self): + return self.pos + class FakeFrame(object): parent_snapshot = None @@ -53,7 +60,7 @@ def test_simple_iterator(self): i0, i1 = InputArgInt(), InputArgInt() t = Trace([i0, i1]) - add = t.record_op(rop.INT_ADD, [i0, i1]) + add = FakeOp(t.record_op(rop.INT_ADD, [i0, i1])) t.record_op(rop.INT_ADD, [add, ConstInt(1)]) (i0, i1), l, _ = self.unpack(t) assert len(l) == 2 @@ -67,7 +74,7 @@ def test_rd_snapshot(self): i0, i1 = InputArgInt(), InputArgInt() t = Trace([i0, i1]) - add = t.record_op(rop.INT_ADD, [i0, i1]) + add = FakeOp(t.record_op(rop.INT_ADD, [i0, i1])) t.record_op(rop.GUARD_FALSE, [add]) # now we write rd_snapshot and friends frame0 = FakeFrame(1, JitCode(2), [i0, i1]) @@ -126,12 +133,12 @@ inputargs, ops = lst t = Trace(inputargs) for op in ops: - newop = t.record_op(op.getopnum(), op.getarglist()) + newop = FakeOp(t.record_op(op.getopnum(), op.getarglist())) newop.orig_op = op if newop.is_guard(): resume.capture_resumedata(op.framestack, None, [], t) - op.position = newop.position + op.position = newop.get_position() inpargs, l, iter = self.unpack(t) loop1 = TreeLoop("loop1") loop1.inputargs = inputargs _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit