[pypy-svn] r64804 - pypy/branch/pyjitpl5/pypy/jit/backend/test
arigo at codespeak.net
arigo at codespeak.net
Wed Apr 29 14:46:49 CEST 2009
Author: arigo
Date: Wed Apr 29 14:46:37 2009
New Revision: 64804
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py
Log:
Support ptrs to structures, step 1: GETFIELD_GC
of always-prebuilt structures.
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/test/test_random.py Wed Apr 29 14:46:37 2009
@@ -1,7 +1,9 @@
import py, sys, math
from pypy.rlib.rarithmetic import intmask, LONG_BIT
+from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.jit.backend.test import conftest as demo_conftest
from pypy.jit.metainterp.history import TreeLoop, BoxInt, ConstInt
+from pypy.jit.metainterp.history import BoxPtr, ConstPtr
from pypy.jit.metainterp.resoperation import ResOperation, rop
from pypy.jit.metainterp.executor import execute
@@ -10,51 +12,123 @@
def __init__(self, cpu, loop, vars):
self.cpu = cpu
self.loop = loop
- self.vars = vars
- self.boolvars = [] # subset of self.vars
+ self.intvars = vars
+ self.boolvars = [] # subset of self.intvars
+ self.ptrvars = []
+ self.prebuilt_ptr_consts = []
self.should_fail_by = None
+ self.counter = 0
- def do(self, opnum, argboxes):
- v_result = execute(self.cpu, opnum, argboxes)
+ def do(self, opnum, argboxes, descr=None):
+ v_result = execute(self.cpu, opnum, argboxes, descr)
v_result = BoxInt(v_result.value)
- self.loop.operations.append(ResOperation(opnum, argboxes, v_result))
+ self.loop.operations.append(ResOperation(opnum, argboxes, v_result,
+ descr))
return v_result
def get_bool_var(self, r):
- if self.boolvars:
+ if self.boolvars and r.random() < 0.8:
v = r.choice(self.boolvars)
+ elif self.ptrvars and r.random() < 0.4:
+ v = r.choice(self.ptrvars)
+ if r.random() < 0.5:
+ v = self.do(rop.OONONNULL, [v])
+ else:
+ v = self.do(rop.OOISNULL, [v])
else:
- v = r.choice(self.vars)
+ v = r.choice(self.intvars)
v = self.do(rop.INT_IS_TRUE, [v])
return v
+ def get_structptr_var(self, r):
+ if self.ptrvars and r.random() < 0.8:
+ v = r.choice(self.ptrvars)
+ elif self.prebuilt_ptr_consts and r.random() < 0.7:
+ v, _ = r.choice(self.prebuilt_ptr_consts)
+ else:
+ p = self.get_random_structure(r)
+ v = ConstPtr(lltype.cast_opaque_ptr(llmemory.GCREF, p))
+ self.prebuilt_ptr_consts.append((v, self.field_values(p)))
+ return v
+
+ def get_random_structure_type(self, r):
+ fields = []
+ for i in range(r.randrange(1, 5)):
+ fields.append(('f%d' % i, lltype.Signed))
+ S = lltype.GcStruct('S%d' % self.counter, *fields)
+ self.counter += 1
+ return S
+
+ def get_random_structure(self, r):
+ S = self.get_random_structure_type(r)
+ p = lltype.malloc(S)
+ for fieldname in lltype.typeOf(p).TO._names:
+ setattr(p, fieldname, r.random_integer())
+ return p
+
+ def field_values(self, p):
+ dic = {}
+ for fieldname in lltype.typeOf(p).TO._names:
+ dic[fieldname] = getattr(p, fieldname)
+ return dic
+
def print_loop(self):
if demo_conftest.option.output:
s = open(demo_conftest.option.output, "w")
else:
s = sys.stdout
names = {None: 'None'}
- for v in self.vars:
- names[v] = 'v%d' % len(names)
- print >>s, ' %s = BoxInt()' % (names[v],)
+ #
+ def writevar(v, nameprefix):
+ names[v] = '%s%d' % (nameprefix, len(names))
+ print >>s, ' %s = %s()' % (names[v], v.__class__.__name__)
+ #
+ for v in self.intvars:
+ writevar(v, 'v')
+ for v in self.ptrvars:
+ writevar(v, 'p')
for op in self.loop.operations:
v = op.result
if v not in names:
- names[v] = 'tmp%d' % len(names)
- print >>s, ' %s = BoxInt()' % (names[v],)
+ writevar(v, 'tmp')
+ #
+ written = {}
+ for v, fields in self.prebuilt_ptr_consts:
+ container = v.value._obj.container
+ S = lltype.typeOf(container)
+ if S not in written:
+ print >>s, ' %s = lltype.GcStruct(%r,' % (S._name, S._name)
+ for name in S._names:
+ print >>s, ' (%r, lltype.Signed),' % (name,)
+ print >>s, ' )'
+ written[S] = True
+ print >>s, ' p = lltype.malloc(%s)' % (S._name,)
+ for name in S._names:
+ print >>s, ' p.%s = %d' % (name, getattr(container, name))
+ writevar(v, 'preb')
+ print >>s, ' %s.value =' % (names[v],),
+ print >>s, 'lltype.cast_opaque_ptr(llmemory.GCREF, p)'
+ #
+ print >>s, ' cpu = CPU(None, None)'
print >>s, " loop = TreeLoop('test')"
print >>s, ' loop.inputargs = [%s]' % (
', '.join([names[v] for v in self.loop.inputargs]))
from pypy.jit.metainterp.resoperation import opname
print >>s, ' loop.operations = ['
for op in self.loop.operations:
- print >>s, ' ResOperation(rop.%s, [%s], %s),' % (
- opname[op.opnum],
- ', '.join([names.get(v, 'ConstInt(%d)' % v.value)
- for v in op.args]),
- names[op.result])
- print >>s, ' ]'
- print >>s, ' cpu = CPU(None, None)'
+ args = []
+ for v in op.args:
+ if v in names:
+ args.append(names[v])
+ else:
+ args.append('ConstInt(%d)' % v.value)
+ if op.descr is None:
+ descrstr = ''
+ else:
+ descrstr = ', ' + op.descr._random_info
+ print >>s, ' ResOperation(rop.%s, [%s], %s%s),' % (
+ opname[op.opnum], ', '.join(args), names[op.result], descrstr)
+ print >>s, ' ]'
print >>s, ' cpu.compile_operations(loop)'
for i, v in enumerate(self.loop.inputargs):
print >>s, ' cpu.set_future_value_int(%d, %d)' % (i, v.value)
@@ -76,15 +150,15 @@
def __init__(self, opnum, boolres=False):
self.opnum = opnum
self.boolres = boolres
- def put(self, builder, args):
- v_result = builder.do(self.opnum, args)
- builder.vars.append(v_result)
+ def put(self, builder, args, descr=None):
+ v_result = builder.do(self.opnum, args, descr=descr)
+ builder.intvars.append(v_result)
if self.boolres:
builder.boolvars.append(v_result)
class UnaryOperation(AbstractOperation):
def produce_into(self, builder, r):
- self.put(builder, [r.choice(builder.vars)])
+ self.put(builder, [r.choice(builder.intvars)])
class BooleanUnaryOperation(UnaryOperation):
def produce_into(self, builder, r):
@@ -101,12 +175,12 @@
if k < 0.2:
v_first = ConstInt(r.random_integer())
else:
- v_first = r.choice(builder.vars)
+ v_first = r.choice(builder.intvars)
if k > 0.75:
value = r.random_integer()
v_second = ConstInt((value & self.and_mask) | self.or_mask)
else:
- v = r.choice(builder.vars)
+ v = r.choice(builder.intvars)
if (v.value & self.and_mask) != v.value:
v = builder.do(rop.INT_AND, [v, ConstInt(self.and_mask)])
if (v.value | self.or_mask) != v.value:
@@ -122,9 +196,9 @@
builder.loop.operations.append(op)
k = r.random()
subset = []
- num = int(k * len(builder.vars))
+ num = int(k * len(builder.intvars))
for i in range(num):
- subset.append(r.choice(builder.vars))
+ subset.append(r.choice(builder.intvars))
r.shuffle(subset)
op.suboperations = [ResOperation(rop.FAIL, subset, None)]
if ((self.opnum == rop.GUARD_TRUE and not v.value) or
@@ -132,6 +206,17 @@
builder.should_fail_by = op.suboperations[0]
builder.should_fail_by_num = len(builder.loop.operations) - 1
+class GetFieldOp(AbstractOperation):
+ def produce_into(self, builder, r):
+ v = builder.get_structptr_var(r)
+ S = lltype.typeOf(v.value._obj.container)
+ name = r.choice(S._names)
+ descr = builder.cpu.fielddescrof(S, name)
+ descr._random_info = 'cpu.fielddescrof(%s, %r)' % (S._name, name)
+ self.put(builder, [v], descr)
+
+# ____________________________________________________________
+
OPERATIONS = []
for _op in [rop.INT_ADD,
@@ -174,6 +259,9 @@
OPERATIONS.append(UnaryOperation(rop.INT_IS_TRUE, boolres=True))
OPERATIONS.append(BooleanUnaryOperation(rop.BOOL_NOT, boolres=True))
+OPERATIONS.append(GetFieldOp(rop.GETFIELD_GC))
+OPERATIONS.append(GetFieldOp(rop.GETFIELD_GC_PURE))
+
# ____________________________________________________________
def Random():
@@ -228,11 +316,12 @@
break
endvars = []
+ used_later = {}
+ for op in loop.operations:
+ for v in op.args:
+ used_later[v] = True
for v in vars:
- for op in loop.operations:
- if v in op.args:
- break
- else:
+ if v not in used_later:
endvars.append(v)
r.shuffle(endvars)
loop.operations.append(ResOperation(rop.FAIL, endvars, None))
@@ -245,8 +334,6 @@
expected = {}
for v in endvars:
expected[v] = v.value
- for v in endvars:
- v.changevalue_int(-sys.maxint-1)
for i, v in enumerate(valueboxes):
cpu.set_future_value_int(i, v.value)
More information about the Pypy-commit
mailing list