[pypy-commit] pypy result-in-resops: fix some virtual arrays

fijal noreply at buildbot.pypy.org
Tue Sep 25 13:36:35 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57568:a903bb2360b8
Date: 2012-09-25 13:12 +0200
http://bitbucket.org/pypy/pypy/changeset/a903bb2360b8/

Log:	fix some virtual arrays

diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -5,7 +5,7 @@
      MODE_ARRAY, LEVEL_KNOWNCLASS
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from pypy.jit.metainterp.resoperation import rop, opgroups, Const, INT,\
-     FLOAT, create_resop_1
+     FLOAT, create_resop_1, create_resop_2
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rpython.lltypesystem import lltype, llmemory
 
@@ -463,9 +463,21 @@
     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)],
-                                op.getdescr()):
+        if op.type == INT:
+            op_key = create_resop_2(rop.GETARRAYITEM_GC_PURE_i, 0, op.getarg(0),
+                                    op.getarg(1),
+                                    op.getdescr())
+        elif op.type == FLOAT:
+            op_key = create_resop_2(rop.GETARRAYITEM_GC_PURE_f, 0.0,
+                                    op.getarg(0), op.getarg(1),
+                                    op.getdescr())
+        else:
+            op_key = create_resop_2(rop.GETARRAYITEM_GC_PURE_p,
+                                    lltype.nullptr(llmemory.GCREF.TO),
+                                    op.getarg(0),
+                                    op.getarg(1),
+                                    op.getdescr())
+        if self.has_pure_result(op_key):
             os.write(2, '[bogus immutable array declaration: %s]\n' %
                      (op.getdescr().repr_of_descr()))
             raise BogusPureField
@@ -473,13 +485,15 @@
         indexvalue = self.getvalue(op.getarg(1))
         if indexvalue.is_constant():
             arrayvalue = self.getvalue(op.getarg(0))
-            arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), indexvalue.box.getint())
+            arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(),
+                                   indexvalue.op.getint())
             # use the cache on (arraydescr, index), which is a constant
-            cf = self.arrayitem_cache(op.getdescr(), indexvalue.box.getint())
+            cf = self.arrayitem_cache(op.getdescr(), indexvalue.op.getint())
             cf.do_setfield(self, op)
         else:
             # variable index, so make sure the lazy setarrayitems are done
-            self.force_lazy_setarrayitem(op.getdescr(), indexvalue=indexvalue, can_cache=False)
+            self.force_lazy_setarrayitem(op.getdescr(), indexvalue=indexvalue,
+                                         can_cache=False)
             # and then emit the operation
             self.emit_operation(op)
 
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -1145,7 +1145,7 @@
         expected = """
         [p0, i]
         guard_value(p0, ConstPtr(myptr)) []
-        jump(p0, 5)
+        jump(ConstPtr(myptr), 5)
         """
         self.node.value = 5
         self.optimize_loop(ops, expected)
@@ -1167,7 +1167,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 = """
@@ -1181,7 +1181,7 @@
         [i1]
         p1 = new_array(2, 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 = """
@@ -1198,7 +1198,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 = """
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -261,7 +261,7 @@
 
     def _really_force(self, optforce):
         if not we_are_translated():
-            self.op.name = 'FORCE ' + self.source_op.name
+            self.op.name = 'FORCE ' + self.op.name
         self.forced = True
         optforce.emit_operation(self.op)
         for index in range(len(self._items)):
@@ -491,7 +491,7 @@
     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.optimize_default(op)
@@ -503,7 +503,7 @@
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
                 itemvalue = value.getitem(indexbox.getint())
-                self.make_equal_to(op.result, itemvalue)
+                self.replace(op, itemvalue.op)
                 return
         value.ensure_nonnull()
         self.emit_operation(op)


More information about the pypy-commit mailing list