[pypy-commit] pypy optresult: push push push, until we get back to optpure

fijal noreply at buildbot.pypy.org
Tue Nov 18 07:43:22 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74569:3c538c4e3d52
Date: 2014-11-17 17:10 +0200
http://bitbucket.org/pypy/pypy/changeset/3c538c4e3d52/

Log:	push push push, until we get back to optpure

diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -237,14 +237,13 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         resbound = v1.intbound.add_bound(v2.intbound)
-        r = self.getvalue(op)
         if resbound.bounded():
             # Transform into INT_ADD.  The following guard will be killed
             # by optimize_GUARD_NO_OVERFLOW; if we see instead an
             # optimize_GUARD_OVERFLOW, then InvalidLoop.
-            op = op.copy_and_change(rop.INT_ADD)
+            op = self.optimizer.replace_op_with(op, rop.INT_ADD)
         self.emit_operation(op) # emit the op
-        r.box = op
+        r = self.getvalue(op)
         r.intbound.intersect(resbound)
 
     def optimize_INT_SUB_OVF(self, op):
@@ -255,8 +254,7 @@
             return
         resbound = v1.intbound.sub_bound(v2.intbound)
         if resbound.bounded():
-            xxxx
-            op = op.copy_and_change(rop.INT_SUB)
+            op = self.optimizer.replace_op_with(op, rop.INT_SUB)
         self.emit_operation(op) # emit the op
         r = self.getvalue(op)
         r.intbound.intersect(resbound)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -1,6 +1,6 @@
 from rpython.jit.metainterp import jitprof, resume, compile
 from rpython.jit.metainterp.executor import execute_nonspec_const
-from rpython.jit.metainterp.history import BoxInt, BoxFloat, Const, ConstInt, REF
+from rpython.jit.metainterp.history import Const, ConstInt, REF
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound, IntUnbounded, \
                                                      ImmutableIntUnbounded, \
                                                      IntLowerBound, MININT, MAXINT
@@ -55,7 +55,7 @@
         if intbound:
             self.intbound = intbound
         else:
-            if isinstance(box, BoxInt):
+            if box is not None and box.type == 'i':
                 self.intbound = IntBound(MININT, MAXINT)
             else:
                 self.intbound = IntUnbounded()
@@ -64,6 +64,15 @@
             self.make_constant(box)
         # invariant: box is a Const if and only if level == LEVEL_CONSTANT
 
+    def copy_attributes_from(self, other):
+        assert other.__class__ is OptValue
+        self.level = other.level
+        self.known_class = other.known_class
+        self.intbound = other.intbound
+        self.lenbound = other.lenbound
+        self.box = other.box
+        self.last_guard = other.last_guard
+
     def make_len_gt(self, mode, descr, val):
         if self.lenbound:
             assert self.lenbound.mode == mode
@@ -503,21 +512,37 @@
     def clear_newoperations(self):
         self._newoperations = []
 
-    def make_equal_to(self, box, value, replace=False):
-        assert isinstance(value, OptValue)
-        assert replace or box not in self.values
-        self.values[box] = value
+    def make_equal_to(self, box, newvalue):
+        if box in self.values:
+            v = self.getvalue(box)
+            v.copy_attributes_from(newvalue)
+        else:
+            self.values[box] = newvalue
+
+    def replace_op_with(self, oldop, newopnum, args=None):
+        newop = oldop._copy_and_change(newopnum, args=args)
+        v = self.getvalue(oldop)
+        v.box = newop
+        self.values[newop] = v
+        return newop
 
     def make_constant(self, box, constbox):
-        self.make_equal_to(box, ConstantValue(constbox))
+        try:
+            value = self.values[box]
+            value.level = LEVEL_CONSTANT
+            value.make_constant(constbox)
+        except KeyError:
+            self.values[box] = ConstantValue(constbox)
 
     def make_constant_int(self, box, intvalue):
         self.make_constant(box, ConstInt(intvalue))
 
     def new_ptr_box(self):
+        xxx
         return self.cpu.ts.BoxRef()
 
     def new_box(self, fieldofs):
+        xxx
         if fieldofs.is_pointer_field():
             return self.new_ptr_box()
         elif fieldofs.is_float_field():
@@ -534,6 +559,7 @@
             return CVAL_ZERO
 
     def new_box_item(self, arraydescr):
+        xxx
         if arraydescr.is_array_of_pointers():
             return self.new_ptr_box()
         elif arraydescr.is_array_of_floats():
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -43,7 +43,7 @@
             oldop = self.pure_operations.get(args, None)
             if oldop is not None and oldop.getdescr() is op.getdescr():
                 assert oldop.getopnum() == op.getopnum()
-                self.optimizer.make_equal_to(op, self.getvalue(oldop), True)
+                self.optimizer.make_equal_to(op, self.getvalue(oldop))
                 return
             else:
                 self.pure_operations[args] = op
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -215,13 +215,13 @@
             v2 = self.getvalue(rhs)
 
             if v1.is_constant():
-                if v1.box.getfloat() == 1.0:
-                    self.make_equal_to(op.result, v2)
+                if v1.box.getfloatstorage() == 1.0:
+                    self.make_equal_to(op, v2)
                     return
-                elif v1.box.getfloat() == -1.0:
-                    self.emit_operation(ResOperation(
-                        rop.FLOAT_NEG, [rhs], op.result
-                    ))
+                elif v1.box.getfloatstorage() == -1.0:
+                    newop = self.optimizer.replace_op_with(op, rop.FLOAT_NEG,
+                                                           args=[rhs])
+                    self.emit_operation(newop)
                     return
         self.emit_operation(op)
         self.pure(rop.FLOAT_MUL, [arg2, arg1], op)
@@ -248,7 +248,7 @@
     def optimize_FLOAT_NEG(self, op):
         v1 = op.getarg(0)
         self.emit_operation(op)
-        self.pure(rop.FLOAT_NEG, [op.result], v1)
+        self.pure(rop.FLOAT_NEG, [op], v1)
 
     def optimize_guard(self, op, constbox, emit_operation=True):
         value = self.getvalue(op.getarg(0))
@@ -313,8 +313,10 @@
                 if not previous_classbox.same_constant(expected_classbox):
                     r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op)
                     raise InvalidLoop('A GUARD_VALUE (%s) was proven to always fail' % r)
-            op = old_guard_op.copy_and_change(rop.GUARD_VALUE,
-                                      args = [old_guard_op.getarg(0), op.getarg(1)])
+            arglist = [old_guard_op.getarg(0), op.getarg(1)]
+            op = self.optimizer.replace_op_with(old_guard_op,
+                                                rop.GUARD_VALUE,
+                                                args=arglist)
             self.getvalue(old_guard_op).box = op
             self.optimizer.replaces_guard[op] = old_guard_op
             # hack hack hack.  Change the guard_opnum on
@@ -364,8 +366,10 @@
             if old_guard_op.getopnum() == rop.GUARD_NONNULL:
                 # it was a guard_nonnull, which we replace with a
                 # guard_nonnull_class.
-                op = old_guard_op.copy_and_change (rop.GUARD_NONNULL_CLASS,
-                                         args = [old_guard_op.getarg(0), op.getarg(1)])
+                args = [old_guard_op.getarg(0), op.getarg(1)]
+                op = self.optimizer.replace_op_with(old_guard_op,
+                                                    rop.GUARD_NONNULL_CLASS,
+                                                    args)
                 self.optimizer.replaces_guard[op] = old_guard_op
                 # hack hack hack.  Change the guard_opnum on
                 # new_guard_op.getdescr() so that when resuming,
@@ -399,7 +403,8 @@
         # change the op to be a normal call, from the backend's point of view
         # there is no reason to have a separate operation for this
         self.loop_invariant_producer[key] = op
-        newop = op.copy_and_change(self.optimizer.call_for_descr(op.getdescr()))
+        opnum = self.optimizer.call_for_descr(op.getdescr())
+        newop = self.optimizer.replace_op_with(op, opnum)
         self.emit_operation(newop)
         resvalue = self.getvalue(op)
         resvalue.box = newop
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
@@ -86,7 +86,7 @@
     # common methods
     # --------------
 
-    def copy_and_change(self, opnum, args=None, result=None, descr=None):
+    def _copy_and_change(self, opnum, args=None, result=None, descr=None):
         "shallow copy: the returned operation is meant to be used in place of self"
         if args is None:
             args = self.getarglist()
@@ -270,8 +270,8 @@
     def setfailargs(self, fail_args):
         self._fail_args = fail_args
 
-    def copy_and_change(self, opnum, args=None, result=None, descr=None):
-        newop = AbstractResOp.copy_and_change(self, opnum, args, result, descr)
+    def _copy_and_change(self, opnum, args=None, result=None, descr=None):
+        newop = AbstractResOp._copy_and_change(self, opnum, args, result, descr)
         newop.setfailargs(self.getfailargs())
         return newop
 


More information about the pypy-commit mailing list