Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r74523:2f3a6006bba2
Date: 2014-11-14 18:52 +0200
http://bitbucket.org/pypy/pypy/changeset/2f3a6006bba2/

Log:    whack until a third of test_optimizebasic passes, nothing to see
        there, really

diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -98,7 +98,7 @@
             self._lazy_setfield = None
             if optheap.postponed_op:
                 for a in op.getarglist():
-                    if a is optheap.postponed_op.result:
+                    if a is optheap.postponed_op:
                         optheap.emit_postponed_op()
                         break
             optheap.next_optimization.propagate_forward(op)
@@ -162,6 +162,7 @@
                                          result, op.getdescr())
                     shortboxes.add_potential(getop, synthetic=True)
                 elif op.result is not None:
+                    xxxx
                     shortboxes.add_potential(op)
 
 class BogusPureField(JitException):
@@ -317,10 +318,10 @@
         try:
             res_v = d[args]
         except KeyError:
-            d[args] = self.getvalue(op.result)
+            d[args] = self.getvalue(op)
             return False
         else:
-            self.make_equal_to(op.result, res_v)
+            self.make_equal_to(op, res_v)
             self.last_emitted_operation = REMOVED
             return True
 
@@ -436,13 +437,13 @@
         cf = self.field_cache(op.getdescr())
         fieldvalue = cf.getfield_from_cache(self, structvalue)
         if fieldvalue is not None:
-            self.make_equal_to(op.result, fieldvalue)
+            self.make_equal_to(op, fieldvalue)
             return
         # default case: produce the operation
         structvalue.ensure_nonnull()
         self.emit_operation(op)
         # then remember the result of reading the field
-        fieldvalue = self.getvalue(op.result)
+        fieldvalue = self.getvalue(op)
         cf.remember_field_value(structvalue, fieldvalue, op)
     optimize_GETFIELD_GC_R = optimize_GETFIELD_GC_I
     optimize_GETFIELD_GC_F = optimize_GETFIELD_GC_I
@@ -452,7 +453,7 @@
         cf = self.field_cache(op.getdescr())
         fieldvalue = cf.getfield_from_cache(self, structvalue)
         if fieldvalue is not None:
-            self.make_equal_to(op.result, fieldvalue)
+            self.make_equal_to(op, fieldvalue)
             return
         # default case: produce the operation
         structvalue.ensure_nonnull()
@@ -461,7 +462,8 @@
     optimize_GETFIELD_GC_PURE_F = optimize_GETFIELD_GC_PURE_I
 
     def optimize_SETFIELD_GC(self, op):
-        if self.has_pure_result(rop.GETFIELD_GC_PURE, [op.getarg(0)],
+        opnum = self.optimizer.getfield_pure_for_descr(op.getdescr())
+        if self.has_pure_result(opnum, [op.getarg(0)],
                                 op.getdescr()):
             os.write(2, '[bogus _immutable_field_ declaration: %s]\n' %
                      (op.getdescr().repr_of_descr()))
@@ -480,7 +482,7 @@
             cf = self.arrayitem_cache(op.getdescr(), indexvalue.box.getint())
             fieldvalue = cf.getfield_from_cache(self, arrayvalue)
             if fieldvalue is not None:
-                self.make_equal_to(op.result, fieldvalue)
+                self.make_equal_to(op, fieldvalue)
                 return
         else:
             # variable index, so make sure the lazy setarrayitems are done
@@ -490,7 +492,7 @@
         self.emit_operation(op)
         # the remember the result of reading the array item
         if cf is not None:
-            fieldvalue = self.getvalue(op.result)
+            fieldvalue = self.getvalue(op)
             cf.remember_field_value(arrayvalue, fieldvalue, op)
     optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I
     optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I
@@ -505,7 +507,7 @@
             cf = self.arrayitem_cache(op.getdescr(), indexvalue.box.getint())
             fieldvalue = cf.getfield_from_cache(self, arrayvalue)
             if fieldvalue is not None:
-                self.make_equal_to(op.result, fieldvalue)
+                self.make_equal_to(op, fieldvalue)
                 return
         else:
             # variable index, so make sure the lazy setarrayitems are done
@@ -518,8 +520,8 @@
     optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_PURE_I
 
     def optimize_SETARRAYITEM_GC(self, op):
-        if self.has_pure_result(rop.GETARRAYITEM_GC_PURE, [op.getarg(0),
-                                                           op.getarg(1)],
+        opnum = self.optimizer.getarrayitem_pure_for_descr(op.getdescr())
+        if self.has_pure_result(opnum, [op.getarg(0), op.getarg(1)],
                                 op.getdescr()):
             os.write(2, '[bogus immutable array declaration: %s]\n' %
                      (op.getdescr().repr_of_descr()))
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
@@ -331,6 +331,31 @@
             return self.optimizer.optpure.get_pure_result(key)
         return None
 
+    def getfield_pure_for_descr(self, descr):
+        if descr.is_pointer_field():
+            return rop.GETFIELD_GC_PURE_R
+        elif descr.is_float_field():
+            return rop.GETFIELD_GC_PURE_F
+        return rop.GETFIELD_GC_PURE_I
+
+    def getarrayitem_pure_for_descr(self, descr):
+        if descr.is_array_of_pointers():
+            return rop.GETARRAYITEM_GC_PURE_R
+        elif descr.is_array_of_floats():
+            return rop.GETARRAYITEM_GC_PURE_F
+        return rop.GETARRAYITEM_GC_PURE_I
+
+    def call_for_descr(self, descr):
+        tp = descr.get_result_type()
+        if tp == 'i':
+            return rop.CALL_I
+        elif tp == 'r':
+            return rop.CALL_R
+        elif tp == 'f':
+            return rop.CALL_F
+        assert tp == 'v'
+        return rop.CALL_N
+
     def setup(self):
         pass
 
@@ -603,6 +628,7 @@
                 # This is done after the operation is emitted to let
                 # store_final_boxes_in_guard set the guard_opnum field of the
                 # descr to the original rop.GUARD_VALUE.
+                v = self.getvalue(op)
                 constvalue = op.getarg(1).getint()
                 if constvalue == 0:
                     opnum = rop.GUARD_FALSE
@@ -610,8 +636,9 @@
                     opnum = rop.GUARD_TRUE
                 else:
                     raise AssertionError("uh?")
-                newop = ResOperation(opnum, [op.getarg(0)], op.result, descr)
+                newop = ResOperation(opnum, [op.getarg(0)], descr)
                 newop.setfailargs(op.getfailargs())
+                v.box = newop
                 return newop
             else:
                 # a real GUARD_VALUE.  Make it use one counter per value.
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
@@ -67,7 +67,8 @@
 
         # Step 2: check if all arguments are the same as a previous
         # CALL_PURE.
-        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()
@@ -82,7 +83,10 @@
 
         # replace CALL_PURE with just CALL
         args = op.getarglist()
-        self.emit_operation(ResOperation(rop.CALL, args, op.getdescr()))
+        opnum = self.optimizer.call_for_descr(op.getdescr())
+        newop = ResOperation(opnum, args, op.getdescr())
+        self.getvalue(op).box = newop
+        self.emit_operation(newop)
     optimize_CALL_PURE_R = optimize_CALL_PURE_I
     optimize_CALL_PURE_F = optimize_CALL_PURE_I
     optimize_CALL_PURE_N = optimize_CALL_PURE_I
@@ -106,8 +110,7 @@
             self.pure_operations[key] = result
 
     def has_pure_result(self, opnum, args, descr):
-        op = ResOperation(opnum, args, None, descr)
-        key = self.optimizer.make_args_key(op)
+        key = self.optimizer.make_args_key(opnum, args, descr)
         op = self.pure_operations.get(key, None)
         if op is None:
             return False
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
@@ -224,7 +224,7 @@
                     ))
                     return
         self.emit_operation(op)
-        self.pure(rop.FLOAT_MUL, [arg2, arg1], op.result)
+        self.pure(rop.FLOAT_MUL, [arg2, arg1], op)
 
     def optimize_FLOAT_TRUEDIV(self, op):
         arg1 = op.getarg(0)
@@ -392,15 +392,16 @@
 
         resvalue = self.loop_invariant_results.get(key, None)
         if resvalue is not None:
-            self.make_equal_to(op.result, resvalue)
+            self.make_equal_to(op, resvalue)
             self.last_emitted_operation = REMOVED
             return
         # 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
-        op = op.copy_and_change(rop.CALL)
-        self.emit_operation(op)
-        resvalue = self.getvalue(op.result)
+        newop = 
op.copy_and_change(self.optimizer.call_for_descr(op.getdescr()))
+        self.emit_operation(newop)
+        resvalue = self.getvalue(op)
+        resvalue.box = newop
         self.loop_invariant_results[key] = resvalue
     optimize_CALL_LOOPINVARIANT_R = optimize_CALL_LOOPINVARIANT_I
     optimize_CALL_LOOPINVARIANT_F = optimize_CALL_LOOPINVARIANT_I
@@ -427,7 +428,7 @@
 
     def optimize_INT_IS_TRUE(self, op):
         if self.getvalue(op.getarg(0)) in self.optimizer.bool_boxes:
-            self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
+            self.make_equal_to(op, self.getvalue(op.getarg(0)))
             return
         self._optimize_nullness(op, op.getarg(0), True)
 
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
@@ -445,7 +445,7 @@
         pv = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(pv, p0, descr=valuedescr)
         guard_nonnull(p0) []
-        p1 = getfield_gc(pv, descr=valuedescr)
+        p1 = getfield_gc_r(pv, descr=valuedescr)
         guard_nonnull(p1) []
         jump(p0)
         """
@@ -589,7 +589,7 @@
     def test_p123_simple(self):
         ops = """
         [i1, p2, p3]
-        i3 = getfield_gc(p3, descr=valuedescr)
+        i3 = getfield_gc_i(p3, descr=valuedescr)
         escape(i3)
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i1, descr=valuedescr)
@@ -601,7 +601,7 @@
     def test_p123_nested(self):
         ops = """
         [i1, p2, p3]
-        i3 = getfield_gc(p3, descr=valuedescr)
+        i3 = getfield_gc_i(p3, descr=valuedescr)
         escape(i3)
         p1 = new_with_vtable(ConstClass(node_vtable))
         p1sub = new_with_vtable(ConstClass(node_vtable2))
@@ -617,8 +617,8 @@
     def test_p123_anti_nested(self):
         ops = """
         [i1, p2, p3]
-        p3sub = getfield_gc(p3, descr=nextdescr)
-        i3 = getfield_gc(p3sub, descr=valuedescr)
+        p3sub = getfield_gc_r(p3, descr=nextdescr)
+        i3 = getfield_gc_i(p3sub, descr=valuedescr)
         escape(i3)
         p1 = new_with_vtable(ConstClass(node_vtable))
         p2sub = new_with_vtable(ConstClass(node_vtable2))
@@ -635,7 +635,7 @@
     def test_keep_guard_no_exception(self):
         ops = """
         [i1]
-        i2 = call(i1, descr=nonwritedescr)
+        i2 = call_i(i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2]
         jump(i2)
         """
@@ -644,13 +644,13 @@
     def test_keep_guard_no_exception_with_call_pure_that_is_not_folded(self):
         ops = """
         [i1]
-        i2 = call_pure(123456, i1, descr=nonwritedescr)
+        i2 = call_pure_i(123456, i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2]
         jump(i2)
         """
         expected = """
         [i1]
-        i2 = call(123456, i1, descr=nonwritedescr)
+        i2 = call_i(123456, i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2]
         jump(i2)
         """
@@ -661,8 +661,8 @@
         call_pure_results = {tuple(arg_consts): ConstInt(5)}
         ops = """
         [i1]
-        i3 = same_as(81)
-        i2 = call_pure(123456, i3, descr=nonwritedescr)
+        i3 = same_as_i(81)
+        i2 = call_pure_i(123456, i3, descr=nonwritedescr)
         guard_no_exception() [i1, i2]
         jump(i2)
         """
@@ -675,15 +675,15 @@
     def test_remove_guard_no_exception_with_duplicated_call_pure(self):
         ops = """
         [i1]
-        i2 = call_pure(123456, i1, descr=nonwritedescr)
+        i2 = call_pure_i(123456, i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2]
-        i3 = call_pure(123456, i1, descr=nonwritedescr)
+        i3 = call_pure_i(123456, i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2, i3]
         jump(i3)
         """
         expected = """
         [i1]
-        i2 = call(123456, i1, descr=nonwritedescr)
+        i2 = call_i(123456, i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2]
         jump(i2)
         """
@@ -694,20 +694,20 @@
     def test_call_loopinvariant(self):
         ops = """
         [i1]
-        i2 = call_loopinvariant(1, i1, descr=nonwritedescr)
+        i2 = call_loopinvariant_i(1, i1, descr=nonwritedescr)
         guard_no_exception() []
         guard_value(i2, 1) []
-        i3 = call_loopinvariant(1, i1, descr=nonwritedescr)
+        i3 = call_loopinvariant_i(1, i1, descr=nonwritedescr)
         guard_no_exception() []
         guard_value(i3, 1) []
-        i4 = call_loopinvariant(1, i1, descr=nonwritedescr)
+        i4 = call_loopinvariant_i(1, i1, descr=nonwritedescr)
         guard_no_exception() []
         guard_value(i4, 1) []
         jump(i1)
         """
         expected = """
         [i1]
-        i2 = call(1, i1, descr=nonwritedescr)
+        i2 = call_i(1, i1, descr=nonwritedescr)
         guard_no_exception() []
         guard_value(i2, 1) []
         jump(i1)
@@ -847,7 +847,7 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        i0 = getfield_gc(p1, descr=valuedescr)
+        i0 = getfield_gc_i(p1, descr=valuedescr)
         i1 = int_add(i0, 1)
         jump(i1)
         """
@@ -912,7 +912,7 @@
         [i0]
         p0 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p0, NULL, descr=nextdescr)
-        p2 = getfield_gc(p0, descr=nextdescr)
+        p2 = getfield_gc_r(p0, descr=nextdescr)
         i1 = ptr_eq(p2, NULL)
         jump(i1)
         """
@@ -927,7 +927,7 @@
         [i0]
         p0 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p0, ConstPtr(myptr), descr=nextdescr)
-        p2 = getfield_gc(p0, descr=nextdescr)
+        p2 = getfield_gc_r(p0, descr=nextdescr)
         i1 = ptr_eq(p2, NULL)
         jump(i1)
         """
@@ -945,11 +945,11 @@
         setinteriorfield_gc(p0, 0, f0, descr=complexrealdescr)
         setinteriorfield_gc(p0, 1, f3, descr=compleximagdescr)
         setinteriorfield_gc(p0, 1, f2, descr=complexrealdescr)
-        f4 = getinteriorfield_gc(p0, 0, descr=complexrealdescr)
-        f5 = getinteriorfield_gc(p0, 1, descr=complexrealdescr)
+        f4 = getinteriorfield_gc_f(p0, 0, descr=complexrealdescr)
+        f5 = getinteriorfield_gc_f(p0, 1, descr=complexrealdescr)
         f6 = float_mul(f4, f5)
-        f7 = getinteriorfield_gc(p0, 0, descr=compleximagdescr)
-        f8 = getinteriorfield_gc(p0, 1, descr=compleximagdescr)
+        f7 = getinteriorfield_gc_f(p0, 0, descr=compleximagdescr)
+        f8 = getinteriorfield_gc_f(p0, 1, descr=compleximagdescr)
         f9 = float_mul(f7, f8)
         f10 = float_add(f6, f9)
         finish(f10)
@@ -969,8 +969,8 @@
         p0 = new_array_clear(1, descr=complexarraydescr)
         setinteriorfield_gc(p0, 0, f0, descr=complexrealdescr)
         setinteriorfield_gc(p0, 0, f1, descr=compleximagdescr)
-        f2 = getinteriorfield_gc(p0, 0, descr=complexrealdescr)
-        f3 = getinteriorfield_gc(p0, 0, descr=compleximagdescr)
+        f2 = getinteriorfield_gc_f(p0, 0, descr=complexrealdescr)
+        f3 = getinteriorfield_gc_f(p0, 0, descr=compleximagdescr)
         f4 = float_mul(f2, f3)
         i0 = escape(f4, p0)
         finish(i0)
@@ -1004,7 +1004,7 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        i0 = getfield_gc(p1, descr=valuedescr)
+        i0 = getfield_gc_i(p1, descr=valuedescr)
         i1 = int_add(i0, 1)
         escape(p1)
         escape(p1)
@@ -1024,7 +1024,7 @@
     def test_nonvirtual_2(self):
         ops = """
         [i, p0]
-        i0 = getfield_gc(p0, descr=valuedescr)
+        i0 = getfield_gc_i(p0, descr=valuedescr)
         escape(p0)
         i1 = int_add(i0, i)
         p1 = new_with_vtable(ConstClass(node_vtable))
@@ -1039,9 +1039,9 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         escape(p1)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         i3 = int_add(i1, i2)
         jump(i3)
         """
@@ -1050,7 +1050,7 @@
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
         escape(p1)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         i3 = int_add(i, i2)
         jump(i3)
         """
@@ -1061,10 +1061,10 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         setfield_gc(p1, 0, descr=valuedescr)
         escape(p1)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         jump(i2)
         """
         expected = """
@@ -1072,7 +1072,7 @@
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, 0, descr=valuedescr)
         escape(p1)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         jump(i2)
         """
         self.optimize_loop(ops, expected)
@@ -1082,7 +1082,7 @@
         [i]
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i, descr=valuedescr)
-        i1 = getfield_gc_pure(p1, descr=valuedescr)
+        i1 = getfield_gc_pure_i(p1, descr=valuedescr)
         jump(i1)
         """
         expected = """
@@ -1094,7 +1094,7 @@
     def test_getfield_gc_pure_2(self):
         ops = """
         [i]
-        i1 = getfield_gc_pure(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_pure_i(ConstPtr(myptr), descr=valuedescr)
         jump(i1)
         """
         expected = """
@@ -1107,7 +1107,7 @@
     def test_getfield_gc_nonpure_2(self):
         ops = """
         [i]
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         jump(i1)
         """
         expected = ops
@@ -1121,7 +1121,7 @@
         guard_value(i3, 3) []
         setarrayitem_gc(p1, 1, i1, descr=arraydescr)
         setarrayitem_gc(p1, 0, 25, descr=arraydescr)
-        i2 = getarrayitem_gc(p1, 1, descr=arraydescr)
+        i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
         jump(i2)
         """
         expected = """
@@ -1135,7 +1135,7 @@
         [i1]
         p1 = new_array(2, descr=arraydescr)
         setarrayitem_gc(p1, 0, 25, descr=arraydescr)
-        i2 = getarrayitem_gc(p1, 0, descr=arraydescr)
+        i2 = getarrayitem_gc_i(p1, 0, descr=arraydescr)
         jump(i2)
         """
         expected = """
@@ -1152,7 +1152,7 @@
         guard_value(i3, 3) []
         setarrayitem_gc(p1, 1, f1, descr=floatarraydescr)
         setarrayitem_gc(p1, 0, 3.5, descr=floatarraydescr)
-        f2 = getarrayitem_gc(p1, 1, descr=floatarraydescr)
+        f2 = getarrayitem_gc_f(p1, 1, descr=floatarraydescr)
         jump(f2)
         """
         expected = """
@@ -1220,7 +1220,7 @@
     def test_p123_array(self):
         ops = """
         [i1, p2, p3]
-        i3 = getarrayitem_gc(p3, 0, descr=arraydescr)
+        i3 = getarrayitem_gc_i(p3, 0, descr=arraydescr)
         escape(i3)
         p1 = new_array(1, descr=arraydescr)
         setarrayitem_gc(p1, 0, i1, descr=arraydescr)
@@ -1234,7 +1234,7 @@
         []
         p2 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p2, 3, descr=valuedescr)
-        i1 = getfield_gc(p2, descr=valuedescr)    # i1 = const 3
+        i1 = getfield_gc_i(p2, descr=valuedescr)    # i1 = const 3
         p1 = new_array(i1, descr=arraydescr)
         escape(p1)
         i2 = arraylen_gc(p1)
@@ -1271,7 +1271,7 @@
     def test_p123_vstruct(self):
         ops = """
         [i1, p2, p3]
-        i3 = getfield_gc(p3, descr=adescr)
+        i3 = getfield_gc_i(p3, descr=adescr)
         escape(i3)
         p1 = new(descr=ssize)
         setfield_gc(p1, i1, descr=adescr)
@@ -1283,10 +1283,10 @@
     def test_duplicate_getfield_1(self):
         ops = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
-        i2 = getfield_gc(p2, descr=valuedescr)
-        i3 = getfield_gc(p1, descr=valuedescr)
-        i4 = getfield_gc(p2, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p2, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
+        i4 = getfield_gc_i(p2, descr=valuedescr)
         escape(i1)
         escape(i2)
         escape(i3)
@@ -1295,8 +1295,8 @@
         """
         expected = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
-        i2 = getfield_gc(p2, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p2, descr=valuedescr)
         escape(i1)
         escape(i2)
         escape(i1)
@@ -1309,7 +1309,7 @@
         ops = """
         [p1, i1]
         setfield_gc(p1, i1, descr=valuedescr)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         jump(p1, i1)
         """
@@ -1326,7 +1326,7 @@
         [p1, p2, i1]
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, p1, descr=nextdescr)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         jump(p1, p2, i1)
         """
@@ -1344,7 +1344,7 @@
         [p1, p2, i1, i2]
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, i2, descr=valuedescr)
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i3)
         jump(p1, p2, i1, i3)
         """
@@ -1353,16 +1353,16 @@
     def test_duplicate_getfield_mergepoint_has_no_side_effects(self):
         ops = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         debug_merge_point(15, 0)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i2)
         jump(p1)
         """
         expected = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         debug_merge_point(15, 0)
         escape(i1)
         escape(i1)
@@ -1373,17 +1373,17 @@
     def test_duplicate_getfield_ovf_op_does_not_clear(self):
         ops = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = int_add_ovf(i1, 14)
         guard_no_overflow() []
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         escape(i3)
         jump(p1)
         """
         expected = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = int_add_ovf(i1, 14)
         guard_no_overflow() []
         escape(i2)
@@ -1395,16 +1395,16 @@
     def test_duplicate_getfield_setarrayitem_does_not_clear(self):
         ops = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i3)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
         escape(i1)
         escape(i1)
@@ -1415,15 +1415,15 @@
     def test_duplicate_getfield_constant(self):
         ops = """
         []
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
-        i2 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
+        i2 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i2)
         jump()
         """
         expected = """
         []
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i1)
         jump()
@@ -1434,15 +1434,15 @@
         ops = """
         [p1]
         guard_value(p1, ConstPtr(myptr)) []
-        i1 = getfield_gc(p1, descr=valuedescr)
-        i2 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
+        i2 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i2)
         jump(p1)
         """
         expected = """
         []
-        i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
+        i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
         escape(i1)
         escape(i1)
         jump()
@@ -1453,9 +1453,9 @@
     def test_duplicate_getfield_sideeffects_1(self):
         ops = """
         [p1]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         escape()
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i2)
         jump(p1)
@@ -1467,7 +1467,7 @@
         [p1, i1]
         setfield_gc(p1, i1, descr=valuedescr)
         escape()
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         escape(i2)
         jump(p1, i1)
         """
@@ -1491,7 +1491,7 @@
         ops = """
         [p1, i1, i3]
         setfield_gc(p1, i1, descr=valuedescr)
-        i2 = getfield_gc(p1, descr=valuedescr)
+        i2 = getfield_gc_i(p1, descr=valuedescr)
         setfield_gc(p1, i3, descr=valuedescr)
         escape(i2)
         jump(p1, i1, i3)
@@ -1508,7 +1508,7 @@
         ops = """
         [p1, p2, i1, i3]
         setfield_gc(p1, i1, descr=valuedescr)
-        i2 = getfield_gc(p2, descr=valuedescr)
+        i2 = getfield_gc_i(p2, descr=valuedescr)
         setfield_gc(p1, i3, descr=valuedescr)
         escape(i2)
         jump(p1, p2, i1, i3)
@@ -1523,8 +1523,8 @@
         setfield_gc(p1, i1, descr=valuedescr)
         #
         # some operations on which the above setfield_gc cannot have effect
-        i3 = getarrayitem_gc_pure(p3, 1, descr=arraydescr)
-        i4 = getarrayitem_gc(p3, i3, descr=arraydescr)
+        i3 = getarrayitem_gc_pure_i(p3, 1, descr=arraydescr)
+        i4 = getarrayitem_gc_i(p3, i3, descr=arraydescr)
         i5 = int_add(i3, i4)
         setarrayitem_gc(p3, 0, i5, descr=arraydescr)
         setfield_gc(p1, i4, descr=nextdescr)
@@ -1535,8 +1535,8 @@
         expected = """
         [p1, i1, i2, p3]
         #
-        i3 = getarrayitem_gc_pure(p3, 1, descr=arraydescr)
-        i4 = getarrayitem_gc(p3, i3, descr=arraydescr)
+        i3 = getarrayitem_gc_pure_i(p3, 1, descr=arraydescr)
+        i4 = getarrayitem_gc_i(p3, i3, descr=arraydescr)
         i5 = int_add(i3, i4)
         #
         setfield_gc(p1, i2, descr=valuedescr)
@@ -1553,8 +1553,8 @@
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p0, p1, descr=nextdescr)
         setfield_raw(i1, i1, descr=valuedescr)    # random op with side-effects
-        p2 = getfield_gc(p0, descr=nextdescr)
-        i2 = getfield_gc(p2, descr=valuedescr)
+        p2 = getfield_gc_r(p0, descr=nextdescr)
+        i2 = getfield_gc_i(p2, descr=valuedescr)
         setfield_gc(p0, NULL, descr=nextdescr)
         escape(i2)
         jump(p0, i1)
@@ -1685,10 +1685,10 @@
     def test_duplicate_getarrayitem_1(self):
         ops = """
         [p1]
-        p2 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        p3 = getarrayitem_gc(p1, 1, descr=arraydescr2)
-        p4 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        p5 = getarrayitem_gc(p1, 1, descr=arraydescr2)
+        p2 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+        p3 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
+        p4 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+        p5 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
         escape(p2)
         escape(p3)
         escape(p4)
@@ -1697,8 +1697,8 @@
         """
         expected = """
         [p1]
-        p2 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        p3 = getarrayitem_gc(p1, 1, descr=arraydescr2)
+        p2 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+        p3 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
         escape(p2)
         escape(p3)
         escape(p2)
@@ -1711,7 +1711,7 @@
         ops = """
         [p1, p2]
         setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
-        p3 = getarrayitem_gc(p1, 0, descr=arraydescr2)
+        p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         escape(p3)
         jump(p1, p3)
         """
@@ -1752,9 +1752,9 @@
         setarrayitem_gc(p1, i1, p2, descr=arraydescr2)
         setarrayitem_gc(p1, 0, p3, descr=arraydescr2)
         setarrayitem_gc(p1, 1, p4, descr=arraydescr2)
-        p5 = getarrayitem_gc(p1, i1, descr=arraydescr2)
-        p6 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        p7 = getarrayitem_gc(p1, 1, descr=arraydescr2)
+        p5 = getarrayitem_gc_r(p1, i1, descr=arraydescr2)
+        p6 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+        p7 = getarrayitem_gc_r(p1, 1, descr=arraydescr2)
         escape(p5)
         escape(p6)
         escape(p7)
@@ -1765,7 +1765,7 @@
         setarrayitem_gc(p1, i1, p2, descr=arraydescr2)
         setarrayitem_gc(p1, 0, p3, descr=arraydescr2)
         setarrayitem_gc(p1, 1, p4, descr=arraydescr2)
-        p5 = getarrayitem_gc(p1, i1, descr=arraydescr2)
+        p5 = getarrayitem_gc_r(p1, i1, descr=arraydescr2)
         escape(p5)
         escape(p3)
         escape(p4)
@@ -1776,9 +1776,9 @@
     def test_getarrayitem_pure_does_not_invalidate(self):
         ops = """
         [p1, p2]
-        p3 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        i4 = getfield_gc_pure(ConstPtr(myptr), descr=valuedescr)
-        p5 = getarrayitem_gc(p1, 0, descr=arraydescr2)
+        p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+        i4 = getfield_gc_pure_i(ConstPtr(myptr), descr=valuedescr)
+        p5 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         escape(p3)
         escape(i4)
         escape(p5)
@@ -1786,7 +1786,7 @@
         """
         expected = """
         [p1, p2]
-        p3 = getarrayitem_gc(p1, 0, descr=arraydescr2)
+        p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
         escape(p3)
         escape(5)
         escape(p3)
@@ -1799,8 +1799,8 @@
         [p1, p2, p3, p4, i1]
         setarrayitem_gc(p1, 0, p3, descr=arraydescr2)
         setarrayitem_gc(p2, 1, p4, descr=arraydescr2)
-        p5 = getarrayitem_gc(p1, 0, descr=arraydescr2)
-        p6 = getarrayitem_gc(p2, 1, descr=arraydescr2)
+        p5 = getarrayitem_gc_r(p1, 0, descr=arraydescr2)
+        p6 = getarrayitem_gc_r(p2, 1, descr=arraydescr2)
         escape(p5)
         escape(p6)
         jump(p1, p2, p3, p4, i1)
@@ -1821,7 +1821,7 @@
         setarrayitem_gc(p0, 0, i0, descr=arraydescr)
         i6 = int_add(i0, 1)
         setarrayitem_gc(p0, i1, i6, descr=arraydescr)
-        i10 = getarrayitem_gc(p0, 0, descr=arraydescr)
+        i10 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
         i11 = int_add(i10, i0)
         jump(p0, i11, i1)
         """
@@ -1830,7 +1830,7 @@
         i6 = int_add(i0, 1)
         setarrayitem_gc(p0, 0, i0, descr=arraydescr)
         setarrayitem_gc(p0, i1, i6, descr=arraydescr)
-        i10 = getarrayitem_gc(p0, 0, descr=arraydescr)
+        i10 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
         i11 = int_add(i10, i0)
         jump(p0, i11, i1)
         """
@@ -1839,19 +1839,19 @@
     def test_duplicate_getarrayitem_after_setarrayitem_bug2(self):
         ops = """
         [p0, i0, i1]
-        i2 = getarrayitem_gc(p0, 0, descr=arraydescr)
+        i2 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
         i6 = int_add(i0, 1)
         setarrayitem_gc(p0, i1, i6, descr=arraydescr)
-        i10 = getarrayitem_gc(p0, 0, descr=arraydescr)
+        i10 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
         i11 = int_add(i10, i2)
         jump(p0, i11, i1)
         """
         expected = """
         [p0, i0, i1]
-        i2 = getarrayitem_gc(p0, 0, descr=arraydescr)
+        i2 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
         i6 = int_add(i0, 1)
         setarrayitem_gc(p0, i1, i6, descr=arraydescr)
-        i10 = getarrayitem_gc(p0, 0, descr=arraydescr)
+        i10 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
         i11 = int_add(i10, i2)
         jump(p0, i11, i1)
         """
@@ -1860,7 +1860,7 @@
     def test_bug_1(self):
         ops = """
         [i0, p1]
-        p4 = getfield_gc(p1, descr=nextdescr)
+        p4 = getfield_gc_r(p1, descr=nextdescr)
         guard_nonnull(p4) []
         escape(p4)
         #
@@ -1910,10 +1910,10 @@
         [p1]
         guard_nonnull(p1) []
         guard_class(p1, ConstClass(node_vtable2)) []
-        p2 = getfield_gc(p1, descr=nextdescr)
+        p2 = getfield_gc_r(p1, descr=nextdescr)
         guard_nonnull(12) []
         guard_class(p2, ConstClass(node_vtable)) []
-        p3 = getfield_gc(p1, descr=otherdescr)
+        p3 = getfield_gc_r(p1, descr=otherdescr)
         guard_nonnull(12) []
         guard_class(p3, ConstClass(node_vtable)) []
         setfield_gc(p3, p2, descr=otherdescr)
@@ -1943,10 +1943,10 @@
         [p1]
         guard_nonnull(p1) []
         guard_class(p1, ConstClass(node_vtable2)) []
-        p2 = getfield_gc(p1, descr=nextdescr)
+        p2 = getfield_gc_r(p1, descr=nextdescr)
         guard_nonnull(12) []
         guard_class(p2, ConstClass(node_vtable)) []
-        p3 = getfield_gc(p1, descr=otherdescr)
+        p3 = getfield_gc_r(p1, descr=otherdescr)
         guard_nonnull(12) []
         guard_class(p3, ConstClass(node_vtable)) []
         p1a = new_with_vtable(ConstClass(node_vtable2))
@@ -1999,7 +1999,7 @@
     def test_invalid_loop_3(self):
         ops = """
         [p1]
-        p2 = getfield_gc(p1, descr=nextdescr)
+        p2 = getfield_gc_r(p1, descr=nextdescr)
         guard_isnull(p2) []
         #
         p3 = new_with_vtable(ConstClass(node_vtable))
@@ -2100,8 +2100,8 @@
     def test_oois_of_itself(self):
         ops = """
         [p0]
-        p1 = getfield_gc(p0, descr=nextdescr)
-        p2 = getfield_gc(p0, descr=nextdescr)
+        p1 = getfield_gc_r(p0, descr=nextdescr)
+        p2 = getfield_gc_r(p0, descr=nextdescr)
         i1 = ptr_eq(p1, p2)
         guard_true(i1) []
         i2 = ptr_ne(p1, p2)
@@ -2110,7 +2110,7 @@
         """
         expected = """
         [p0]
-        p1 = getfield_gc(p0, descr=nextdescr)
+        p1 = getfield_gc_r(p0, descr=nextdescr)
         jump(p0)
         """
         self.optimize_loop(ops, expected)
@@ -2501,7 +2501,7 @@
         # first rename i3 into i4
         p1 = new_with_vtable(ConstClass(node_vtable))
         setfield_gc(p1, i3, descr=valuedescr)
-        i4 = getfield_gc(p1, descr=valuedescr)
+        i4 = getfield_gc_i(p1, descr=valuedescr)
         #
         i2 = int_add(10, 5)
         guard_true(i1, descr=fdescr) [i2, i4]
@@ -2565,7 +2565,7 @@
             [i1, i2, i3]
             p1 = new_with_vtable(ConstClass(node_vtable))
             setfield_gc(p1, i3, descr=valuedescr)
-            i4 = getfield_gc(p1, descr=valuedescr)   # copy of i3
+            i4 = getfield_gc_i(p1, descr=valuedescr)   # copy of i3
             p2 = new_with_vtable(ConstClass(node_vtable))
             setfield_gc(p1, i2, descr=valuedescr)
             setfield_gc(p1, p2, descr=nextdescr)
@@ -2654,8 +2654,8 @@
         setfield_gc(p2, i1, descr=adescr)
         setfield_gc(p2, p1, descr=bdescr)
         guard_true(i1, descr=fdescr) [p2]
-        i3 = getfield_gc(p2, descr=adescr)
-        p3 = getfield_gc(p2, descr=bdescr)
+        i3 = getfield_gc_i(p2, descr=adescr)
+        p3 = getfield_gc_r(p2, descr=bdescr)
         jump(i3, p3)
         """
         expected = """
@@ -2672,7 +2672,7 @@
         ops = """
         [i1, p1a, i2]
         p6s = getarrayitem_gc(p1a, 0, descr=arraydescr2)
-        p7v = getfield_gc(p6s, descr=bdescr)
+        p7v = getfield_gc_r(p6s, descr=bdescr)
         p5s = new(descr=ssize)
         setfield_gc(p5s, i2, descr=adescr)
         setfield_gc(p5s, p7v, descr=bdescr)
@@ -2761,16 +2761,16 @@
     def test_residual_call_does_not_invalidate_caches(self):
         ops = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = call(i1, descr=nonwritedescr)
-        i3 = getfield_gc(p1, descr=valuedescr)
+        i3 = getfield_gc_i(p1, descr=valuedescr)
         escape(i1)
         escape(i3)
         jump(p1, p2)
         """
         expected = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=valuedescr)
+        i1 = getfield_gc_i(p1, descr=valuedescr)
         i2 = call(i1, descr=nonwritedescr)
         escape(i1)
         escape(i1)
@@ -2781,11 +2781,11 @@
     def test_residual_call_invalidate_some_caches(self):
         ops = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=adescr)
-        i2 = getfield_gc(p1, descr=bdescr)
+        i1 = getfield_gc_i(p1, descr=adescr)
+        i2 = getfield_gc_i(p1, descr=bdescr)
         i3 = call(i1, descr=writeadescr)
-        i4 = getfield_gc(p1, descr=adescr)
-        i5 = getfield_gc(p1, descr=bdescr)
+        i4 = getfield_gc_i(p1, descr=adescr)
+        i5 = getfield_gc_i(p1, descr=bdescr)
         escape(i1)
         escape(i2)
         escape(i4)
@@ -2794,10 +2794,10 @@
         """
         expected = """
         [p1, p2]
-        i1 = getfield_gc(p1, descr=adescr)
-        i2 = getfield_gc(p1, descr=bdescr)
+        i1 = getfield_gc_i(p1, descr=adescr)
+        i2 = getfield_gc_i(p1, descr=bdescr)
         i3 = call(i1, descr=writeadescr)
-        i4 = getfield_gc(p1, descr=adescr)
+        i4 = getfield_gc_i(p1, descr=adescr)
         escape(i1)
         escape(i2)
         escape(i4)
@@ -3708,7 +3708,7 @@
     def test_framestackdepth_overhead(self):
         ops = """
         [p0, i22]
-        i1 = getfield_gc(p0, descr=valuedescr)
+        i1 = getfield_gc_i(p0, descr=valuedescr)
         i2 = int_gt(i1, i22)
         guard_false(i2) []
         i3 = int_add(i1, 1)
@@ -3725,7 +3725,7 @@
         """
         expected = """
         [p0, i22]
-        i1 = getfield_gc(p0, descr=valuedescr)
+        i1 = getfield_gc_i(p0, descr=valuedescr)
         i2 = int_gt(i1, i22)
         guard_false(i2) []
         i3 = int_add(i1, 1)
@@ -5006,7 +5006,7 @@
         escape(p1)
         setfield_gc(p0, i0, descr=adescr)
         setfield_gc(p1, i1, descr=adescr)
-        i2 = getfield_gc(p0, descr=adescr)
+        i2 = getfield_gc_i(p0, descr=adescr)
         jump(i2, i2)
         """
         expected = """
@@ -5248,35 +5248,35 @@
     def test_getfield_cmp_above_bounds(self):
         ops = """
         [p0]
-        i0 = getfield_gc(p0, descr=chardescr)
+        i0 = getfield_gc_i(p0, descr=chardescr)
         i1 = int_lt(i0, 256)
         guard_true(i1) []
         """
 
         expected = """
         [p0]
-        i0 = getfield_gc(p0, descr=chardescr)
+        i0 = getfield_gc_i(p0, descr=chardescr)
         """
         self.optimize_loop(ops, expected)
 
     def test_getfield_cmp_below_bounds(self):
         ops = """
         [p0]
-        i0 = getfield_gc(p0, descr=chardescr)
+        i0 = getfield_gc_i(p0, descr=chardescr)
         i1 = int_gt(i0, -1)
         guard_true(i1) []
         """
 
         expected = """
         [p0]
-        i0 = getfield_gc(p0, descr=chardescr)
+        i0 = getfield_gc_i(p0, descr=chardescr)
         """
         self.optimize_loop(ops, expected)
 
     def test_getfield_cmp_in_bounds(self):
         ops = """
         [p0]
-        i0 = getfield_gc(p0, descr=chardescr)
+        i0 = getfield_gc_i(p0, descr=chardescr)
         i1 = int_gt(i0, 0)
         guard_true(i1) []
         i2 = int_lt(i0, 255)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -28,7 +28,7 @@
 
     def get_key_box(self):
         if self.box is None:
-            return self.keybox
+            return self.source_op
         return self.box
 
     def force_box(self, optforce):
@@ -157,8 +157,7 @@
                 iteritems.sort(key=lambda (x, y): x.sort_key())
             for ofs, value in iteritems:
                 subbox = value.force_box(optforce)
-                op = ResOperation(rop.SETFIELD_GC, [box, subbox], None,
-                                  descr=ofs)
+                op = ResOperation(rop.SETFIELD_GC, [box, subbox], descr=ofs)
                 optforce.emit_operation(op)
 
     def _get_field_descr_list(self):
@@ -220,8 +219,8 @@
 
 class VStructValue(AbstractVirtualStructValue):
 
-    def __init__(self, cpu, structdescr, keybox, source_op=None):
-        AbstractVirtualStructValue.__init__(self, cpu, keybox, source_op)
+    def __init__(self, cpu, structdescr, source_op):
+        AbstractVirtualStructValue.__init__(self, cpu, source_op)
         self.structdescr = structdescr
 
     @specialize.argtype(1)
@@ -265,9 +264,9 @@
 
 class VArrayValue(AbstractVArrayValue):
 
-    def __init__(self, arraydescr, constvalue, size, keybox, source_op=None,
+    def __init__(self, arraydescr, constvalue, size, source_op,
                  clear=False):
-        AbstractVirtualValue.__init__(self, keybox, source_op)
+        AbstractVirtualValue.__init__(self, source_op)
         self.arraydescr = arraydescr
         self.constvalue = constvalue
         if clear:
@@ -332,7 +331,7 @@
         # * if source_op is NEW_ARRAY, emit NEW_ARRAY_CLEAR if it's
         #   followed by setting most items to zero anyway
         optforce.emit_operation(self.source_op)
-        self.box = box = self.source_op.result
+        self.box = box = self.source_op
         for index in range(len(self._items)):
             subvalue = self._items[index]
             if subvalue is None:
@@ -342,7 +341,7 @@
                     continue
             subbox = subvalue.force_box(optforce)
             op = ResOperation(rop.SETARRAYITEM_GC,
-                              [box, ConstInt(index), subbox], None,
+                              [box, ConstInt(index), subbox],
                                descr=self.arraydescr)
             optforce.emit_operation(op)
 
@@ -352,8 +351,8 @@
 
 
 class VArrayStructValue(AbstractVirtualValue):
-    def __init__(self, arraydescr, size, keybox, source_op=None):
-        AbstractVirtualValue.__init__(self, keybox, source_op)
+    def __init__(self, arraydescr, size, source_op):
+        AbstractVirtualValue.__init__(self, source_op)
         self.arraydescr = arraydescr
         self._items = [{} for _ in xrange(size)]
 
@@ -372,7 +371,7 @@
         if not we_are_translated():
             self.source_op.name = 'FORCE ' + self.source_op.name
         optforce.emit_operation(self.source_op)
-        self.box = box = self.source_op.result
+        self.box = box = self.source_op
         for index in range(len(self._items)):
             iteritems = self._items[index].iteritems()
             # random order is fine, except for tests
@@ -382,7 +381,7 @@
             for descr, value in iteritems:
                 subbox = value.force_box(optforce)
                 op = ResOperation(rop.SETINTERIORFIELD_GC,
-                    [box, ConstInt(index), subbox], None, descr=descr
+                    [box, ConstInt(index), subbox], descr=descr
                 )
                 optforce.emit_operation(op)
 
@@ -460,7 +459,7 @@
         if not we_are_translated():
             op.name = 'FORCE ' + self.source_op.name
         optforce.emit_operation(self.source_op)
-        self.box = self.source_op.result
+        self.box = self.source_op
         for i in range(len(self.buffer.offsets)):
             # write the value
             offset = self.buffer.offsets[i]
@@ -495,7 +494,7 @@
         assert op is not None
         if not we_are_translated():
             op.name = 'FORCE ' + self.source_op.name
-        self.box = self.source_op.result
+        self.box = self.source_op
         self.rawbuffer_value.force_box(optforce)
         optforce.emit_operation(op)
 
@@ -525,21 +524,20 @@
         self.make_equal_to(source_op, vvalue)
         return vvalue
 
-    def make_varray(self, arraydescr, size, box, source_op=None,
-                    clear=False):
+    def make_varray(self, arraydescr, size, source_op, clear=False):
         if arraydescr.is_array_of_structs():
             assert clear
-            vvalue = VArrayStructValue(arraydescr, size, box, source_op)
+            vvalue = VArrayStructValue(arraydescr, size, source_op)
         else:
             constvalue = self.new_const_item(arraydescr)
-            vvalue = VArrayValue(arraydescr, constvalue, size, box, source_op,
+            vvalue = VArrayValue(arraydescr, constvalue, size, source_op,
                                  clear=clear)
-        self.make_equal_to(box, vvalue)
+        self.make_equal_to(source_op, vvalue)
         return vvalue
 
-    def make_vstruct(self, structdescr, box, source_op=None):
-        vvalue = VStructValue(self.optimizer.cpu, structdescr, box, source_op)
-        self.make_equal_to(box, vvalue)
+    def make_vstruct(self, structdescr, source_op):
+        vvalue = VStructValue(self.optimizer.cpu, structdescr, source_op)
+        self.make_equal_to(source_op, vvalue)
         return vvalue
 
     def make_virtual_raw_memory(self, size, box, source_op):
@@ -607,8 +605,8 @@
         # Replace the VIRTUAL_REF operation with a virtual structure of type
         # 'jit_virtual_ref'.  The jit_virtual_ref structure may be forced soon,
         # but the point is that doing so does not force the original structure.
-        op = ResOperation(rop.NEW_WITH_VTABLE, [c_cls], op.result)
-        vrefvalue = self.make_virtual(c_cls, op.result, op)
+        op = ResOperation(rop.NEW_WITH_VTABLE, [c_cls], op)
+        vrefvalue = self.make_virtual(c_cls, op)
         tokenbox = BoxPtr()
         self.emit_operation(ResOperation(rop.FORCE_TOKEN, [], tokenbox))
         vrefvalue.setfield(descr_virtual_token, self.getvalue(tokenbox))
@@ -657,7 +655,7 @@
                     not tokenvalue.box.nonnull()):
                 forcedvalue = vref.getfield(vrefinfo.descr_forced, None)
                 if forcedvalue is not None and not forcedvalue.is_null():
-                    self.make_equal_to(op.result, forcedvalue)
+                    self.make_equal_to(op, forcedvalue)
                     self.last_emitted_operation = REMOVED
                     return True
         return False
@@ -670,14 +668,14 @@
         if value.is_forced_virtual() and op.is_always_pure():
             fieldvalue = value.getfield(op.getdescr(), None)
             if fieldvalue is not None:
-                self.make_equal_to(op.result, fieldvalue)
+                self.make_equal_to(op, fieldvalue)
                 return
         if value.is_virtual():
             assert isinstance(value, AbstractVirtualValue)
             fieldvalue = value.getfield(op.getdescr(), None)
             if fieldvalue is None:
                 fieldvalue = self.optimizer.new_const(op.getdescr())
-            self.make_equal_to(op.result, fieldvalue)
+            self.make_equal_to(op, fieldvalue)
         else:
             value.ensure_nonnull()
             self.emit_operation(op)
@@ -708,14 +706,14 @@
     def optimize_NEW_ARRAY(self, op):
         sizebox = self.get_constant_box(op.getarg(0))
         if sizebox is not None:
-            self.make_varray(op.getdescr(), sizebox.getint(), op.result, op)
+            self.make_varray(op.getdescr(), sizebox.getint(), op)
         else:
             self.emit_operation(op)
 
     def optimize_NEW_ARRAY_CLEAR(self, op):
         sizebox = self.get_constant_box(op.getarg(0))
         if sizebox is not None:
-            self.make_varray(op.getdescr(), sizebox.getint(), op.result, op,
+            self.make_varray(op.getdescr(), sizebox.getint(), op,
                              clear=True)
         else:
             self.emit_operation(op)        
@@ -740,7 +738,7 @@
         if sizebox is None:
             self.emit_operation(op)
             return
-        self.make_virtual_raw_memory(sizebox.getint(), op.result, op)
+        self.make_virtual_raw_memory(sizebox.getint(), op)
         self.last_emitted_operation = REMOVED
 
     def do_RAW_FREE(self, op):
@@ -758,19 +756,19 @@
             # translation occurs without any VRawXxxValue instance around
             if value.is_about_raw:
                 if isinstance(value, VRawBufferValue):
-                    self.make_virtual_raw_slice(value, offset, op.result, op)
+                    self.make_virtual_raw_slice(value, offset, op)
                     return
                 elif isinstance(value, VRawSliceValue):
                     offset = offset + value.offset
                     self.make_virtual_raw_slice(value.rawbuffer_value, offset,
-                                                op.result, op)
+                                                op)
                     return
         self.emit_operation(op)
 
     def optimize_ARRAYLEN_GC(self, op):
         value = self.getvalue(op.getarg(0))
         if value.is_virtual():
-            self.make_constant_int(op.result, value.getlength())
+            self.make_constant_int(op, value.getlength())
         else:
             value.ensure_nonnull()
             self.emit_operation(op)
@@ -784,7 +782,7 @@
                 itemvalue = value.getitem(indexbox.getint())
                 if itemvalue is None:   # reading uninitialized array items?
                     itemvalue = value.constvalue     # bah, just return 0
-                self.make_equal_to(op.result, itemvalue)
+                self.make_equal_to(op, itemvalue)
                 return
         value.ensure_nonnull()
         self.emit_operation(op)
@@ -826,7 +824,7 @@
                 except InvalidRawOperation:
                     pass
                 else:
-                    self.make_equal_to(op.result, itemvalue)
+                    self.make_equal_to(op, itemvalue)
                     return
         value.ensure_nonnull()
         self.emit_operation(op)
@@ -865,7 +863,7 @@
                 except InvalidRawOperation:
                     pass
                 else:
-                    self.make_equal_to(op.result, itemvalue)
+                    self.make_equal_to(op, itemvalue)
                     return
         value.ensure_nonnull()
         self.emit_operation(op)
@@ -897,7 +895,7 @@
                 )
                 if fieldvalue is None:
                     fieldvalue = self.new_const(descr)
-                self.make_equal_to(op.result, fieldvalue)
+                self.make_equal_to(op, fieldvalue)
                 return
         value.ensure_nonnull()
         self.emit_operation(op)
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
@@ -16,6 +16,8 @@
 
     OPNUM = -123
 
+    type = 'i'
+
     def getopnum(self):
         return self.OPNUM
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to