[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