Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79246:975bc5a56e3a
Date: 2015-08-27 11:42 +0200
http://bitbucket.org/pypy/pypy/changeset/975bc5a56e3a/
Log: fix test_optimizeopt for the new virtualstate
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
@@ -45,8 +45,18 @@
enable_opts =
"intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
def optimize_loop(self, ops, expected, expected_preamble=None,
- call_pure_results=None, expected_short=None):
+ call_pure_results=None, expected_short=None,
+ jump_values=None):
loop = self.parse(ops, postprocess=self.postprocess)
+ jump_op = loop.operations[-1]
+ if jump_values is not None:
+ for i, v in enumerate(jump_values):
+ if v is not None:
+ jump_op.getarg(i).setref_base(v)
+ else:
+ for i, box in enumerate(jump_op.getarglist()):
+ if box.type == 'r' and not box.is_constant():
+ box.setref_base(self.nodefulladdr)
if expected != "crash!":
expected = self.parse(expected)
if expected_preamble:
@@ -796,7 +806,8 @@
jump(i1, p3)
"""
# We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.nodefulladdr, None])
def test_p123_nested(self):
ops = """
@@ -829,7 +840,8 @@
setfield_gc(p4, p1sub, descr=nextdescr)
jump(i1, p4)
"""
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.nodefulladdr, self.nodefulladdr])
def test_p123_anti_nested(self):
ops = """
@@ -865,7 +877,8 @@
setfield_gc(p1, p3sub, descr=nextdescr)
jump(i1, p1, p3sub, i1)
"""
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.nodefulladdr, self.nodefulladdr, None])
def test_dont_delay_setfields(self):
ops = """
@@ -902,7 +915,8 @@
setfield_gc(p3, i2, descr=valuedescr)
jump(p3, i2)
"""
- self.optimize_loop(ops, expected, preamble, expected_short=short)
+ self.optimize_loop(ops, expected, preamble, expected_short=short,
+ jump_values=[None, self.nodefulladdr])
# ----------
@@ -1004,7 +1018,8 @@
i1 = int_add(i2, i)
jump(i, i1)
"""
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.nodefulladdr])
def test_virtual_float(self):
ops = """
@@ -1477,7 +1492,7 @@
p33 = new_array(0, descr=arraydescr)
setfield_gc(p31, p33, descr=bdescr)
p35 = new_with_vtable(descr=nodesize)
- setfield_gc(p35, p31, descr=valuedescr)
+ setfield_gc(p35, p31, descr=nexttupledescr)
jump(p0, p35)
"""
expected = """
@@ -1493,7 +1508,7 @@
guard_isnull(p18) [p0, p8]
p31 = new(descr=ssize)
p35 = new_with_vtable(descr=nodesize)
- setfield_gc(p35, p31, descr=valuedescr)
+ setfield_gc(p35, p31, descr=nexttupledescr)
jump(p0, p35)
"""
expected = """
@@ -1508,7 +1523,7 @@
guard_isnull(p18) [p0, p8]
p31 = new(descr=ssize)
p35 = new_with_vtable(descr=nodesize)
- setfield_gc(p35, p31, descr=valuedescr)
+ setfield_gc(p35, p31, descr=nexttupledescr)
jump(p0, p35, p19, p18)
"""
expected = """
@@ -1553,7 +1568,8 @@
i2 = int_add(25, i1)
jump(i2)
"""
- self.optimize_loop(ops, expected)
+ jump_values = [self.arrayref]
+ self.optimize_loop(ops, expected, jump_values=jump_values)
def test_varray_alloc_and_set(self):
ops = """
@@ -1651,7 +1667,8 @@
guard_value(i3, 15) []
jump(5)
"""
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.arrayref])
def test_p123_array(self):
ops = """
@@ -1677,7 +1694,8 @@
jump(i1, p1)
"""
# We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.arrayref, None])
def test_varray_forced_1(self):
ops = """
@@ -1720,7 +1738,8 @@
escape_n(i1)
jump(i1)
"""
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.tupleaddr])
def test_p123_vstruct(self):
ops = """
@@ -1746,7 +1765,8 @@
jump(i1, p1)
"""
# We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble,
+ jump_values=[None, self.tupleaddr, None])
def test_virtual_raw_malloc_basic(self):
ops = """
@@ -2764,7 +2784,8 @@
p3 = escape_r()
jump(i0, p3)
"""
- self.optimize_loop(ops, expected)
+ self.optimize_loop(ops, expected,
+ jump_values=[None, self.array2ref])
def test_bug_3(self):
ops = """
@@ -3284,9 +3305,9 @@
def test_ovf_guard_in_short_preamble1(self):
ops = """
[p8, p11, i24]
- p26 = new_with_vtable(descr=nodesize)
+ p26 = new(descr=ssize)
setfield_gc(p26, i24, descr=adescr)
- i34 = getfield_gc_pure_i(p11, descr=valuedescr)
+ i34 = getfield_gc_pure_i(p11, descr=abisdescr)
i35 = getfield_gc_pure_i(p26, descr=adescr)
i36 = int_add_ovf(i34, i35)
guard_no_overflow() []
@@ -3336,7 +3357,8 @@
guard_no_overflow() []
jump(p0, p1, i16, p3, i17, i7, i11)
"""
- self.optimize_loop(ops, expected)
+ self.optimize_loop(ops, expected,
+ jump_values=[None, None, self.tupleaddr])
def test_int_and_or_with_zero(self):
ops = """
@@ -6143,7 +6165,8 @@
[]
jump()
"""
- self.optimize_loop(ops, expected, preamble)
+ self.optimize_loop(ops, expected, preamble, jump_values=
+ [self.immutaddr])
def test_immutable_constantfold_recursive(self):
ops = """
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
@@ -94,11 +94,15 @@
cpu = runner.LLGraphCPU(None)
NODE = lltype.GcForwardReference()
+ S = lltype.GcForwardReference()
NODE.become(lltype.GcStruct('NODE', ('parent', OBJECT),
('value', lltype.Signed),
('floatval', lltype.Float),
('charval', lltype.Char),
+ ('nexttuple', lltype.Ptr(S)),
('next', lltype.Ptr(NODE))))
+ S.become(lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('abis',
lltype.Signed),
+ ('b', lltype.Ptr(NODE))))
NODE2 = lltype.GcStruct('NODE2', ('parent', NODE),
('other', lltype.Ptr(NODE)))
@@ -130,6 +134,7 @@
floatdescr = cpu.fielddescrof(NODE, 'floatval')
chardescr = cpu.fielddescrof(NODE, 'charval')
nextdescr = cpu.fielddescrof(NODE, 'next')
+ nexttupledescr = cpu.fielddescrof(NODE, 'nexttuple')
otherdescr = cpu.fielddescrof(NODE2, 'other')
valuedescr3 = cpu.fielddescrof(NODE3, 'value')
nextdescr3 = cpu.fielddescrof(NODE3, 'next')
@@ -164,6 +169,8 @@
intobj_immut_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
noimmut_intval = cpu.fielddescrof(INTOBJ_NOIMMUT, 'intval')
immut_intval = cpu.fielddescrof(INTOBJ_IMMUT, 'intval')
+ immut = lltype.malloc(INTOBJ_IMMUT, zero=True)
+ immutaddr = lltype.cast_opaque_ptr(llmemory.GCREF, immut)
noimmut_descr = cpu.sizeof(INTOBJ_NOIMMUT, intobj_noimmut_vtable)
immut_descr = cpu.sizeof(INTOBJ_IMMUT, intobj_immut_vtable)
@@ -175,12 +182,18 @@
immut_ptrval = cpu.fielddescrof(PTROBJ_IMMUT, 'ptrval')
arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
+ array = lltype.malloc(lltype.GcArray(lltype.Signed), 15, zero=True)
+ arrayref = lltype.cast_opaque_ptr(llmemory.GCREF, array)
+ array2 = lltype.malloc(lltype.GcArray(lltype.Ptr(S)), 15, zero=True)
+ array2ref = lltype.cast_opaque_ptr(llmemory.GCREF, array2)
gcarraydescr = cpu.arraydescrof(lltype.GcArray(llmemory.GCREF))
floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float))
# a GcStruct not inheriting from OBJECT
- S = lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('abis', lltype.Signed),
- ('b', lltype.Ptr(NODE)))
+ tpl = lltype.malloc(S, zero=True)
+ tupleaddr = lltype.cast_opaque_ptr(llmemory.GCREF, tpl)
+ nodefull2 = lltype.malloc(NODE, zero=True)
+ nodefull2addr = lltype.cast_opaque_ptr(llmemory.GCREF, nodefull2)
ssize = cpu.sizeof(S, None)
adescr = cpu.fielddescrof(S, 'a')
abisdescr = cpu.fielddescrof(S, 'abis')
@@ -270,6 +283,11 @@
u2array = lltype.GcArray(rffi.USHORT)
u2arraydescr = cpu.arraydescrof(u2array)
+ nodefull = lltype.malloc(NODE2, zero=True)
+ nodefull.parent.next = lltype.cast_pointer(lltype.Ptr(NODE), nodefull)
+ nodefull.parent.nexttuple = tpl
+ nodefulladdr = lltype.cast_opaque_ptr(llmemory.GCREF, nodefull)
+
# array of structs (complex data)
complexarray = lltype.GcArray(
lltype.Struct("complex",
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -35,13 +35,22 @@
bad = {}
self.bad = bad
+ def get_runtime_item(self, box, descr, i):
+ array = box.getref_base()
+ if descr.is_array_of_pointers():
+ return InputArgRef(self.cpu.bh_getarrayitem_gc_r(array, i, descr))
+ elif descr.is_array_of_floats():
+ return InputArgFloat(self.cpu.bh_getarrayitem_gc_f(array, i,
descr))
+ else:
+ return InputArgInt(self.cpu.bh_getarrayitem_gc_i(array, i, descr))
+
def get_runtime_field(self, box, descr):
+ struct = box.getref_base()
if descr.is_pointer_field():
- xxx
+ return InputArgRef(self.cpu.bh_getfield_gc_r(struct, descr))
elif descr.is_float_field():
- yyy
+ return InputArgFloat(self.cpu.bh_getfield_gc_f(struct, descr))
else:
- struct = box.getref_base()
return InputArgInt(self.cpu.bh_getfield_gc_i(struct, descr))
class AbstractVirtualStateInfo(object):
@@ -204,8 +213,7 @@
def __init__(self, arraydescr):
self.arraydescr = arraydescr
- def _generate_guards(self, other, box, opinfo, state):
- xxx
+ def _generate_guards(self, other, box, runtime_box, state):
if not isinstance(other, VArrayStateInfo):
raise VirtualStatesCantMatch("other is not an array")
if self.arraydescr is not other.arraydescr:
@@ -213,14 +221,16 @@
if len(self.fieldstate) != len(other.fieldstate):
raise VirtualStatesCantMatch("other has a different length")
fieldbox = None
- fieldinfo = None
+ fieldbox_runtime = None
for i in range(len(self.fieldstate)):
- if box is not None:
+ if runtime_box is not None:
+ opinfo = state.optimizer.getptrinfo(box)
assert isinstance(opinfo, info.ArrayPtrInfo)
fieldbox = opinfo._items[i]
- fieldinfo = get_forwarded(fieldbox)
+ fieldbox_runtime = state.get_runtime_item(runtime_box,
+ self.arraydescr, i)
self.fieldstate[i].generate_guards(other.fieldstate[i],
- fieldbox, fieldinfo, state)
+ fieldbox, fieldbox_runtime, state)
def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
box = optimizer.get_box_replacement(box)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit