Author: fijal Branch: jit-leaner-frontend Changeset: r82903:bd97c8e4e94b Date: 2016-03-09 14:12 +0200 http://bitbucket.org/pypy/pypy/changeset/bd97c8e4e94b/
Log: do a hack in history to record the operations *earlier* than we have inputargs 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 @@ -642,17 +642,26 @@ class History(object): ends_with_jump = False + trace = None def __init__(self): self.descr_cache = {} self.descrs = {} self.consts = [] + self._cache = [] def set_inputargs(self, inpargs): from rpython.jit.metainterp.opencoder import Trace self.trace = Trace(inpargs) 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 + self._cache = None def length(self): return self.trace._count @@ -668,7 +677,11 @@ @specialize.argtype(3) def record(self, opnum, argboxes, value, descr=None): - op = self.trace.record_op(opnum, argboxes, descr) + if self.trace is None: + op = ResOperation(opnum, argboxes, -1, descr) + self._cache.append(op) + else: + op = self.trace.record_op(opnum, argboxes, descr) if value is None: assert op.type == 'v' elif isinstance(value, bool): 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 @@ -63,7 +63,7 @@ if force_inputargs is not None: self.inputargs = [rop.inputarg_from_tp(arg.type) for arg in force_inputargs] - self._inputargs = [None] * len(force_inputargs) + self._inputargs = [None] * len(trace.inputargs) for i, arg in enumerate(force_inputargs): if arg.position >= 0: self._cache[arg.position] = self.inputargs[i] 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 @@ -303,8 +303,7 @@ patchguardop = self.optimizer.patchguardop for guard in extra_guards.extra_guards: if isinstance(guard, GuardResOp): - guard.rd_snapshot = patchguardop.rd_snapshot - guard.rd_frame_info_list = patchguardop.rd_frame_info_list + guard.rd_resume_position = patchguardop.rd_resume_position guard.setdescr(compile.ResumeAtPositionDescr()) self.send_extra_operation(guard) except VirtualStatesCantMatch: 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 @@ -444,7 +444,7 @@ if other.level == LEVEL_UNKNOWN: if (runtime_box and runtime_box.nonnull() and self.known_class.same_constant(cpu.ts.cls_of_box(runtime_box))): - op = ResOperation(rop.GUARD_NONNULL_CLASS, [box, self.known_class], None) + op = ResOperation(rop.GUARD_NONNULL_CLASS, [box, self.known_class]) extra_guards.append(op) return else: @@ -452,7 +452,7 @@ elif other.level == LEVEL_NONNULL: if (runtime_box and self.known_class.same_constant( cpu.ts.cls_of_box(runtime_box))): - op = ResOperation(rop.GUARD_CLASS, [box, self.known_class], None) + op = ResOperation(rop.GUARD_CLASS, [box, self.known_class]) extra_guards.append(op) return else: @@ -476,7 +476,7 @@ return raise VirtualStatesCantMatch("different constants") if runtime_box is not None and self.constbox.same_constant(runtime_box.constbox()): - op = ResOperation(rop.GUARD_VALUE, [box, self.constbox], None) + op = ResOperation(rop.GUARD_VALUE, [box, self.constbox]) extra_guards.append(op) return else: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit