[pypy-commit] pypy optresult: clone enough to pass the first test
fijal
noreply at buildbot.pypy.org
Fri Nov 21 08:03:35 CET 2014
Author: Maciej Fijalkowski <fijall at 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')
More information about the pypy-commit
mailing list