[pypy-svn] r52583 - in pypy/branch/jit-hotpath/pypy/jit: rainbow rainbow/test timeshifter
arigo at codespeak.net
arigo at codespeak.net
Sun Mar 16 12:30:04 CET 2008
Author: arigo
Date: Sun Mar 16 12:30:04 2008
New Revision: 52583
Modified:
pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py
pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py
pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
Log:
Better test coverage for simple structs and arrays.
Also fixed green_getfield to not rely on constant-folding of red boxes.
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py Sun Mar 16 12:30:04 2008
@@ -1198,7 +1198,7 @@
assert op.args[1].value != 'vable_access'
# non virtual case
- index = self.serialize_oparg("red", args[0])
+ index = self.serialize_oparg(color, args[0])
fieldname = args[1].value
s_struct = self.hannotator.binding(args[0])
deepfrozen = s_struct.deepfrozen
@@ -1206,8 +1206,9 @@
fielddescindex = self.fielddesc_position(PTRTYPE.TO, fieldname)
if fielddescindex == -1: # Void field
return
- self.emit("%s_getfield" % (color, ), index, fielddescindex, deepfrozen)
+ self.emit("%s_getfield" % (color, ), index, fielddescindex)
if color == "red":
+ self.emit(deepfrozen)
self.register_redvar(op.result)
else:
self.register_greenvar(op.result)
@@ -1239,17 +1240,22 @@
self.emit("red_setfield", destboxindex, fielddescindex, valboxindex)
def serialize_op_getarrayitem(self, op):
+ color = self.opcolor(op)
arrayvar, indexvar = op.args
PTRTYPE = arrayvar.concretetype
if PTRTYPE.TO.OF is lltype.Void:
return
deepfrozen = self.hannotator.binding(arrayvar).deepfrozen
fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
- arrayindex = self.serialize_oparg("red", arrayvar)
- index = self.serialize_oparg("red", indexvar)
- self.emit("red_getarrayitem", arrayindex, fielddescindex, index,
- deepfrozen)
- self.register_redvar(op.result)
+ arrayindex = self.serialize_oparg(color, arrayvar)
+ index = self.serialize_oparg(color, indexvar)
+ self.emit("%s_getarrayitem" % (color, ))
+ self.emit(arrayindex, fielddescindex, index)
+ if color == "red":
+ self.emit(deepfrozen)
+ self.register_redvar(op.result)
+ else:
+ self.register_greenvar(op.result)
def serialize_op_setarrayitem(self, op):
args = op.args
@@ -1273,7 +1279,7 @@
if PTRTYPE.TO.OF is lltype.Void:
return
fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
- arrayindex = self.serialize_oparg("red", arrayvar)
+ arrayindex = self.serialize_oparg(color, arrayvar)
self.emit("%s_getarraysize" % (color, ), arrayindex, fielddescindex)
if color == "red":
self.register_redvar(op.result)
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py Sun Mar 16 12:30:04 2008
@@ -386,8 +386,8 @@
assert gv_res is not None, "segfault!"
return gv_res
- @arguments("red", "fielddesc", "bool", returns="green_from_red")
- def opimpl_green_getfield(self, gv_struct, fielddesc, deepfrozen):
+ @arguments("green", "fielddesc", returns="green")
+ def opimpl_green_getfield(self, gv_struct, fielddesc):
gv_res = fielddesc.getfield_if_non_null(self.rgenop, gv_struct)
assert gv_res is not None, "segfault!"
return gv_res
@@ -398,7 +398,10 @@
@arguments("red", "arraydesc", "red", "bool", returns="red")
def opimpl_red_getarrayitem(self, gv_array, fielddesc, gv_index, deepfrozen):
- Xxx("red_getarrayitem")
+ gv_res = fielddesc.getarrayitem_if_non_null(self.rgenop,
+ gv_array, gv_index)
+ assert gv_res is not None, "segfault!"
+ return gv_res
@arguments("red", "arraydesc", "red", "red")
def opimpl_red_setarrayitem(self, gv_dest, fielddesc, gv_index, gv_value):
@@ -406,11 +409,22 @@
@arguments("red", "arraydesc", returns="red")
def opimpl_red_getarraysize(self, gv_array, fielddesc):
- Xxx("red_getarraysize")
+ gv_res = fielddesc.getarraysize_if_non_null(self.rgenop, gv_array)
+ assert gv_res is not None, "segfault!"
+ return gv_res
- @arguments("red", "arraydesc", returns="green_from_red")
+ @arguments("green", "arraydesc", "green", returns="green")
+ def opimpl_green_getarrayitem(self, gv_array, fielddesc, gv_index):
+ gv_res = fielddesc.getarrayitem_if_non_null(self.rgenop,
+ gv_array, gv_index)
+ assert gv_res is not None, "segfault!"
+ return gv_res
+
+ @arguments("green", "arraydesc", returns="green")
def opimpl_green_getarraysize(self, gv_array, fielddesc):
- Xxx("green_getarraysize")
+ gv_res = fielddesc.getarraysize_if_non_null(self.rgenop, gv_array)
+ assert gv_res is not None, "segfault!"
+ return gv_res
@arguments("red", "interiordesc", "bool", "red_varargs", returns="red")
def opimpl_red_getinteriorfield(self, gv_struct, interiordesc, deepfrozen,
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py Sun Mar 16 12:30:04 2008
@@ -4,6 +4,7 @@
from pypy.rlib.debug import debug_print
from pypy.jit.timeshifter import rtimeshift, rcontainer, rvalue
from pypy.jit.timeshifter.greenkey import empty_key, GreenKey, newgreendict
+from pypy.jit.timeshifter.oop import SegfaultException
from pypy.jit.rainbow import rhotpath
from pypy.rpython.lltypesystem import lltype, llmemory
@@ -789,10 +790,12 @@
return rtimeshift.gengetfield(self.jitstate, deepfrozen, fielddesc,
structbox)
- @arguments("red", "fielddesc", "bool", returns="green_from_red")
- def opimpl_green_getfield(self, structbox, fielddesc, deepfrozen):
- return rtimeshift.gengetfield(self.jitstate, deepfrozen, fielddesc,
- structbox)
+ @arguments("green", "fielddesc", returns="green")
+ def opimpl_green_getfield(self, gv_struct, fielddesc):
+ gv_res = fielddesc.getfield_if_non_null(self.rgenop, gv_struct)
+ if gv_res is None:
+ raise SegfaultException
+ return gv_res
@arguments("red", "fielddesc", "red")
def opimpl_red_setfield(self, destbox, fielddesc, valuebox):
@@ -813,9 +816,21 @@
def opimpl_red_getarraysize(self, arraybox, fielddesc):
return rtimeshift.gengetarraysize(self.jitstate, fielddesc, arraybox)
- @arguments("red", "arraydesc", returns="green_from_red")
- def opimpl_green_getarraysize(self, arraybox, fielddesc):
- return rtimeshift.gengetarraysize(self.jitstate, fielddesc, arraybox)
+ @arguments("green", "arraydesc", "green", returns="green")
+ def opimpl_green_getarrayitem(self, gv_array, fielddesc, gv_index):
+ gv_res = fielddesc.getarrayitem_if_non_null(self.rgenop,
+ gv_array, gv_index)
+ if gv_res is None:
+ raise SegfaultException # XXX should probably just raise it
+ # from fielddesc.getarrayitem()
+ return gv_res
+
+ @arguments("green", "arraydesc", returns="green")
+ def opimpl_green_getarraysize(self, gv_array, fielddesc):
+ gv_res = fielddesc.getarraysize_if_non_null(self.rgenop, gv_array)
+ if gv_res is None:
+ raise SegfaultException
+ return gv_res
@arguments("red", "interiordesc", "bool", "red_varargs", returns="red")
def opimpl_red_getinteriorfield(self, structbox, interiordesc, deepfrozen,
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_hp_interpreter.py Sun Mar 16 12:30:04 2008
@@ -432,45 +432,102 @@
hints={'immutable': True})
def ll_function(s):
- return s.hello * s.world
+ i = 1024
+ while i > 0:
+ i >>= 1
+ s1 = s
+ if MyJitDriver.case >= 2:
+ hint(s1, concrete=True) # green
+ if MyJitDriver.case == 3:
+ s1 = hint(s1, variable=True) # constant redbox
+ #
+ res = s1.hello * s1.world
+ #
+ MyJitDriver.jit_merge_point(s=s, i=i, res=res)
+ MyJitDriver.can_enter_jit(s=s, i=i, res=res)
+ return res
- def struct_S(string):
- items = string.split(',')
- assert len(items) == 2
+ def main(x, y):
s1 = lltype.malloc(S)
- s1.hello = int(items[0])
- s1.world = int(items[1])
- return s1
- ll_function.convert_arguments = [struct_S]
+ s1.hello = x
+ s1.world = y
+ return ll_function(s1)
- res = self.interpret(ll_function, ["6,7"], [])
+ class MyJitDriver(JitDriver):
+ greens = []
+ reds = ['s', 'i', 'res']
+ case = 1
+ res = self.run(main, [6, 7], threshold=2)
assert res == 42
- self.check_insns({'getfield': 2, 'int_mul': 1})
- res = self.interpret(ll_function, ["8,9"], [0])
+ self.check_insns_in_loops({'getfield': 2, 'int_mul': 1,
+ 'int_gt': 1, 'int_rshift': 1})
+
+ class MyJitDriver(JitDriver):
+ greens = ['s']
+ reds = ['i', 'res']
+ case = 2
+ res = self.run(main, [8, 9], threshold=2)
assert res == 72
- self.check_insns({})
+ self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
+
+ class MyJitDriver(JitDriver):
+ greens = ['s']
+ reds = ['i', 'res']
+ case = 3
+ res = self.run(main, [10, 11], threshold=2)
+ assert res == 110
+ self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
def test_simple_array(self):
A = lltype.GcArray(lltype.Signed,
hints={'immutable': True})
def ll_function(a):
- return a[0] * a[1]
+ i = 1024
+ while i > 0:
+ i >>= 1
+ a1 = a
+ if MyJitDriver.case >= 2:
+ hint(a1, concrete=True) # green
+ if MyJitDriver.case == 3:
+ a1 = hint(a1, variable=True) # constant redbox
+ #
+ res = a1[0] * a1[1] + len(a1)
+ #
+ MyJitDriver.jit_merge_point(a=a, i=i, res=res)
+ MyJitDriver.can_enter_jit(a=a, i=i, res=res)
+ return res
- def int_array(string):
- items = [int(x) for x in string.split(',')]
- n = len(items)
- a1 = lltype.malloc(A, n)
- for i in range(n):
- a1[i] = items[i]
- return a1
- ll_function.convert_arguments = [int_array]
+ def main(x, y):
+ a = lltype.malloc(A, 2)
+ a[0] = x
+ a[1] = y
+ return ll_function(a)
- res = self.interpret(ll_function, ["6,7"], [])
- assert res == 42
- self.check_insns({'getarrayitem': 2, 'int_mul': 1})
- res = self.interpret(ll_function, ["8,3"], [0])
- assert res == 24
- self.check_insns({})
+ class MyJitDriver(JitDriver):
+ greens = []
+ reds = ['a', 'i', 'res']
+ case = 1
+ res = self.run(main, [6, 7], threshold=2)
+ assert res == 44
+ self.check_insns_in_loops({'getarrayitem': 2, 'int_mul': 1,
+ 'getarraysize': 1, 'int_add': 1,
+ 'int_gt': 1, 'int_rshift': 1})
+
+ class MyJitDriver(JitDriver):
+ greens = ['a']
+ reds = ['i', 'res']
+ case = 2
+ res = self.run(main, [8, 9], threshold=2)
+ assert res == 74
+ self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
+
+ class MyJitDriver(JitDriver):
+ greens = ['a']
+ reds = ['i', 'res']
+ case = 3
+ res = self.run(main, [10, 11], threshold=2)
+ assert res == 112
+ self.check_insns_in_loops({'int_gt': 1, 'int_rshift': 1})
def test_arraysize(self):
A = lltype.GcArray(lltype.Signed)
@@ -1740,3 +1797,7 @@
return f(space, x, y)
res = self.interpret(main2, [5, 6], policy=StopAtXPolicy(g))
assert res == 11
+
+
+ #def test_handle_SegfaultException(self):
+ # ...
Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rcontainer.py Sun Mar 16 12:30:04 2008
@@ -618,18 +618,18 @@
self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
self.indexkind = RGenOp.kindToken(lltype.Signed)
- def getarrayitem_if_non_null(jitstate, genvar, gv_index):
+ def getarrayitem_if_non_null(rgenop, genvar, gv_index):
array = genvar.revealconst(self.PTRTYPE)
index = gv_index.revealconst(lltype.Signed)
if array and 0 <= index < len(array): # else don't constant-fold
res = array[index]
- return rvalue.ll_gv_fromvalue(jitstate, res)
+ return rgenop.genconst(res)
self.getarrayitem_if_non_null = getarrayitem_if_non_null
- def getarraysize_if_non_null(jitstate, genvar):
+ def getarraysize_if_non_null(rgenop, genvar):
array = genvar.revealconst(self.PTRTYPE)
if array: # else don't constant-fold
res = len(array)
- return rvalue.ll_gv_fromvalue(jitstate, res)
+ return rgenop.genconst(res)
self.getarraysize_if_non_null = getarraysize_if_non_null
# ____________________________________________________________
Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py Sun Mar 16 12:30:04 2008
@@ -167,7 +167,7 @@
if ((fielddesc.immutable or deepfrozen) and argbox.is_constant()
and indexbox.is_constant()):
resgv = fielddesc.getarrayitem_if_non_null(
- jitstate, argbox.getgenvar(jitstate),
+ jitstate.curbuilder.rgenop, argbox.getgenvar(jitstate),
indexbox.getgenvar(jitstate))
if resgv is not None:
return fielddesc.makebox(jitstate, resgv)
@@ -204,7 +204,7 @@
def gengetarraysize(jitstate, fielddesc, argbox):
if argbox.is_constant():
resgv = fielddesc.getarraysize_if_non_null(
- jitstate, argbox.getgenvar(jitstate))
+ jitstate.curbuilder.rgenop, argbox.getgenvar(jitstate))
if resgv is not None:
return rvalue.redboxbuilder_int(fielddesc.indexkind, resgv)
genvar = jitstate.curbuilder.genop_getarraysize(
More information about the Pypy-commit
mailing list