[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