Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult Changeset: r74626:5bd127267e31 Date: 2014-11-19 14:45 +0200 http://bitbucket.org/pypy/pypy/changeset/5bd127267e31/
Log: clone enough to pass the first test diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py --- a/rpython/jit/metainterp/compile.py +++ b/rpython/jit/metainterp/compile.py @@ -7,7 +7,6 @@ from rpython.rlib import rstack from rpython.rlib.jit import JitDebugInfo, Counters, dont_look_inside from rpython.conftest import option -from rpython.tool.sourcetools import func_with_new_name from rpython.jit.metainterp.resoperation import ResOperation, rop, get_deep_immutable_oplist from rpython.jit.metainterp.history import (TreeLoop, Const, JitCellToken, @@ -104,6 +103,17 @@ # ____________________________________________________________ +class Memo(object): + def __init__(self): + self.snapshots = {} + self.box_mapping = {} + + def get(self, box, default): + return self.box_mapping.get(box, default) + + def set(self, box, newbox): + self.box_mapping[box] = newbox + def compile_loop(metainterp, greenkey, start, inputargs, jumpargs, full_preamble_needed=True, @@ -128,10 +138,11 @@ part = create_empty_loop(metainterp) part.inputargs = inputargs[:] h_ops = history.operations - # XXX why do we clone here? + memo = Memo() part.operations = [ResOperation(rop.LABEL, inputargs, descr=TargetToken(jitcell_token))] + \ - [h_ops[i].clone() for i in range(start, len(h_ops))] + \ - [ResOperation(rop.LABEL, jumpargs, descr=jitcell_token)] + [h_ops[i].clone(memo) for i in range(start, len(h_ops))] + jumpargs = [memo.get(box, box) for box in jumpargs] + part.operations.append(ResOperation(rop.LABEL, jumpargs, descr=jitcell_token)) try: optimize_trace(metainterp_sd, part, enable_opts) @@ -191,6 +202,7 @@ """Try to compile a new procedure by closing the current history back to the first operation. """ + xxx from rpython.jit.metainterp.optimizeopt import optimize_trace history = metainterp.history @@ -633,9 +645,9 @@ self, inputargs, new_loop.operations, new_loop.original_jitcell_token) - def copy_all_attributes_into(self, res): + def copy_all_attributes_into(self, res, memo): # XXX a bit ugly to have to list them all here - res.rd_snapshot = self.rd_snapshot + res.rd_snapshot = self.rd_snapshot.copy(memo) res.rd_frame_info_list = self.rd_frame_info_list res.rd_numb = self.rd_numb res.rd_consts = self.rd_consts @@ -643,21 +655,21 @@ res.rd_pendingfields = self.rd_pendingfields res.rd_count = self.rd_count - def _clone_if_mutable(self): + def _clone_if_mutable(self, memo): res = ResumeGuardDescr() - self.copy_all_attributes_into(res) + self.copy_all_attributes_into(res, memo) return res class ResumeGuardNotInvalidated(ResumeGuardDescr): - def _clone_if_mutable(self): + def _clone_if_mutable(self, memo): res = ResumeGuardNotInvalidated() - self.copy_all_attributes_into(res) + self.copy_all_attributes_into(res, memo) return res class ResumeAtPositionDescr(ResumeGuardDescr): - def _clone_if_mutable(self): + def _clone_if_mutable(self, memo): res = ResumeAtPositionDescr() - self.copy_all_attributes_into(res) + self.copy_all_attributes_into(res, memo) return res class AllVirtuals: @@ -741,10 +753,10 @@ hidden_all_virtuals = obj.hide(metainterp_sd.cpu) metainterp_sd.cpu.set_savedata_ref(deadframe, hidden_all_virtuals) - def _clone_if_mutable(self): + def _clone_if_mutable(self, memo): res = ResumeGuardForcedDescr(self.metainterp_sd, self.jitdriver_sd) - self.copy_all_attributes_into(res) + self.copy_all_attributes_into(res, memo) return res @@ -773,6 +785,7 @@ """Try to compile a new bridge leading from the beginning of the history to some existing place. """ + xxx from rpython.jit.metainterp.optimizeopt import optimize_trace # The history contains new operations to attach as the code for the 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 @@ -130,10 +130,10 @@ def repr_of_descr(self): return '%r' % (self,) - def _clone_if_mutable(self): + def _clone_if_mutable(self, memo): return self - def clone_if_mutable(self): - clone = self._clone_if_mutable() + def clone_if_mutable(self, memo): + clone = self._clone_if_mutable(memo) if not we_are_translated(): assert clone.__class__ is self.__class__ return clone 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 @@ -109,16 +109,17 @@ assert lltype.typeOf(value) == llmemory.GCREF self._resref = value - - def clone(self): - args = self.getarglist() + + def clone(self, memo): + args = [memo.get(arg, arg) for arg in self.getarglist()] descr = self.getdescr() if descr is not None: - descr = descr.clone_if_mutable() - op = ResOperation(self.getopnum(), args[:], descr) + descr = descr.clone_if_mutable(memo) + op = ResOperation(self.getopnum(), args, descr) if not we_are_translated(): op.name = self.name op.pc = self.pc + memo.set(self, op) return op def repr(self, memo, graytext=False): @@ -275,9 +276,11 @@ newop.setfailargs(self.getfailargs()) return newop - def clone(self): - newop = AbstractResOp.clone(self) - newop.setfailargs(self.getfailargs()) + def clone(self, memo): + newop = AbstractResOp.clone(self, memo) + failargs = self.getfailargs() + if failargs is not None: + newop.setfailargs([memo.get(arg, arg) for arg in failargs]) return newop # =========== diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py --- a/rpython/jit/metainterp/resume.py +++ b/rpython/jit/metainterp/resume.py @@ -29,6 +29,19 @@ self.prev = prev self.boxes = boxes + def copy(self, memo): + try: + return memo.snapshots[self] + except KeyError: + if self.prev is not None: + prev = self.prev.copy(memo) + else: + prev = None + boxes = [memo.get(box, box) for box in self.boxes] + new_snapshot = Snapshot(prev, boxes) + memo.snapshots[self] = new_snapshot + return new_snapshot + class FrameInfo(object): __slots__ = ('prev', 'jitcode', 'pc') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit