Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r74520:6dfe20d64577
Date: 2014-11-14 10:44 +0200
http://bitbucket.org/pypy/pypy/changeset/6dfe20d64577/

Log:    hack enough to make the first test from optimizebasic pass

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
@@ -6,7 +6,7 @@
 from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, 
CONST_1,
     CONST_0, MODE_ARRAY, MODE_STR, MODE_UNICODE)
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop
+from rpython.jit.metainterp.resoperation import rop, AbstractResOp
 from rpython.jit.backend.llsupport import symbolic
 
 
@@ -58,11 +58,8 @@
         if b.has_lower and b.has_upper and b.lower == b.upper:
             v.make_constant(ConstInt(b.lower))
 
-        try:
-            op = self.optimizer.producer[box]
-        except KeyError:
-            return
-        dispatch_bounds_ops(self, op)
+        if isinstance(box, AbstractResOp):
+            dispatch_bounds_ops(self, box)
 
     def optimize_GUARD_TRUE(self, op):
         self.emit_operation(op)
@@ -83,7 +80,7 @@
         self.emit_operation(op)
         if v1.intbound.known_ge(IntBound(0, 0)) and \
            v2.intbound.known_ge(IntBound(0, 0)):
-            r = self.getvalue(op.result)
+            r = self.getvalue(op)
             mostsignificant = v1.intbound.upper | v2.intbound.upper
             r.intbound.intersect(IntBound(0, next_pow2_m1(mostsignificant)))
 
@@ -95,7 +92,7 @@
         v2 = self.getvalue(op.getarg(1))
         self.emit_operation(op)
 
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if v2.is_constant():
             val = v2.box.getint()
             if val >= 0:
@@ -113,7 +110,7 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         self.emit_operation(op)
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = v1.intbound.sub_bound(v2.intbound)
         if b.bounded():
             r.intbound.intersect(b)
@@ -122,7 +119,7 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         self.emit_operation(op)
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = v1.intbound.add_bound(v2.intbound)
         if b.bounded():
             r.intbound.intersect(b)
@@ -131,7 +128,7 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         self.emit_operation(op)
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = v1.intbound.mul_bound(v2.intbound)
         if b.bounded():
             r.intbound.intersect(b)
@@ -140,7 +137,7 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         self.emit_operation(op)
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         r.intbound.intersect(v1.intbound.div_bound(v2.intbound))
 
     def optimize_INT_MOD(self, op):
@@ -158,7 +155,7 @@
         self.emit_operation(op)
         if v2.is_constant():
             val = v2.box.getint()
-            r = self.getvalue(op.result)
+            r = self.getvalue(op)
             if val < 0:
                 if val == -sys.maxint-1:
                     return     # give up
@@ -173,7 +170,7 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         self.emit_operation(op)
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = v1.intbound.lshift_bound(v2.intbound)
         r.intbound.intersect(b)
         # intbound.lshift_bound checks for an overflow and if the
@@ -192,7 +189,7 @@
             self.make_constant_int(op.result, b.lower)
         else:
             self.emit_operation(op)
-            r = self.getvalue(op.result)
+            r = self.getvalue(op)
             r.intbound.intersect(b)
 
     def optimize_GUARD_NO_OVERFLOW(self, op):
@@ -245,7 +242,7 @@
             # optimize_GUARD_OVERFLOW, then InvalidLoop.
             op = op.copy_and_change(rop.INT_ADD)
         self.emit_operation(op) # emit the op
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         r.intbound.intersect(resbound)
 
     def optimize_INT_SUB_OVF(self, op):
@@ -258,7 +255,7 @@
         if resbound.bounded():
             op = op.copy_and_change(rop.INT_SUB)
         self.emit_operation(op) # emit the op
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         r.intbound.intersect(resbound)
 
     def optimize_INT_MUL_OVF(self, op):
@@ -268,7 +265,7 @@
         if resbound.bounded():
             op = op.copy_and_change(rop.INT_MUL)
         self.emit_operation(op)
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         r.intbound.intersect(resbound)
 
     def optimize_INT_LT(self, op):
@@ -345,7 +342,7 @@
     def optimize_ARRAYLEN_GC(self, op):
         self.emit_operation(op)
         array = self.getvalue(op.getarg(0))
-        result = self.getvalue(op.result)
+        result = self.getvalue(op)
         array.make_len_gt(MODE_ARRAY, op.getdescr(), -1)
         array.lenbound.bound.intersect(result.intbound)
         result.intbound = array.lenbound.bound
@@ -353,7 +350,7 @@
     def optimize_STRLEN(self, op):
         self.emit_operation(op)
         array = self.getvalue(op.getarg(0))
-        result = self.getvalue(op.result)
+        result = self.getvalue(op)
         array.make_len_gt(MODE_STR, op.getdescr(), -1)
         array.lenbound.bound.intersect(result.intbound)
         result.intbound = array.lenbound.bound
@@ -361,14 +358,14 @@
     def optimize_UNICODELEN(self, op):
         self.emit_operation(op)
         array = self.getvalue(op.getarg(0))
-        result = self.getvalue(op.result)
+        result = self.getvalue(op)
         array.make_len_gt(MODE_UNICODE, op.getdescr(), -1)
         array.lenbound.bound.intersect(result.intbound)
         result.intbound = array.lenbound.bound
 
     def optimize_STRGETITEM(self, op):
         self.emit_operation(op)
-        v1 = self.getvalue(op.result)
+        v1 = self.getvalue(op)
         v1.intbound.make_ge(IntLowerBound(0))
         v1.intbound.make_lt(IntUpperBound(256))
 
@@ -376,7 +373,7 @@
         self.emit_operation(op)
         descr = op.getdescr()
         if descr.is_integer_bounded():
-            v1 = self.getvalue(op.result)
+            v1 = self.getvalue(op)
             v1.intbound.make_ge(IntLowerBound(descr.get_integer_min()))
             v1.intbound.make_le(IntUpperBound(descr.get_integer_max()))
 
@@ -393,7 +390,7 @@
         self.emit_operation(op)
         descr = op.getdescr()
         if descr and descr.is_item_integer_bounded():
-            v1 = self.getvalue(op.result)
+            v1 = self.getvalue(op)
             v1.intbound.make_ge(IntLowerBound(descr.get_item_integer_min()))
             v1.intbound.make_le(IntUpperBound(descr.get_item_integer_max()))
 
@@ -404,7 +401,7 @@
 
     def optimize_UNICODEGETITEM(self, op):
         self.emit_operation(op)
-        v1 = self.getvalue(op.result)
+        v1 = self.getvalue(op)
         v1.intbound.make_ge(IntLowerBound(0))
 
     def make_int_lt(self, box1, box2):
@@ -430,7 +427,7 @@
         self.make_int_le(box2, box1)
 
     def propagate_bounds_INT_LT(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 self.make_int_lt(op.getarg(0), op.getarg(1))
@@ -438,7 +435,7 @@
                 self.make_int_ge(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_GT(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 self.make_int_gt(op.getarg(0), op.getarg(1))
@@ -446,7 +443,7 @@
                 self.make_int_le(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_LE(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 self.make_int_le(op.getarg(0), op.getarg(1))
@@ -454,7 +451,7 @@
                 self.make_int_gt(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_GE(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 self.make_int_ge(op.getarg(0), op.getarg(1))
@@ -462,7 +459,7 @@
                 self.make_int_lt(op.getarg(0), op.getarg(1))
 
     def propagate_bounds_INT_EQ(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 v1 = self.getvalue(op.getarg(0))
@@ -473,7 +470,7 @@
                     self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_NE(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_0):
                 v1 = self.getvalue(op.getarg(0))
@@ -484,7 +481,7 @@
                     self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_IS_TRUE(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 v1 = self.getvalue(op.getarg(0))
@@ -493,7 +490,7 @@
                     self.propagate_bounds_backward(op.getarg(0))
 
     def propagate_bounds_INT_IS_ZERO(self, op):
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         if r.is_constant():
             if r.box.same_constant(CONST_1):
                 v1 = self.getvalue(op.getarg(0))
@@ -507,7 +504,7 @@
     def propagate_bounds_INT_ADD(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.intbound.sub_bound(v2.intbound)
         if v1.intbound.intersect(b):
             self.propagate_bounds_backward(op.getarg(0))
@@ -518,7 +515,7 @@
     def propagate_bounds_INT_SUB(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.intbound.add_bound(v2.intbound)
         if v1.intbound.intersect(b):
             self.propagate_bounds_backward(op.getarg(0))
@@ -529,7 +526,7 @@
     def propagate_bounds_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.intbound.div_bound(v2.intbound)
         if v1.intbound.intersect(b):
             self.propagate_bounds_backward(op.getarg(0))
@@ -540,7 +537,7 @@
     def propagate_bounds_INT_LSHIFT(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.intbound.rshift_bound(v2.intbound)
         if v1.intbound.intersect(b):
             self.propagate_bounds_backward(op.getarg(0))
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
@@ -273,7 +273,7 @@
 CVAL_ZERO    = ConstantValue(CONST_0)
 CVAL_ZERO_FLOAT = ConstantValue(Const._new(0.0))
 llhelper.CVAL_NULLREF = ConstantValue(llhelper.CONST_NULL)
-REMOVED = AbstractResOp(None)
+REMOVED = AbstractResOp()
 
 
 class Optimization(object):
@@ -377,14 +377,12 @@
         self.interned_ints = {}
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
         self.bool_boxes = {}
-        self.producer = {}
         self.pendingfields = None # set temporarily to a list, normally by
                                   # heap.py, as we're about to generate a guard
         self.quasi_immutable_deps = None
         self.opaque_pointers = {}
         self.replaces_guard = {}
         self._newoperations = []
-        self.seen_results = {}
         self.optimizer = self
         self.optpure = None
         self.optearlyforce = None
@@ -479,7 +477,6 @@
 
     def clear_newoperations(self):
         self._newoperations = []
-        self.seen_results = {}
 
     def make_equal_to(self, box, value, replace=False):
         assert isinstance(value, OptValue)
@@ -541,7 +538,6 @@
         self.first_optimization.propagate_forward(op)
 
     def propagate_forward(self, op):
-        self.producer[op.result] = op
         dispatch_opt(self, op)
 
     def emit_operation(self, op):
@@ -574,10 +570,6 @@
                 op = self.store_final_boxes_in_guard(op, pendingfields)
         elif op.can_raise():
             self.exception_might_have_happened = True
-        if op.result:
-            if op.result in self.seen_results:
-                raise ValueError, "invalid optimization"
-            self.seen_results[op.result] = None
         self._newoperations.append(op)
 
     def replace_op(self, old_op, new_op):
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
@@ -38,7 +38,8 @@
                 return
 
             # did we do the exact same operation already?
-            args = self.optimizer.make_args_key(op)
+            args = self.optimizer.make_args_key(op.getopnum(),
+                                                op.getarglist(), op.getdescr())
             oldop = self.pure_operations.get(args, None)
             if oldop is not None and oldop.getdescr() is op.getdescr():
                 assert oldop.getopnum() == op.getopnum()
@@ -102,8 +103,7 @@
         self.optimizer.optpure = self
 
     def pure(self, opnum, args, result):
-        op = ResOperation(opnum, args, result)
-        key = self.optimizer.make_args_key(op)
+        key = self.optimizer.make_args_key(opnum, args, None)
         if key not in self.pure_operations:
             self.pure_operations[key] = result
 
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
@@ -119,8 +119,8 @@
         else:
             self.emit_operation(op)
             # Synthesize the reverse ops for optimize_default to reuse
-            self.pure(rop.INT_ADD, [op.result, op.getarg(1)], op.getarg(0))
-            self.pure(rop.INT_SUB, [op.getarg(0), op.result], op.getarg(1))
+            self.pure(rop.INT_ADD, [op, op.getarg(1)], op.getarg(0))
+            self.pure(rop.INT_SUB, [op.getarg(0), op], op.getarg(1))
 
     def optimize_INT_ADD(self, op):
         v1 = self.getvalue(op.getarg(0))
@@ -133,10 +133,10 @@
             self.make_equal_to(op.result, v1)
         else:
             self.emit_operation(op)
-            self.pure(rop.INT_ADD, [op.getarg(1), op.getarg(0)], op.result)
+            self.pure(rop.INT_ADD, [op.getarg(1), op.getarg(0)], op)
             # Synthesize the reverse op for optimize_default to reuse
-            self.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0))
-            self.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1))
+            self.pure(rop.INT_SUB, [op, op.getarg(1)], op.getarg(0))
+            self.pure(rop.INT_SUB, [op, op.getarg(0)], op.getarg(1))
 
     def optimize_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -105,7 +105,7 @@
             loop.operations[-1].setdescr(token)
         expected = convert_old_style_to_targets(self.parse(optops), jump=True)
         self._do_optimize_loop(loop, call_pure_results)
-        print '\n'.join([str(o) for o in loop.operations])
+        #print '\n'.join([str(o) for o in loop.operations])
         self.assert_equal(loop, expected)
 
     def setup_method(self, meth=None):
diff --git a/rpython/jit/metainterp/optimizeopt/util.py 
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -157,32 +157,11 @@
             x = op1.getarg(i)
             y = op2.getarg(i)
             assert x.same_box(remap.get(y, y))
-        if op2.result in remap:
-            if op2.result is None:
-                assert op1.result == remap[op2.result]
-            else:
-                assert op1.result.same_box(remap[op2.result])
+        if op2 in remap:
+            assert op1.same_box(remap[op2])
         else:
-            remap[op2.result] = op1.result
-        if op1.getopnum() not in (rop.JUMP, rop.LABEL):      # xxx obscure
+            remap[op2] = op1
+        if op1.getopnum() not in (rop.JUMP, rop.LABEL) and not op1.is_guard(): 
     # xxx obscure
             assert op1.getdescr() == op2.getdescr()
-        if op1.getfailargs() or op2.getfailargs():
-            assert len(op1.getfailargs()) == len(op2.getfailargs())
-            if strict_fail_args:
-                for x, y in zip(op1.getfailargs(), op2.getfailargs()):
-                    if x is None:
-                        assert remap.get(y, y) is None
-                    else:
-                        assert x.same_box(remap.get(y, y))
-            else:
-                fail_args1 = set(op1.getfailargs())
-                fail_args2 = set([remap.get(y, y) for y in op2.getfailargs()])
-                for x in fail_args1:
-                    for y in fail_args2:
-                        if x.same_box(y):
-                            fail_args2.remove(y)
-                            break
-                    else:
-                        assert False
     assert len(oplist1) == len(oplist2)
     return True
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
@@ -5,10 +5,13 @@
     def _get_hash_(self):
         return compute_identity_hash(self)
 
+    def same_box(self, other):
+        return self is other
+
 @specialize.argtype(2)
 def ResOperation(opnum, args, result, descr=None):
     cls = opclasses[opnum]
-    op = cls(result)
+    op = cls()
     op.initarglist(args)
     if descr is not None:
         assert isinstance(op, ResOpWithDescr)
@@ -44,9 +47,6 @@
 
     _attrs_ = ()
 
-    def __init__(self, result):
-        self.result = result
-
     def getopnum(self):
         return self.opnum
 
@@ -115,14 +115,9 @@
             op.pc = self.pc
         return op
 
-    def __repr__(self):
-        try:
-            return self.repr()
-        except NotImplementedError:
-            return object.__repr__(self)
-
-    def repr(self, graytext=False):
+    def repr(self, memo, graytext=False):
         # RPython-friendly version
+        XXX
         if self.result is not None:
             sres = '%s = ' % (self.result,)
         else:
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -23,7 +23,7 @@
         return 'escape'
 
     def clone(self):
-        op = ESCAPE_OP(0)
+        op = ESCAPE_OP()
         op.initarglist(self.getarglist()[:])
         return op
 
@@ -38,7 +38,7 @@
         return 'force_spill'
 
     def clone(self):
-        op = FORCE_SPILL(0)
+        op = FORCE_SPILL()
         op.initarglist(self.getarglist()[:])
         return op
 
@@ -265,12 +265,12 @@
 
     def create_op(self, opnum, args, descr):
         if opnum == ESCAPE_OP.OPNUM:
-            op = ESCAPE_OP(0)
+            op = ESCAPE_OP()
             op.initarglist(args)
             assert descr is None
             return op
         if opnum == FORCE_SPILL.OPNUM:
-            op = FORCE_SPILL(0)
+            op = FORCE_SPILL()
             op.initarglist(args)
             assert descr is None
             return op
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to