Author: Spenser Bauman <[email protected]>
Branch: remove-getarrayitem-pure
Changeset: r83511:e2e277a65e93
Date: 2016-04-02 16:06 -0400
http://bitbucket.org/pypy/pypy/changeset/e2e277a65e93/
Log: Make some of the tests work
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
@@ -554,13 +554,22 @@
def optimize_GETARRAYITEM_GC_I(self, op):
arrayinfo = self.ensure_ptr_info_arg0(op)
indexb = self.getintbound(op.getarg(1))
+ arraydescr = op.getdescr()
+
+ if (arraydescr.is_always_pure() and
+ self.get_constant_box(op.getarg(0)) is not None and
+ self.get_constant_box(op.getarg(1)) is not None):
+ resbox = self.optimizer.constant_fold(op)
+ self.optimizer.make_constant(op, resbox)
+ return
+
cf = None
if indexb.is_constant():
index = indexb.getint()
arrayinfo.getlenbound(None).make_gt_const(index)
# use the cache on (arraydescr, index), which is a constant
- cf = self.arrayitem_cache(op.getdescr(), index)
- field = cf.getfield_from_cache(self, arrayinfo, op.getdescr())
+ cf = self.arrayitem_cache(arraydescr, index)
+ field = cf.getfield_from_cache(self, arrayinfo, arraydescr)
if field is not None:
self.make_equal_to(op, field)
return
@@ -573,36 +582,13 @@
self.emit_operation(op)
# then remember the result of reading the array item
if cf is not None:
- arrayinfo.setitem(op.getdescr(), indexb.getint(),
+ arrayinfo.setitem(arraydescr, indexb.getint(),
self.get_box_replacement(op.getarg(0)),
self.get_box_replacement(op), optheap=self,
cf=cf)
optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I
optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I
- def optimize_GETARRAYITEM_GC_PURE_I(self, op):
- arrayinfo = self.ensure_ptr_info_arg0(op)
- indexb = self.getintbound(op.getarg(1))
- cf = None
- if indexb.is_constant():
- index = indexb.getint()
- arrayinfo.getlenbound(None).make_gt_const(index)
- # use the cache on (arraydescr, index), which is a constant
- cf = self.arrayitem_cache(op.getdescr(), index)
- fieldvalue = cf.getfield_from_cache(self, arrayinfo, op.getdescr())
- if fieldvalue is not None:
- self.make_equal_to(op, fieldvalue)
- return
- else:
- # variable index, so make sure the lazy setarrayitems are done
- self.force_lazy_setarrayitem(op.getdescr(),
self.getintbound(op.getarg(1)))
- # default case: produce the operation
- self.make_nonnull(op.getarg(0))
- self.emit_operation(op)
-
- optimize_GETARRAYITEM_GC_PURE_R = optimize_GETARRAYITEM_GC_PURE_I
- optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_PURE_I
-
def optimize_SETARRAYITEM_GC(self, op):
#opnum = OpHelpers.getarrayitem_pure_for_descr(op.getdescr())
#if self.has_pure_result(opnum, [op.getarg(0), op.getarg(1)],
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
@@ -757,24 +757,20 @@
check at all, but then we don't unroll in that case.
"""
opnum = op.getopnum()
+ descr = op.getdescr()
cpu = self.cpu
- if OpHelpers.is_pure_getfield(opnum, op.getdescr()):
- fielddescr = op.getdescr()
+ if OpHelpers.is_pure_getfield(opnum, descr):
ref = self.get_constant_box(op.getarg(0)).getref_base()
- cpu.protect_speculative_field(ref, fielddescr)
+ cpu.protect_speculative_field(ref, descr)
return
- elif (opnum == rop.GETARRAYITEM_GC_PURE_I or
- opnum == rop.GETARRAYITEM_GC_PURE_R or
- opnum == rop.GETARRAYITEM_GC_PURE_F or
- opnum == rop.ARRAYLEN_GC):
- arraydescr = op.getdescr()
+ elif OpHelpers.is_pure_getarrayitem(opnum, descr):
array = self.get_constant_box(op.getarg(0)).getref_base()
- cpu.protect_speculative_array(array, arraydescr)
+ cpu.protect_speculative_array(array, descr)
if opnum == rop.ARRAYLEN_GC:
return
- arraylength = cpu.bh_arraylen_gc(array, arraydescr)
+ arraylength = cpu.bh_arraylen_gc(array, descr)
elif (opnum == rop.STRGETITEM or
opnum == rop.STRLEN):
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
@@ -5403,15 +5403,15 @@
def test_getarrayitem_gc_pure_not_invalidated(self):
ops = """
[p0]
- i1 = getarrayitem_gc_pure_i(p0, 1, descr=arrayimmutdescr)
+ i1 = getarrayitem_gc_i(p0, 1, descr=arrayimmutdescr)
escape_n(p0)
- i2 = getarrayitem_gc_pure_i(p0, 1, descr=arrayimmutdescr)
+ i2 = getarrayitem_gc_i(p0, 1, descr=arrayimmutdescr)
escape_n(i2)
jump(p0)
"""
expected = """
[p0]
- i1 = getarrayitem_gc_pure_i(p0, 1, descr=arrayimmutdescr)
+ i1 = getarrayitem_gc_i(p0, 1, descr=arrayimmutdescr)
escape_n(p0)
escape_n(i1)
jump(p0)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -7869,7 +7869,7 @@
def test_loopinvariant_getarrayitem_gc_pure(self):
ops = """
[p9, i1]
- i843 = getarrayitem_gc_pure_i(p9, i1, descr=arrayimmutdescr)
+ i843 = getarrayitem_gc_i(p9, i1, descr=arrayimmutdescr)
call_n(i843, descr=nonwritedescr)
jump(p9, i1)
"""
@@ -8873,7 +8873,7 @@
ptemp = new_with_vtable(descr=nodesize)
setfield_gc(ptemp, p1, descr=nextdescr)
p2 = getfield_gc_r(ptemp, descr=nextdescr)
- ix = getarrayitem_gc_pure_i(p2, 0, descr=arrayimmutdescr)
+ ix = getarrayitem_gc_i(p2, 0, descr=arrayimmutdescr)
pfoo = getfield_gc_r(ptemp, descr=nextdescr)
guard_value(pfoo, ConstPtr(immutarray)) []
ifoo = int_add(ix, 13)
@@ -8905,7 +8905,7 @@
def test_constant_float_pure(self):
ops = """
[p0]
- f0 = getarrayitem_gc_pure_f(p0, 3, descr=floatarrayimmutdescr)
+ f0 = getarrayitem_gc_f(p0, 3, descr=floatarrayimmutdescr)
guard_value(f0, 1.03) []
jump(p0)
"""
@@ -9141,7 +9141,7 @@
[p0, i1]
i2 = int_gt(i1, 0)
guard_true(i2) []
- getarrayitem_gc_pure_i(p0, 5, descr=arraydescr)
+ getarrayitem_gc_i(p0, 5, descr=arrayimmutdescr)
i3 = int_sub(i1, 1)
jump(NULL, i3)
"""
@@ -9152,7 +9152,7 @@
[p0, i1]
i2 = int_gt(i1, 0)
guard_true(i2) []
- getarrayitem_gc_pure_i(p0, 5, descr=arraydescr)
+ getarrayitem_gc_i(p0, 5, descr=arrayimmutdescr)
i3 = int_sub(i1, 1)
jump(ConstPtr(myptr3), i3)
"""
@@ -9163,7 +9163,7 @@
[p0, i1]
i2 = int_gt(i1, 0)
guard_true(i2) []
- getarrayitem_gc_pure_i(p0, 125, descr=arraydescr)
+ getarrayitem_gc_i(p0, 125, descr=arrayimmutdescr)
i3 = int_sub(i1, 1)
jump(ConstPtr(arrayref), i3) # too short, length < 126!
"""
@@ -9174,7 +9174,7 @@
[i0, i1]
i2 = int_gt(i1, 0)
guard_true(i2) []
- getarrayitem_gc_pure_i(ConstPtr(arrayref), i0, descr=arraydescr)
+ getarrayitem_gc_i(ConstPtr(arrayref), i0, descr=arrayimmutdescr)
i3 = int_sub(i1, 1)
jump(125, i3) # arrayref is too short, length < 126!
"""
@@ -9185,7 +9185,7 @@
[i0, i1]
i2 = int_gt(i1, 0)
guard_true(i2) []
- getarrayitem_gc_pure_i(ConstPtr(arrayref), i0, descr=arraydescr)
+ getarrayitem_gc_i(ConstPtr(arrayref), i0, descr=arrayimmutdescr)
i3 = int_sub(i1, 1)
jump(-1, i3) # cannot access array item -1!
"""
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
@@ -286,12 +286,6 @@
optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I
optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I
- # note: the following line does not mean that the two operations are
- # completely equivalent, because GETARRAYITEM_GC_PURE is_always_pure().
- optimize_GETARRAYITEM_GC_PURE_I = optimize_GETARRAYITEM_GC_I
- optimize_GETARRAYITEM_GC_PURE_R = optimize_GETARRAYITEM_GC_I
- optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_I
-
def optimize_SETARRAYITEM_GC(self, op):
opinfo = self.getptrinfo(op.getarg(0))
if opinfo and opinfo.is_virtual():
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
@@ -1281,14 +1281,6 @@
return rop.GETFIELD_GC_I
@staticmethod
- def getarrayitem_pure_for_descr(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
-
- @staticmethod
def getarrayitem_for_descr(descr):
if descr.is_array_of_pointers():
return rop.GETARRAYITEM_GC_R
@@ -1368,8 +1360,25 @@
@staticmethod
def is_pure_getfield(opnum, descr):
if (opnum == rop.GETFIELD_GC_I or
- opnum == rop.GETFIELD_GC_F or
- opnum == rop.GETFIELD_GC_R):
+ opnum == rop.GETFIELD_GC_R or
+ opnum == rop.GETFIELD_GC_F):
+ return descr is not None and descr.is_always_pure()
+ return False
+
+ @staticmethod
+ def is_pure_getarrayitem(opnum, descr):
+ if (opnum == rop.GETARRAYITEM_GC_I or
+ opnum == rop.GETARRAYITEM_GC_R or
+ opnum == rop.GETARRAYITEM_GC_F):
+ return descr is not None and descr.is_always_pure()
+ return False
+
+ @staticmethod
+ def is_pure_arrayref(opnum, descr):
+ if (opnum == rop.GETARRAYITEM_GC_I or
+ opnum == rop.GETARRAYITEM_GC_R or
+ opnum == rop.GETARRAYITEM_GC_F or
+ opnum == rop.ARRAYLEN_GC):
return descr is not None and descr.is_always_pure()
return False
@@ -1401,10 +1410,7 @@
@staticmethod
def is_getarrayitem(opnum):
- return opnum in (rop.GETARRAYITEM_GC_I, rop.GETARRAYITEM_GC_F,
- rop.GETARRAYITEM_GC_R, rop.GETARRAYITEM_GC_PURE_I,
- rop.GETARRAYITEM_GC_PURE_F,
- rop.GETARRAYITEM_GC_PURE_R)
+ return opnum in (rop.GETARRAYITEM_GC_I, rop.GETARRAYITEM_GC_F,
rop.GETARRAYITEM_GC_R)
@staticmethod
def is_real_call(opnum):
@@ -1721,10 +1727,6 @@
rop.GETARRAYITEM_RAW_F: rop.VEC_GETARRAYITEM_RAW_F,
rop.GETARRAYITEM_GC_I: rop.VEC_GETARRAYITEM_GC_I,
rop.GETARRAYITEM_GC_F: rop.VEC_GETARRAYITEM_GC_F,
- # note that there is no _PURE operation for vector operations.
- # reason: currently we do not care if it is pure or not!
- rop.GETARRAYITEM_GC_PURE_I: rop.VEC_GETARRAYITEM_GC_I,
- rop.GETARRAYITEM_GC_PURE_F: rop.VEC_GETARRAYITEM_GC_F,
rop.RAW_STORE: rop.VEC_RAW_STORE,
rop.SETARRAYITEM_RAW: rop.VEC_SETARRAYITEM_RAW,
rop.SETARRAYITEM_GC: rop.VEC_SETARRAYITEM_GC,
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit