Author: Maciej Fijalkowski <[email protected]>
Branch: result-in-resops
Changeset: r56450:4f48fde082c0
Date: 2012-07-25 21:47 +0200
http://bitbucket.org/pypy/pypy/changeset/4f48fde082c0/

Log:    work in progress

diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -119,8 +119,9 @@
     part.resume_at_jump_descr = resume_at_jump_descr
     part.operations = ([create_resop(rop.LABEL, None, inputargs,
                                      descr=TargetToken(jitcell_token))] +
-                       h_ops[start:] + [create_resop(rop.LABEL, None, jumpargs,
-                                                     descr=jitcell_token)])
+                       [h_ops[i].clone() for i in range(start, len(h_ops))]+
+                       [create_resop(rop.LABEL, None, jumpargs,
+                                     descr=jitcell_token)])
 
     try:
         optimize_trace(metainterp_sd, part, jitdriver_sd.warmstate.enable_opts)
@@ -139,10 +140,11 @@
     while part.operations[-1].getopnum() == rop.LABEL:
         inliner = Inliner(inputargs, jumpargs)
         part.quasi_immutable_deps = None
-        part.operations = [part.operations[-1]] + \
-                          [inliner.inline_op(h_ops[i]) for i in range(start, 
len(h_ops))] + \
-                          [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a 
in jumpargs],
-                                        None, descr=jitcell_token)]
+        part.operations = ([part.operations[-1]] +
+             [inliner.inline_op(h_ops[i]) for i in range(start, len(h_ops))] +
+             [create_resop(rop.JUMP, None,
+                           [inliner.get_value_replacement(a) for a in 
jumpargs],
+                           descr=jitcell_token)])
         target_token = part.operations[0].getdescr()
         assert isinstance(target_token, TargetToken)
         all_target_tokens.append(target_token)
diff --git a/pypy/jit/metainterp/inliner.py b/pypy/jit/metainterp/inliner.py
--- a/pypy/jit/metainterp/inliner.py
+++ b/pypy/jit/metainterp/inliner.py
@@ -12,27 +12,15 @@
                 self.argmap[inputargs[i]] = jump_args[i]
         self.snapshot_map = {None: None}
 
-    def inline_op(self, newop, ignore_result=False, clone=True,
-                  ignore_failargs=False):
-        if clone:
-            newop = newop.clone()
-        args = newop.getarglist()
-        newop.initarglist([self.inline_arg(a) for a in args])
+    def inline_op(self, op):
+        newop = op.copy_if_modified_by_optimization(self, force_copy=True)
+        if newop.is_guard():
+            args = op.getfailargs()
+            if args:
+                newop.setfailargs([self.get_value_replacement(a) for a in 
args])
 
-        if newop.is_guard():
-            args = newop.getfailargs()
-            if args and not ignore_failargs:
-                newop.setfailargs([self.inline_arg(a) for a in args])
-            else:
-                newop.setfailargs([])
-
-        if newop.result and not ignore_result:
-            old_result = newop.result
-            newop.result = newop.result.clonebox()
-            self.argmap[old_result] = newop.result
-
+        self.argmap[op] = newop
         self.inline_descr_inplace(newop.getdescr())
-
         return newop
 
     def inline_descr_inplace(self, descr):
@@ -40,7 +28,7 @@
         if isinstance(descr, ResumeGuardDescr):
             descr.rd_snapshot = self.inline_snapshot(descr.rd_snapshot)
 
-    def inline_arg(self, arg):
+    def get_value_replacement(self, arg):
         if arg is None:
             return None
         if isinstance(arg, Const):
@@ -50,7 +38,7 @@
     def inline_snapshot(self, snapshot):
         if snapshot in self.snapshot_map:
             return self.snapshot_map[snapshot]
-        boxes = [self.inline_arg(a) for a in snapshot.boxes]
+        boxes = [self.get_value_replacement(a) for a in snapshot.boxes]
         new_snapshot = Snapshot(self.inline_snapshot(snapshot.prev), boxes)
         self.snapshot_map[snapshot] = new_snapshot
         return new_snapshot
diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py 
b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -36,7 +36,7 @@
 def build_opt_chain(metainterp_sd, enable_opts):
     config = metainterp_sd.config
     optimizations = []
-    enable_opts = {}
+    enable_opts = {} # XXX
     unroll = 'unroll' in enable_opts    # 'enable_opts' is normally a dict
     for name, opt in unroll_all_opts:
         if name in enable_opts:
diff --git a/pypy/jit/metainterp/optimizeopt/simplify.py 
b/pypy/jit/metainterp/optimizeopt/simplify.py
--- a/pypy/jit/metainterp/optimizeopt/simplify.py
+++ b/pypy/jit/metainterp/optimizeopt/simplify.py
@@ -39,23 +39,26 @@
         if not self.unroll:
             descr = op.getdescr()
             if isinstance(descr, JitCellToken):
-                return self.optimize_JUMP(op.copy_and_change(rop.JUMP))
+                return self.optimize_JUMP(op)
             self.last_label_descr = op.getdescr()
         self.emit_operation(op)
         
     def optimize_JUMP(self, op):
         if not self.unroll:
             descr = op.getdescr()
+            newdescr = None
             assert isinstance(descr, JitCellToken)
             if not descr.target_tokens:
                 assert self.last_label_descr is not None
                 target_token = self.last_label_descr
                 assert isinstance(target_token, TargetToken)
                 assert target_token.targeting_jitcell_token is descr
-                op.setdescr(self.last_label_descr)
+                newdescr = self.last_label_descr
             else:
                 assert len(descr.target_tokens) == 1
-                op.setdescr(descr.target_tokens[0])
+                newdescr = descr.target_tokens[0]
+            if newdescr is not descr or op.opnum != rop.JUMP:
+                op = op.copy_and_change(op.opnum, descr=newdescr)
         self.emit_operation(op)
 
 dispatch_opt = make_dispatcher_method(OptSimplify, 'optimize_',
diff --git a/pypy/jit/metainterp/resoperation.py 
b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -485,14 +485,17 @@
         return r
 
     @specialize.arg(1)
-    def copy_and_change(self, newopnum):
-        r = create_resop_0(newopnum, self.getresult(), self.getdescrclone())
+    def copy_and_change(self, newopnum, descr=None):
+        r = create_resop_0(newopnum, self.getresult(),
+                           descr or self.getdescrclone())
         if r.is_guard():
             r.setfailargs(self.getfailargs())
             assert self.is_guard()
         return r
 
-    def copy_if_modified_by_optimization(self, opt):
+    def copy_if_modified_by_optimization(self, opt, force_copy=False):
+        if force_copy:
+            return self.clone()
         return self
 
 class UnaryOp(object):
@@ -528,17 +531,18 @@
             r.setfailargs(self.getfailargs())
         return r
 
-    def copy_if_modified_by_optimization(self, opt):
+    @specialize.argtype(1)
+    def copy_if_modified_by_optimization(self, opt, force_copy=False):
         new_arg = opt.get_value_replacement(self._arg0)
-        if new_arg is None:
+        if not force_copy and new_arg is None:
             return self
         return create_resop_1(self.opnum, self.getresult(), new_arg,
                               self.getdescrclone())
 
     @specialize.arg(1)
-    def copy_and_change(self, newopnum, arg0=None):
+    def copy_and_change(self, newopnum, arg0=None, descr=None):
         r = create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
-                           self.getdescrclone())
+                           descr or self.getdescrclone())
         if r.is_guard():
             r.setfailargs(self.getfailargs())
             assert self.is_guard()
@@ -581,10 +585,11 @@
             r.setfailargs(self.getfailargs())
         return r
 
-    def copy_if_modified_by_optimization(self, opt):
+    @specialize.argtype(1)
+    def copy_if_modified_by_optimization(self, opt, force_copy=False):
         new_arg0 = opt.get_value_replacement(self._arg0)
         new_arg1 = opt.get_value_replacement(self._arg1)
-        if new_arg0 is None and new_arg1 is None:
+        if not force_copy and new_arg0 is None and new_arg1 is None:
             return self
         return create_resop_2(self.opnum, self.getresult(),
                               new_arg0 or self._arg0,
@@ -592,10 +597,10 @@
                               self.getdescrclone())
 
     @specialize.arg(1)
-    def copy_and_change(self, newopnum, arg0=None, arg1=None):
+    def copy_and_change(self, newopnum, arg0=None, arg1=None, descr=None):
         r = create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
                            arg1 or self._arg1,
-                           self.getdescrclone())
+                           descr or self.getdescrclone())
         if r.is_guard():
             r.setfailargs(self.getfailargs())
             assert self.is_guard()
@@ -640,12 +645,14 @@
         return create_resop_3(self.opnum, self.getresult(), self._arg0,
                               self._arg1, self._arg2, self.getdescrclone())
 
-    def copy_if_modified_by_optimization(self, opt):
+    @specialize.argtype(1)
+    def copy_if_modified_by_optimization(self, opt, force_copy=False):
         assert not self.is_guard()
         new_arg0 = opt.get_value_replacement(self._arg0)
         new_arg1 = opt.get_value_replacement(self._arg1)
         new_arg2 = opt.get_value_replacement(self._arg2)
-        if new_arg0 is None and new_arg1 is None and new_arg2 is None:
+        if (not force_copy and new_arg0 is None and new_arg1 is None and
+            new_arg2 is None):
             return self
         return create_resop_3(self.opnum, self.getresult(),
                               new_arg0 or self._arg0,
@@ -654,10 +661,11 @@
                               self.getdescrclone())
 
     @specialize.arg(1)
-    def copy_and_change(self, newopnum, arg0=None, arg1=None, arg2=None):
+    def copy_and_change(self, newopnum, arg0=None, arg1=None, arg2=None,
+                        descr=None):
         r = create_resop_3(newopnum, self.getresult(), arg0 or self._arg0,
                            arg1 or self._arg1, arg2 or self._arg2,
-                           self.getdescrclone())
+                           descr or self.getdescrclone())
         assert not r.is_guard()
         return r
 
@@ -689,8 +697,12 @@
         return create_resop(self.opnum, self.getresult(), self._args[:],
                               self.getdescrclone())
 
-    def copy_if_modified_by_optimization(self, opt):
-        newargs = None
+    @specialize.argtype(1)
+    def copy_if_modified_by_optimization(self, opt, force_copy=False):
+        if force_copy:
+            newargs = []
+        else:
+            newargs = None
         for i, arg in enumerate(self._args):
             new_arg = opt.get_value_replacement(arg)
             if new_arg is not None:
@@ -708,9 +720,10 @@
                             newargs, self.getdescrclone())
 
     @specialize.arg(1)
-    def copy_and_change(self, newopnum, newargs=None):
+    def copy_and_change(self, newopnum, newargs=None, descr=None):
         r = create_resop(newopnum, self.getresult(),
-                         newargs or self.getarglist(), self.getdescrclone())
+                         newargs or self.getarglist(),
+                         descr or self.getdescrclone())
         assert not r.is_guard()
         return r
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to