Author: Armin Rigo <[email protected]>
Branch: optresult-unroll
Changeset: r79516:7dd7112b93f3
Date: 2015-09-08 10:08 +0200
http://bitbucket.org/pypy/pypy/changeset/7dd7112b93f3/
Log: Adapt test_random.py (next is test_ll_random)
diff --git a/rpython/jit/backend/test/test_random.py
b/rpython/jit/backend/test/test_random.py
--- a/rpython/jit/backend/test/test_random.py
+++ b/rpython/jit/backend/test/test_random.py
@@ -2,12 +2,13 @@
import pytest
from rpython.rlib.rarithmetic import intmask, LONG_BIT
from rpython.jit.metainterp.history import BasicFailDescr, TreeLoop,
BasicFinalDescr
-from rpython.jit.metainterp.history import BoxInt, ConstInt, JitCellToken, Box
-from rpython.jit.metainterp.history import BoxPtr, ConstPtr, TargetToken
-from rpython.jit.metainterp.history import BoxFloat, ConstFloat, Const
-from rpython.jit.metainterp.history import INT, FLOAT
+from rpython.jit.metainterp.history import INT, ConstInt, JitCellToken
+from rpython.jit.metainterp.history import REF, ConstPtr, TargetToken
+from rpython.jit.metainterp.history import FLOAT, ConstFloat, Const, VOID
from rpython.jit.metainterp.resoperation import ResOperation, rop
-from rpython.jit.metainterp.executor import execute_nonspec
+from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef
+from rpython.jit.metainterp.resoperation import InputArgFloat
+from rpython.jit.metainterp.executor import execute_nonspec_const
from rpython.jit.metainterp.resoperation import opname
from rpython.jit.codewriter import longlong
from rpython.rtyper.lltypesystem import lltype, rstr
@@ -31,11 +32,11 @@
cpu._faildescr_keepalive = []
self.fakemetainterp = FakeMetaInterp()
self.loop = loop
- self.intvars = [box for box in vars if isinstance(box, BoxInt)]
+ self.intvars = [box for box in vars if box.type == INT]
self.boolvars = [] # subset of self.intvars
self.ptrvars = []
self.prebuilt_ptr_consts = []
- floatvars = [box for box in vars if isinstance(box, BoxFloat)]
+ floatvars = [box for box in vars if box.type == FLOAT]
if cpu.supports_floats:
self.floatvars = floatvars
else:
@@ -53,16 +54,15 @@
def do(self, opnum, argboxes, descr=None):
self.fakemetainterp._got_exc = None
- if opnum == rop.ZERO_PTR_FIELD:
- v_result = None
- else:
- v_result = execute_nonspec(self.cpu, self.fakemetainterp,
- opnum, argboxes, descr)
- if isinstance(v_result, Const):
- v_result = v_result.clonebox()
- self.loop.operations.append(ResOperation(opnum, argboxes, v_result,
- descr))
- return v_result
+ op = ResOperation(opnum, argboxes, descr)
+ if opnum != rop.ZERO_PTR_FIELD:
+ assert op.type != VOID, op
+ c_result = execute_nonspec_const(self.cpu, self.fakemetainterp,
+ opnum, argboxes, descr,
+ type=op.type)
+ op.copy_value_from(c_result)
+ self.loop.operations.append(op)
+ return op
def get_bool_var(self, r):
if self.boolvars and r.random() < 0.8:
@@ -100,13 +100,13 @@
if v in names:
args.append(names[v])
elif isinstance(v, ConstPtr):
- assert not v.value # otherwise should be in the names
+ assert not v.getref_base() # otherwise should be in the names
args.append('ConstPtr(lltype.nullptr(llmemory.GCREF.TO))')
elif isinstance(v, ConstFloat):
args.append('ConstFloat(longlong.getfloatstorage(%r))'
% v.getfloat())
elif isinstance(v, ConstInt):
- args.append('ConstInt(%s)' % v.value)
+ args.append('ConstInt(%s)' % v.getint())
else:
raise NotImplementedError(v)
if op.getdescr() is None:
@@ -119,13 +119,13 @@
descrstr = ', TargetToken()'
else:
descrstr = ', descr=' +
self.descr_counters.get(op.getdescr(), '...')
- print >>s, ' ResOperation(rop.%s, [%s], %s%s),' % (
- opname[op.getopnum()], ', '.join(args), names[op.result], descrstr)
+ print >>s, ' %s = ResOperation(rop.%s, [%s]%s),' % (
+ names[op], opname[op.getopnum()], ', '.join(args), descrstr)
def print_loop(self, output, fail_descr=None, fail_args=None):
def update_names(ops):
for op in ops:
- v = op.result
+ v = op
if v not in names:
writevar(v, 'tmp')
if op.is_guard() or op.opnum == rop.FINISH:
@@ -197,10 +197,10 @@
#
def writevar(v, nameprefix, init=''):
if nameprefix == 'const_ptr':
- if not v.value:
+ if not v.getref_base():
return 'lltype.nullptr(llmemory.GCREF.TO)'
- TYPE = v.value._obj.ORIGTYPE
- cont = lltype.cast_opaque_ptr(TYPE, v.value)
+ TYPE = v.getref_base()._obj.ORIGTYPE
+ cont = lltype.cast_opaque_ptr(TYPE, v.getref_base())
if TYPE.TO._is_varsize():
if isinstance(TYPE.TO, lltype.GcStruct):
lgt = len(cont.chars)
@@ -249,8 +249,8 @@
if hasattr(self.loop, 'inputargs'):
vals = []
for i, v in enumerate(self.loop.inputargs):
- assert isinstance(v, Box)
- if isinstance(v, BoxFloat):
+ assert not isinstance(v, Const)
+ if v.type == FLOAT:
vals.append("longlong.getfloatstorage(%r)" % v.getfloat())
else:
vals.append("%r" % v.getint())
@@ -261,12 +261,12 @@
else:
fail_args = self.should_fail_by.getfailargs()
for i, v in enumerate(fail_args):
- if isinstance(v, (BoxFloat, ConstFloat)):
+ if v.type == FLOAT:
print >>s, (' assert longlong.getrealfloat('
- 'cpu.get_float_value(frame, %d)) == %r' % (i, v.value))
+ 'cpu.get_float_value(frame, %d)) == %r' % (i,
v.getfloatstorage()))
else:
print >>s, (' assert cpu.get_int_value(frame, %d) == %d'
- % (i, v.value))
+ % (i, v.getint()))
self.names = names
s.flush()
@@ -290,14 +290,14 @@
def put(self, builder, args, descr=None):
v_result = builder.do(self.opnum, args, descr=descr)
if v_result is not None:
- if isinstance(v_result, BoxInt):
+ if v_result.type == INT:
builder.intvars.append(v_result)
boolres = self.boolres
if boolres == 'sometimes':
- boolres = v_result.value in [0, 1]
+ boolres = v_result.getint() in [0, 1]
if boolres:
builder.boolvars.append(v_result)
- elif isinstance(v_result, BoxFloat):
+ elif v_result.type == FLOAT:
builder.floatvars.append(v_result)
assert self.boolres != True
else:
@@ -316,10 +316,8 @@
def produce_into(self, builder, r):
if r.random() < 0.4:
UnaryOperation.produce_into(self, builder, r)
- elif r.random() < 0.75 or not builder.cpu.supports_floats:
+ else:
self.put(builder, [ConstInt(r.random_integer())])
- else:
- self.put(builder, [ConstFloat(r.random_float_storage())])
class SignExtOperation(AbstractOperation):
def produce_into(self, builder, r):
@@ -345,9 +343,11 @@
v_second = ConstInt((value & self.and_mask) | self.or_mask)
else:
v = r.choice(builder.intvars)
- if (v.value & self.and_mask) != v.value:
+ v_value = v.getint()
+ 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:
+ v_value = v.getint()
+ if (v_value | self.or_mask) != v_value:
v = builder.do(rop.INT_OR, [v, ConstInt(self.or_mask)])
v_second = v
self.put(builder, [v_first, v_second])
@@ -359,14 +359,14 @@
super(AbstractOvfOperation, self).produce_into(builder, r)
if builder.fakemetainterp._got_exc: # overflow detected
assert isinstance(builder.fakemetainterp._got_exc, OverflowError)
- op = ResOperation(rop.GUARD_OVERFLOW, [], None)
+ op = ResOperation(rop.GUARD_OVERFLOW, [])
# the overflowed result should not be used any more, but can
# be used on the failure path: recompute fail_subset including
# the result, and then remove it from builder.intvars.
fail_subset = builder.subset_of_intvars(r)
builder.intvars[:] = original_intvars
else:
- op = ResOperation(rop.GUARD_NO_OVERFLOW, [], None)
+ op = ResOperation(rop.GUARD_NO_OVERFLOW, [])
op.setdescr(builder.getfaildescr())
op.setfailargs(fail_subset)
builder.loop.operations.append(op)
@@ -404,6 +404,13 @@
raise CannotProduceOperation
self.put(builder, [r.choice(builder.floatvars)])
+class ConstUnaryFloatOperation(UnaryFloatOperation):
+ def produce_into(self, builder, r):
+ if r.random() < 0.4:
+ UnaryFloatOperation.produce_into(self, builder, r)
+ else:
+ self.put(builder, [ConstFloat(r.random_float_storage())])
+
class CastIntToFloatOperation(AbstractFloatOperation):
def produce_into(self, builder, r):
self.put(builder, [r.choice(builder.intvars)])
@@ -429,9 +436,9 @@
class GuardOperation(AbstractOperation):
def gen_guard(self, builder, r):
v = builder.get_bool_var(r)
- op = ResOperation(self.opnum, [v], None)
- passing = ((self.opnum == rop.GUARD_TRUE and v.value) or
- (self.opnum == rop.GUARD_FALSE and not v.value))
+ op = ResOperation(self.opnum, [v])
+ passing = ((self.opnum == rop.GUARD_TRUE and v.getint()) or
+ (self.opnum == rop.GUARD_FALSE and not v.getint()))
return op, passing
def produce_into(self, builder, r):
@@ -448,9 +455,9 @@
if not builder.ptrvars:
raise CannotProduceOperation
box = r.choice(builder.ptrvars)[0]
- op = ResOperation(self.opnum, [box], None)
- passing = ((self.opnum == rop.GUARD_NONNULL and box.value) or
- (self.opnum == rop.GUARD_ISNULL and not box.value))
+ op = ResOperation(self.opnum, [box])
+ passing = ((self.opnum == rop.GUARD_NONNULL and box.getref_base()) or
+ (self.opnum == rop.GUARD_ISNULL and not box.getref_base()))
return op, passing
class GuardValueOperation(GuardOperation):
@@ -460,14 +467,14 @@
other = r.choice(builder.intvars)
else:
if r.random() < 0.75:
- value = v.value
+ value = v.getint()
elif r.random() < 0.5:
- value = v.value ^ 1
+ value = v.getint() ^ 1
else:
value = r.random_integer()
other = ConstInt(value)
- op = ResOperation(self.opnum, [v, other], None)
- return op, (v.value == other.value)
+ op = ResOperation(self.opnum, [v, other])
+ return op, (v.getint() == other.getint())
# ____________________________________________________________
@@ -516,7 +523,8 @@
OPERATIONS.append(UnaryOperation(rop.INT_IS_TRUE, boolres=True))
OPERATIONS.append(UnaryOperation(rop.INT_IS_ZERO, boolres=True))
-OPERATIONS.append(ConstUnaryOperation(rop.SAME_AS, boolres='sometimes'))
+OPERATIONS.append(ConstUnaryOperation(rop.SAME_AS_I, boolres='sometimes'))
+OPERATIONS.append(ConstUnaryFloatOperation(rop.SAME_AS_F))
OPERATIONS.append(SignExtOperation(rop.INT_SIGNEXT))
for _op in [rop.INT_ADD_OVF,
@@ -616,19 +624,19 @@
startvars = []
if cpu.supports_floats:
# pick up a single threshold for the whole 'inputargs', so
- # that some loops have no or mostly no BoxFloat while others
+ # that some loops have no or mostly no FLOATs while others
# have a lot of them
k = r.random()
- # but make sure there is at least one BoxInt
+ # but make sure there is at least one INT
at_least_once = r.randrange(0, pytest.config.option.n_vars)
else:
k = -1
at_least_once = 0
for i in range(pytest.config.option.n_vars):
if r.random() < k and i != at_least_once:
- startvars.append(BoxFloat(r.random_float_storage()))
+ startvars.append(InputArgFloat(r.random_float_storage()))
else:
- startvars.append(BoxInt(r.random_integer()))
+ startvars.append(InputArgInt(r.random_integer()))
allow_delay = True
else:
allow_delay = False
@@ -665,13 +673,13 @@
for i in range(position):
op = loop.operations[i]
if (not op.has_no_side_effect()
- or not isinstance(op.result, (BoxInt, BoxFloat))):
+ or op.type not in (INT, FLOAT)):
position = i
break # cannot move the LABEL later
randompos = r.randrange(0, len(self.startvars)+1)
- self.startvars.insert(randompos, op.result)
+ self.startvars.insert(randompos, op)
loop._targettoken = TargetToken()
- loop.operations.insert(position, ResOperation(rop.LABEL,
self.startvars, None,
+ loop.operations.insert(position, ResOperation(rop.LABEL,
self.startvars,
loop._targettoken))
def generate_ops(self, builder, r, loop, startvars, needs_a_label=False):
@@ -704,7 +712,7 @@
endvars.append(v)
r.shuffle(endvars)
endvars = endvars[:1]
- loop.operations.append(ResOperation(rop.FINISH, endvars, None,
+ loop.operations.append(ResOperation(rop.FINISH, endvars,
descr=builder.getfaildescr(is_finish=True)))
if builder.should_fail_by:
self.should_fail_by = builder.should_fail_by
@@ -716,7 +724,12 @@
endvars = self.get_fail_args()
self.expected = {}
for v in endvars:
- self.expected[v] = v.value
+ if v.type == INT:
+ self.expected[v] = v.getint()
+ elif v.type == FLOAT:
+ self.expected[v] = v.getfloatstorage()
+ else:
+ assert 0, v.type
def runjitcelltoken(self):
if self.startvars == self.loop.inputargs:
@@ -729,7 +742,7 @@
box = box.constbox()
args.append(box)
self.cpu.compile_loop(self.loop.inputargs,
- [ResOperation(rop.JUMP, args, None,
+ [ResOperation(rop.JUMP, args,
descr=self.loop._targettoken)],
self._initialjumploop_celltoken)
return self._initialjumploop_celltoken
@@ -744,7 +757,7 @@
def clear_state(self):
for v, S, fields in self.prebuilt_ptr_consts:
- container = v.value._obj.container
+ container = v.getref_base()._obj.container
for name, value in fields.items():
if isinstance(name, str):
setattr(container, name, value)
@@ -762,14 +775,21 @@
# exc = cpu.grab_exc_value()
# assert not exc
- arguments = [box.value for box in self.loop.inputargs]
+ arguments = []
+ for box in self.loop.inputargs:
+ if box.type == INT:
+ arguments.append(box.getint())
+ elif box.type == FLOAT:
+ arguments.append(box.getfloatstorage())
+ else:
+ assert 0, box.type
deadframe = cpu.execute_token(self.runjitcelltoken(), *arguments)
fail = cpu.get_latest_descr(deadframe)
do_assert(fail is self.should_fail_by.getdescr(),
"Got %r, expected %r" % (fail,
self.should_fail_by.getdescr()))
for i, v in enumerate(self.get_fail_args()):
- if isinstance(v, (BoxFloat, ConstFloat)):
+ if v.type == FLOAT:
value = cpu.get_float_value(deadframe, i)
else:
value = cpu.get_int_value(deadframe, i)
@@ -792,10 +812,9 @@
def exc_handling(guard_op):
# operations need to start with correct GUARD_EXCEPTION
if guard_op._exc_box is None:
- op = ResOperation(rop.GUARD_NO_EXCEPTION, [], None)
+ op = ResOperation(rop.GUARD_NO_EXCEPTION, [])
else:
- op = ResOperation(rop.GUARD_EXCEPTION, [guard_op._exc_box],
- BoxPtr())
+ op = ResOperation(rop.GUARD_EXCEPTION, [guard_op._exc_box])
op.setdescr(self.builder.getfaildescr())
op.setfailargs([])
return op
@@ -845,7 +864,14 @@
raise AssertionError(box.type)
subset.append(srcbox)
#
- args = [x.clonebox() for x in subset]
+ args = []
+ for x in subset:
+ if x.type == INT:
+ args.append(InputArgInt(x.getint()))
+ elif x.type == FLOAT:
+ args.append(InputArgFloat(x.getfloatstorage()))
+ else:
+ assert 0, x.type
rl = RandomLoop(self.builder.cpu, self.builder.fork,
r, args)
# done
@@ -854,7 +880,7 @@
assert len(rl.loop.inputargs) == len(args)
# The new bridge's execution will end normally at its FINISH.
# Just replace the FINISH with the JUMP to the new loop.
- jump_op = ResOperation(rop.JUMP, subset, None,
+ jump_op = ResOperation(rop.JUMP, subset,
descr=rl.loop._targettoken)
subloop.operations[-1] = jump_op
self.guard_op = rl.guard_op
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit