[pypy-svn] r67375 - in pypy/branch/newtrunk/pypy: . jit/metainterp jit/metainterp/test
pedronis at codespeak.net
pedronis at codespeak.net
Tue Sep 1 10:37:08 CEST 2009
Author: pedronis
Date: Tue Sep 1 10:37:06 2009
New Revision: 67375
Modified:
pypy/branch/newtrunk/pypy/ (props changed)
pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py
pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py
pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py
pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py
pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py
pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py
Log:
(micke, pedronis)
merge 67365 to 67370 from branch/pyjitpl5
Modified: pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py (original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py Tue Sep 1 10:37:06 2009
@@ -127,6 +127,16 @@
self.nodes[box] = node
return node
+ def is_constant_box(self, box):
+ if isinstance(box, Const):
+ return True
+ try:
+ node = self.nodes[box]
+ except KeyError:
+ return False
+ else:
+ return node.is_constant()
+
def find_nodes(self, operations):
for op in operations:
opnum = op.opnum
@@ -156,7 +166,6 @@
find_nodes_OOISNULL = find_nodes_no_escape
find_nodes_OOIS = find_nodes_no_escape
find_nodes_OOISNOT = find_nodes_no_escape
- find_nodes_ARRAYLEN_GC = find_nodes_no_escape
find_nodes_INSTANCEOF = find_nodes_no_escape
def find_nodes_NEW_WITH_VTABLE(self, op):
@@ -171,13 +180,19 @@
def find_nodes_NEW_ARRAY(self, op):
lengthbox = op.args[0]
- if not isinstance(lengthbox, ConstInt):
+ if not self.is_constant_box(lengthbox):
return # var-sized arrays are not virtual
arraynode = InstanceNode()
- arraynode.arraysize = lengthbox.value
+ arraynode.arraysize = lengthbox.getint()
arraynode.arraydescr = op.descr
self.nodes[op.result] = arraynode
+ def find_nodes_ARRAYLEN_GC(self, op):
+ arraynode = self.getnode(op.args[0])
+ if arraynode.arraydescr is not None:
+ assert op.result.getint() == arraynode.arraysize
+ self.set_constant_node(op.result)
+
def find_nodes_GUARD_CLASS(self, op):
instnode = self.getnode(op.args[0])
if instnode.fromstart: # only useful (and safe) in this case
@@ -225,7 +240,7 @@
def find_nodes_SETARRAYITEM_GC(self, op):
indexbox = op.args[1]
- if not isinstance(indexbox, ConstInt):
+ if not self.is_constant_box(indexbox):
self.find_nodes_default(op) # not a Const index
return
arraynode = self.getnode(op.args[0])
@@ -235,18 +250,18 @@
return # nothing to be gained from tracking the item
if arraynode.curitems is None:
arraynode.curitems = {}
- arraynode.curitems[indexbox.value] = itemnode
+ arraynode.curitems[indexbox.getint()] = itemnode
arraynode.add_escape_dependency(itemnode)
def find_nodes_GETARRAYITEM_GC(self, op):
indexbox = op.args[1]
- if not isinstance(indexbox, ConstInt):
+ if not self.is_constant_box(indexbox):
self.find_nodes_default(op) # not a Const index
return
arraynode = self.getnode(op.args[0])
if arraynode.escaped:
return # nothing to be gained from tracking the item
- index = indexbox.value
+ index = indexbox.getint()
if arraynode.curitems is not None and index in arraynode.curitems:
itemnode = arraynode.curitems[index]
elif arraynode.origitems is not None and index in arraynode.origitems:
Modified: pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py Tue Sep 1 10:37:06 2009
@@ -809,7 +809,8 @@
pass # xxx?
def generate_merge_point(self, pc, varargs):
- if self.metainterp.is_blackholing():
+ # XXX could be sped up by calling the portal if in_recursion is non-zero
+ if self.metainterp.is_blackholing() and not self.metainterp.in_recursion:
raise self.metainterp.staticdata.ContinueRunningNormally(varargs)
num_green_args = self.metainterp.staticdata.num_green_args
for i in range(num_green_args):
@@ -1246,7 +1247,6 @@
debug_print('~~~ LEAVE', self.history.extratext)
def interpret(self):
- self.in_recursion = 0
if we_are_translated():
self._interpret()
else:
@@ -1476,6 +1476,7 @@
*args[1:])
def initialize_state_from_start(self, *args):
+ self.in_recursion = 0
self.staticdata._setup_once()
self.staticdata.profiler.start_tracing()
self.create_empty_history()
@@ -1492,6 +1493,7 @@
def initialize_state_from_guard_failure(self, guard_failure):
# guard failure: rebuild a complete MIFrame stack
+ self.in_recursion = 0
resumedescr = guard_failure.descr
assert isinstance(resumedescr, compile.ResumeGuardDescr)
warmrunnerstate = self.staticdata.state
@@ -1617,7 +1619,10 @@
jitcode, pc, exception_target = resumereader.consume_frame_info()
env = resumereader.consume_boxes()
f = self.newframe(jitcode)
+ if jitcode is self.staticdata.portal_code:
+ self.in_recursion += 1
f.setup_resume_at_op(pc, exception_target, env)
+ self.in_recursion -= 1 # always one portal around
def check_synchronized_virtualizable(self):
if not we_are_translated():
Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py (original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py Tue Sep 1 10:37:06 2009
@@ -186,8 +186,10 @@
ops = []
newlines = []
for line in lines:
- if not line.strip() or line.strip().startswith("#"):
- continue # a comment
+ if '#' in line:
+ line = line[:line.index('#')] # remove comment
+ if not line.strip():
+ continue # a comment or empty line
newlines.append(line)
base_indent, inpargs = self.parse_inpargs(newlines[0])
newlines = newlines[1:]
Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py (original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py Tue Sep 1 10:37:06 2009
@@ -74,8 +74,25 @@
sbox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(S)))
arraydescr2 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(S)))
+ T = lltype.GcStruct('TUPLE',
+ ('c', lltype.Signed),
+ ('d', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
+ tsize = cpu.sizeof(T)
+ cdescr = cpu.fielddescrof(T, 'c')
+ ddescr = cpu.fielddescrof(T, 'd')
+ arraydescr3 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(NODE)))
+
+ U = lltype.GcStruct('U',
+ ('parent', OBJECT),
+ ('one', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
+ u_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
+ u_vtable_adr = llmemory.cast_ptr_to_adr(u_vtable)
+ usize = cpu.sizeof(U)
+ onedescr = cpu.fielddescrof(U, 'one')
+
cpu.class_sizes = {cpu.cast_adr_to_int(node_vtable_adr): cpu.sizeof(NODE),
- cpu.cast_adr_to_int(node_vtable_adr2): cpu.sizeof(NODE2)}
+ cpu.cast_adr_to_int(node_vtable_adr2): cpu.sizeof(NODE2),
+ cpu.cast_adr_to_int(u_vtable_adr): cpu.sizeof(U)}
namespace = locals()
class OOtypeMixin(object):
@@ -117,6 +134,19 @@
sbox = BoxObj(ootype.cast_to_object(ootype.new(S)))
arraydescr2 = cpu.arraydescrof(ootype.Array(S))
+ T = ootype.Record({'c': ootype.Signed,
+ 'd': ootype.Array(NODE)})
+ tsize = cpu.typedescrof(T)
+ cdescr = cpu.fielddescrof(T, 'c')
+ ddescr = cpu.fielddescrof(T, 'd')
+ arraydescr3 = cpu.arraydescrof(ootype.Array(NODE))
+
+ U = ootype.Instance('U', ootype.ROOT, {'one': ootype.Array(NODE)})
+ usize = cpu.typedescrof(U)
+ onedescr = cpu.fielddescrof(U, 'one')
+ u_vtable = ootype.runtimeClass(U)
+ u_vtable_adr = ootype.cast_to_object(u_vtable)
+
# force a consistent order
valuedescr.sort_key()
nextdescr.sort_key()
@@ -124,7 +154,8 @@
bdescr.sort_key()
cpu.class_sizes = {node_vtable_adr: cpu.typedescrof(NODE),
- node_vtable_adr2: cpu.typedescrof(NODE2)}
+ node_vtable_adr2: cpu.typedescrof(NODE2),
+ u_vtable_adr: cpu.typedescrof(U)}
namespace = locals()
class BaseTest(object):
@@ -739,6 +770,128 @@
"""
self.find_nodes(ops, 'Not, Not')
+ def test_find_nodes_arithmetic_propagation_bug_0(self):
+ ops = """
+ [p1]
+ i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
+ escape(i1)
+ i2 = int_add(0, 1)
+ p2 = new_array(i2, descr=arraydescr)
+ i3 = escape()
+ setarrayitem_gc(p2, 0, i3, descr=arraydescr)
+ jump(p2)
+ """
+ self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+
+ def test_find_nodes_arithmetic_propagation_bug_1(self):
+ ops = """
+ [p1]
+ i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
+ escape(i1)
+ i2 = same_as(1)
+ p2 = new_array(i2, descr=arraydescr)
+ setarrayitem_gc(p2, 0, 5)
+ jump(p2)
+ """
+ self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+
+ def test_find_nodes_arithmetic_propagation_bug_2(self):
+ ops = """
+ [p1]
+ i0 = int_sub(17, 17)
+ i1 = getarrayitem_gc(p1, i0, descr=arraydescr)
+ escape(i1)
+ i2 = int_add(0, 1)
+ p2 = new_array(i2, descr=arraydescr)
+ i3 = escape()
+ setarrayitem_gc(p2, i0, i3, descr=arraydescr)
+ jump(p2)
+ """
+ self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1, i0=0)
+
+ def test_find_nodes_arithmetic_propagation_bug_3(self):
+ ops = """
+ [p1]
+ i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
+ escape(i1)
+ p3 = new_array(1, descr=arraydescr)
+ i2 = arraylen_gc(p3, descr=arraydescr)
+ p2 = new_array(i2, descr=arraydescr)
+ i3 = escape()
+ setarrayitem_gc(p2, 0, i3, descr=arraydescr)
+ jump(p2)
+ """
+ self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+
+ def test_find_nodes_bug_1(self):
+ ops = """
+ [p12]
+ i16 = ooisnull(p12)
+ guard_false(i16)
+ fail()
+ guard_class(p12, ConstClass(node_vtable))
+ fail()
+ guard_class(p12, ConstClass(node_vtable))
+ fail()
+ i22 = getfield_gc_pure(p12, descr=valuedescr)
+ escape(i22)
+ i25 = ooisnull(p12)
+ guard_false(i25)
+ fail()
+ guard_class(p12, ConstClass(node_vtable))
+ fail()
+ guard_class(p12, ConstClass(node_vtable))
+ fail()
+ i29 = getfield_gc_pure(p12, descr=valuedescr)
+ i31 = int_add_ovf(i29, 1)
+ guard_no_overflow()
+ fail()
+ p33 = new_with_vtable(ConstClass(node_vtable)) # NODE
+ setfield_gc(p33, i31, descr=valuedescr)
+ #
+ p35 = new_array(1, descr=arraydescr3) # Array(NODE)
+ setarrayitem_gc(p35, 0, p33, descr=arraydescr3)
+ p38 = new_with_vtable(ConstClass(u_vtable)) # U
+ setfield_gc(p38, p35, descr=onedescr)
+ i39 = ooisnull(p38)
+ guard_false(i39)
+ fail()
+ i40 = oononnull(p38)
+ guard_true(i40)
+ fail()
+ guard_class(p38, ConstClass(u_vtable))
+ fail()
+ p42 = getfield_gc(p38, descr=onedescr) # Array(NODE)
+ i43 = arraylen_gc(p42, descr=arraydescr3)
+ i45 = int_sub(i43, 0)
+ p46 = new(descr=tsize) # T
+ setfield_gc(p46, i45, descr=cdescr)
+ p47 = new_array(i45, descr=arraydescr3) # Array(NODE)
+ setfield_gc(p46, p47, descr=ddescr)
+ i48 = int_lt(0, i43)
+ guard_true(i48)
+ fail()
+ p49 = getarrayitem_gc(p42, 0, descr=arraydescr3) # NODE
+ p50 = getfield_gc(p46, descr=ddescr) # Array(NODE)
+ setarrayitem_gc(p50, 0, p49, descr=arraydescr3)
+ i52 = int_lt(1, i43)
+ guard_false(i52)
+ fail()
+ i53 = getfield_gc(p46, descr=cdescr)
+ i55 = int_ne(i53, 1)
+ guard_false(i55)
+ fail()
+ p56 = getfield_gc(p46, descr=ddescr) # Array(NODE)
+ p58 = getarrayitem_gc(p56, 0, descr=arraydescr3) # NODE
+ i59 = ooisnull(p38)
+ guard_false(i59)
+ fail()
+ jump(p58)
+ """
+ self.find_nodes(ops, 'Virtual(node_vtable, valuedescr=Not)',
+ i16=0, i25=0, i39=0, i52=0, i55=0, i59=0,
+ i43=1, i45=1, i48=1, i40=1)
+
# ------------------------------
# Bridge tests
Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py (original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py Tue Sep 1 10:37:06 2009
@@ -176,6 +176,41 @@
else:
py.test.fail("DID NOT RAISE")
+ def test_inner_failure(self):
+ from pypy.rpython.annlowlevel import hlstr
+ def p(code, pc):
+ code = hlstr(code)
+ return "%s %d %s" % (code, pc, code[pc])
+ myjitdriver = JitDriver(greens=['code', 'pc'], reds=['n'], get_printable_location=p)
+ def f(code, n):
+ pc = 0
+ while pc < len(code):
+
+ myjitdriver.jit_merge_point(n=n, code=code, pc=pc)
+ op = code[pc]
+ if op == "-":
+ n -= 1
+ elif op == "c":
+ n = f("---i---", n)
+ elif op == "i":
+ if n % 5 == 1:
+ return n
+ elif op == "l":
+ if n > 0:
+ myjitdriver.can_enter_jit(n=n, code=code, pc=0)
+ pc = 0
+ continue
+ else:
+ assert 0
+ pc += 1
+ return n
+ def main(n):
+ return f("c-l", n)
+ print main(100)
+ res = self.meta_interp(main, [100], optimizer=simple_optimize)
+ assert res == 0
+
+
class TestLLtype(RecursiveTests, LLJitMixin):
pass
Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py (original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py Tue Sep 1 10:37:06 2009
@@ -14,6 +14,5 @@
# ==========> test_recursive.py
- @py.test.mark.xfail
def test_inline_faulty_can_inline(self):
- test_recursive.RecursiveTests.test_inline_faulty_can_inline(self)
+ py.test.skip("XXX does not work with LLException")
More information about the Pypy-commit
mailing list