Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78908:8505df96400f
Date: 2015-08-11 13:11 +0200
http://bitbucket.org/pypy/pypy/changeset/8505df96400f/
Log: fix one more test
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
@@ -562,10 +562,9 @@
indexb = self.getintbound(op.getarg(1))
cf = None
if indexb.is_constant():
- # XXXX lgt bound
- #arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(),
indexvalue.box.getint())
+ index = indexb.getint()
+ arrayinfo.getlenbound().make_gt_const(index)
# use the cache on (arraydescr, index), which is a constant
- index = indexb.getint()
cf = self.arrayitem_cache(op.getdescr(), index)
field = cf.getfield_from_cache(self, arrayinfo, op.getdescr())
if field is not None:
@@ -592,11 +591,11 @@
indexb = self.getintbound(op.getarg(1))
cf = None
if indexb.is_constant():
- #arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(),
indexvalue.box.getint())
+ index = indexb.getint()
+ arrayinfo.getlenbound().make_gt_const(index)
# use the cache on (arraydescr, index), which is a constant
- #cf = self.arrayitem_cache(op.getdescr(), indexvalue.box.getint())
- #fieldvalue = cf.getfield_from_cache(self, arrayvalue)
- fieldvalue = None
+ 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
@@ -620,10 +619,9 @@
#
indexb = self.getintbound(op.getarg(1))
if indexb.is_constant():
- #arrayinfo = self.ensure_ptr_info_arg0(op)
+ arrayinfo = self.ensure_ptr_info_arg0(op)
# arraybound
- #arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(),
indexvalue.box.getint())
- # use the cache on (arraydescr, index), which is a constant
+ arrayinfo.getlenbound().make_gt_const(indexb.getint())
cf = self.arrayitem_cache(op.getdescr(), indexb.getint())
cf.do_setfield(self, op)
else:
diff --git a/rpython/jit/metainterp/optimizeopt/info.py
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -301,16 +301,20 @@
length = -1
def __init__(self, const=None, size=0, clear=False, vdescr=None):
+ from rpython.jit.metainterp.optimizeopt import intutils
self.vdescr = vdescr
if vdescr is not None:
self._init_items(const, size, clear)
+ self.lenbound = intutils.ConstIntBound(size)
self._clear = clear
- #def getlenbound(self):
- # if self.lenbound is None:
- # raise Exception("implement me - lenbound")
- # xxx
- # return self.lenbound
+ def getlenbound(self):
+ from rpython.jit.metainterp.optimizeopt import intutils
+
+ if self.lenbound is None:
+ assert self.length == -1
+ self.lenbound = intutils.IntLowerBound(0)
+ return self.lenbound
def _init_items(self, const, size, clear):
self.length = size
@@ -378,6 +382,13 @@
descr=descr)
shortboxes.add_heap_op(op, getarrayitem_op)
+ def make_guards(self, op, short):
+ AbstractVirtualPtrInfo.make_guards(self, op, short)
+ if self.lenbound is not None:
+ lenop = ResOperation(rop.ARRAYLEN_GC, [op])
+ short.append(lenop)
+ self.lenbound.make_guards(lenop, short)
+
class ArrayStructInfo(ArrayPtrInfo):
def __init__(self, size, vdescr=None):
self.length = size
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
@@ -409,12 +409,9 @@
bres.intersect(bounds)
def optimize_ARRAYLEN_GC(self, op):
- array = self.getptrinfo(op.getarg(0))
- result = self.getintbound(op)
- result.make_ge(IntLowerBound(0))
+ array = self.ensure_ptr_info_arg0(op)
self.emit_operation(op)
- #array.make_len_gt(MODE_ARRAY, op.getdescr(), -1)
- #array.getlenbound().bound.intersect(result.getintbound())
+ self.optimizer.setintbound(op, array.getlenbound())
def optimize_STRLEN(self, op):
self.emit_operation(op)
diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py
b/rpython/jit/metainterp/optimizeopt/intutils.py
--- a/rpython/jit/metainterp/optimizeopt/intutils.py
+++ b/rpython/jit/metainterp/optimizeopt/intutils.py
@@ -43,6 +43,18 @@
return True
return False
+ def make_ge_const(self, other):
+ return self.make_ge(ConstIntBound(other))
+
+ def make_gt_const(self, other):
+ return self.make_gt(ConstIntBound(other))
+
+ def make_eq_const(self, intval):
+ self.has_upper = True
+ self.has_lower = True
+ self.upper = intval
+ self.lower = intval
+
def make_gt(self, other):
return self.make_ge(other.add(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
@@ -59,6 +59,14 @@
op.set_forwarded(intbound)
return intbound
+ def setintbound(self, op, bound):
+ assert op.type == 'i'
+ op = self.get_box_replacement(op)
+ if op.is_constant():
+ return
+ assert op.get_forwarded() is None
+ op.set_forwarded(bound)
+
def getnullness(self, op):
if op.type == 'i':
return self.getintbound(op).getnullness()
@@ -425,7 +433,8 @@
opinfo = info.StructPtrInfo()
opinfo.init_fields(op.getdescr().get_parent_descr(),
op.getdescr().get_index())
- elif op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC:
+ elif (op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC or
+ op.getopnum() == rop.ARRAYLEN_GC):
opinfo = info.ArrayPtrInfo(op.getdescr())
elif op.getopnum() in (rop.GUARD_CLASS, rop.GUARD_NONNULL_CLASS):
opinfo = info.InstancePtrInfo()
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
@@ -4659,19 +4659,41 @@
def test_bound_arraylen(self):
ops = """
[i0, p0]
- p1 = new_array(i0, descr=arraydescr)
+ p1 = new_array(i0, descr=gcarraydescr)
i1 = arraylen_gc(p1)
i2 = int_gt(i1, -1)
guard_true(i2) []
- setarrayitem_gc(p0, 0, p1)
+ setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
jump(i0, p0)
"""
# The dead arraylen_gc will be eliminated by the backend.
expected = """
[i0, p0]
- p1 = new_array(i0, descr=arraydescr)
+ p1 = new_array(i0, descr=gcarraydescr)
i1 = arraylen_gc(p1)
- setarrayitem_gc(p0, 0, p1)
+ setarrayitem_gc(p0, 0, p1, descr=gcarraydescr)
+ jump(i0, p0)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_bound_arraylen_2(self):
+ ops = """
+ [i0, p0]
+ p1 = new_array(i0, descr=gcarraydescr)
+ setarrayitem_gc(p1, 3, p1, descr=gcarraydescr)
+ i1 = arraylen_gc(p1)
+ i2 = int_gt(i1, 2)
+ guard_true(i2) []
+ setarrayitem_gc(p1, 0, p0, descr=gcarraydescr)
+ jump(i0, p0)
+ """
+ # The dead arraylen_gc will be eliminated by the backend.
+ expected = """
+ [i0, p0]
+ p1 = new_array(i0, descr=gcarraydescr)
+ i1 = arraylen_gc(p1)
+ setarrayitem_gc(p1, 0, p0, descr=gcarraydescr)
+ setarrayitem_gc(p1, 3, p1, descr=gcarraydescr)
jump(i0, p0)
"""
self.optimize_loop(ops, expected)
@@ -7612,7 +7634,7 @@
ops = """
[p0]
p1 = getfield_gc_r(p0, descr=nextdescr)
- p2 = getarrayitem_gc_r(p1, 7, descr=arraydescr)
+ p2 = getarrayitem_gc_r(p1, 7, descr=gcarraydescr)
call_n(p2, descr=nonwritedescr)
jump(p0)
"""
@@ -7623,13 +7645,13 @@
i1 = arraylen_gc(p1)
i2 = int_ge(i1, 8)
guard_true(i2) []
- p2 = getarrayitem_gc_r(p1, 7, descr=arraydescr)
- jump(p0, p1, p2)
+ p2 = getarrayitem_gc_r(p1, 7, descr=gcarraydescr)
+ jump(p1, p2)
"""
expected = """
[p0, p1, p2]
call_n(p2, descr=nonwritedescr)
- # i3 = arraylen_gc(p1) # Should be killed by backend
+ i3 = arraylen_gc(p1) # Should be killed by backend
jump(p0, p1, p2)
"""
self.optimize_loop(ops, expected, expected_short=short)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -168,6 +168,7 @@
immut_ptrval = cpu.fielddescrof(PTROBJ_IMMUT, 'ptrval')
arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
+ gcarraydescr = cpu.arraydescrof(lltype.GcArray(llmemory.GCREF))
floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float))
# a GcStruct not inheriting from OBJECT
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit