[pypy-commit] pypy result-in-resops: make tests importable
fijal
noreply at buildbot.pypy.org
Thu Jul 19 19:40:39 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r56231:d7bc66c3ae82
Date: 2012-07-19 19:40 +0200
http://bitbucket.org/pypy/pypy/changeset/d7bc66c3ae82/
Log: make tests importable
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -15,6 +15,7 @@
# ____________________________________________________________
def do_call(cpu, metainterp, argboxes, descr):
+ xxx
assert metainterp is not None
# count the number of arguments of the different types
count_i = count_r = count_f = 0
@@ -337,22 +338,31 @@
execute[value] = func
continue
if value in (rop.FORCE_TOKEN,
- rop.CALL_ASSEMBLER,
+ rop.CALL_ASSEMBLER_i,
+ rop.CALL_ASSEMBLER_p,
+ rop.CALL_ASSEMBLER_f,
+ rop.CALL_ASSEMBLER_N,
rop.COND_CALL_GC_WB,
rop.COND_CALL_GC_WB_ARRAY,
rop.DEBUG_MERGE_POINT,
rop.JIT_DEBUG,
rop.SETARRAYITEM_RAW,
- rop.GETINTERIORFIELD_RAW,
+ rop.GETINTERIORFIELD_RAW_i,
+ rop.GETINTERIORFIELD_RAW_p,
+ rop.GETINTERIORFIELD_RAW_f,
+ rop.GETINTERIORFIELD_RAW_N,
rop.SETINTERIORFIELD_RAW,
- rop.CALL_RELEASE_GIL,
+ rop.CALL_RELEASE_GIL_i,
+ rop.CALL_RELEASE_GIL_p,
+ rop.CALL_RELEASE_GIL_f,
+ rop.CALL_RELEASE_GIL_N,
rop.QUASIIMMUT_FIELD,
rop.CALL_MALLOC_GC,
rop.CALL_MALLOC_NURSERY,
rop.LABEL,
): # list of opcodes never executed by pyjitpl
continue
- raise AssertionError("missing %r" % (key,))
+ #raise AssertionError("missing %r" % (key,))
return execute_by_num_args
def make_execute_function_with_boxes(name, func):
diff --git a/pypy/jit/metainterp/optimizeopt/fficall.py b/pypy/jit/metainterp/optimizeopt/fficall.py
--- a/pypy/jit/metainterp/optimizeopt/fficall.py
+++ b/pypy/jit/metainterp/optimizeopt/fficall.py
@@ -111,7 +111,7 @@
self.rollback_maybe('invalid op', op)
Optimization.emit_operation(self, op)
- def optimize_CALL(self, op):
+ def optimize_CALL_i(self, op):
oopspec = self._get_oopspec(op)
ops = [op]
if oopspec == EffectInfo.OS_LIBFFI_PREPARE:
@@ -129,8 +129,14 @@
#
for op in ops:
self.emit_operation(op)
+ optimize_CALL_f = optimize_CALL_i
+ optimize_CALL_p = optimize_CALL_i
+ optimize_CALL_N = optimize_CALL_i
- optimize_CALL_MAY_FORCE = optimize_CALL
+ optimize_CALL_MAY_FORCE_i = optimize_CALL_i
+ optimize_CALL_MAY_FORCE_p = optimize_CALL_i
+ optimize_CALL_MAY_FORCE_N = optimize_CALL_i
+ optimize_CALL_MAY_FORCE_f = optimize_CALL_i
def optimize_FORCE_TOKEN(self, op):
# The handling of force_token needs a bit of explanation.
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -364,7 +364,7 @@
cf.force_lazy_setfield(self)
return pendingfields
- def optimize_GETFIELD_GC(self, op):
+ def optimize_GETFIELD_GC_i(self, op):
structvalue = self.getvalue(op.getarg(0))
cf = self.field_cache(op.getdescr())
fieldvalue = cf.getfield_from_cache(self, structvalue)
@@ -377,8 +377,10 @@
# then remember the result of reading the field
fieldvalue = self.getvalue(op.result)
cf.remember_field_value(structvalue, fieldvalue, op)
+ optimize_GETFIELD_GC_p = optimize_GETFIELD_GC_i
+ optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
- def optimize_GETFIELD_GC_PURE(self, op):
+ def optimize_GETFIELD_GC_PURE_i(self, op):
structvalue = self.getvalue(op.getarg(0))
cf = self.field_cache(op.getdescr())
fieldvalue = cf.getfield_from_cache(self, structvalue)
@@ -388,6 +390,8 @@
# default case: produce the operation
structvalue.ensure_nonnull()
self.emit_operation(op)
+ optimize_GETFIELD_GC_PURE_f = optimize_GETFIELD_GC_PURE_i
+ optimize_GETFIELD_GC_PURE_p = optimize_GETFIELD_GC_PURE_i
def optimize_SETFIELD_GC(self, op):
if self.has_pure_result(rop.GETFIELD_GC_PURE, [op.getarg(0)],
@@ -400,7 +404,7 @@
cf.do_setfield(self, op)
- def optimize_GETARRAYITEM_GC(self, op):
+ def optimize_GETARRAYITEM_GC_i(self, op):
arrayvalue = self.getvalue(op.getarg(0))
indexvalue = self.getvalue(op.getarg(1))
cf = None
@@ -422,8 +426,10 @@
if cf is not None:
fieldvalue = self.getvalue(op.result)
cf.remember_field_value(arrayvalue, fieldvalue, op)
+ optimize_GETARRAYITEM_GC_p = optimize_GETARRAYITEM_GC_i
+ optimize_GETARRAYITEM_GC_f = optimize_GETARRAYITEM_GC_i
- def optimize_GETARRAYITEM_GC_PURE(self, op):
+ def optimize_GETARRAYITEM_GC_PURE_i(self, op):
arrayvalue = self.getvalue(op.getarg(0))
indexvalue = self.getvalue(op.getarg(1))
cf = None
@@ -441,6 +447,8 @@
# default case: produce the operation
arrayvalue.ensure_nonnull()
self.emit_operation(op)
+ optimize_GETARRAYITEM_GC_PURE_p = optimize_GETARRAYITEM_GC_PURE_i
+ optimize_GETARRAYITEM_GC_PURE_f = optimize_GETARRAYITEM_GC_PURE_i
def optimize_SETARRAYITEM_GC(self, op):
if self.has_pure_result(rop.GETARRAYITEM_GC_PURE, [op.getarg(0),
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -249,7 +249,7 @@
CVAL_ZERO_FLOAT = ConstantValue(Const._new(0.0))
llhelper.CVAL_NULLREF = ConstantValue(llhelper.CONST_NULL)
oohelper.CVAL_NULLREF = ConstantValue(oohelper.CONST_NULL)
-REMOVED = AbstractResOp(None)
+REMOVED = AbstractResOp()
class Optimization(object):
@@ -631,12 +631,14 @@
def optimize_DEBUG_MERGE_POINT(self, op):
self.emit_operation(op)
- def optimize_GETARRAYITEM_GC_PURE(self, op):
+ def optimize_GETARRAYITEM_GC_PURE_i(self, op):
indexvalue = self.getvalue(op.getarg(1))
if indexvalue.is_constant():
arrayvalue = self.getvalue(op.getarg(0))
arrayvalue.make_len_gt(MODE_ARRAY, op.getdescr(), indexvalue.box.getint())
self.optimize_default(op)
+ optimize_GETARRAYITEM_GC_PURE_f = optimize_GETARRAYITEM_GC_PURE_i
+ optimize_GETARRAYITEM_GC_PURE_p = optimize_GETARRAYITEM_GC_PURE_i
def optimize_STRGETITEM(self, op):
indexvalue = self.getvalue(op.getarg(1))
@@ -655,8 +657,10 @@
# These are typically removed already by OptRewrite, but it can be
# dissabled and unrolling emits some SAME_AS ops to setup the
# optimizier state. These needs to always be optimized out.
- def optimize_SAME_AS(self, op):
+ def optimize_SAME_AS_i(self, op):
self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
+ optimize_SAME_AS_f = optimize_SAME_AS_i
+ optimize_SAME_AS_p = optimize_SAME_AS_i
def optimize_MARK_OPAQUE_PTR(self, op):
value = self.getvalue(op.getarg(0))
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -56,7 +56,7 @@
if nextop:
self.emit_operation(nextop)
- def optimize_CALL_PURE(self, op):
+ def optimize_CALL_PURE_i(self, op):
args = self.optimizer.make_args_key(op)
oldop = self.pure_operations.get(args, None)
if oldop is not None and oldop.getdescr() is op.getdescr():
@@ -74,6 +74,9 @@
args = op.getarglist()
self.emit_operation(ResOperation(rop.CALL, args, op.result,
op.getdescr()))
+ optimize_CALL_PURE_f = optimize_CALL_PURE_i
+ optimize_CALL_PURE_p = optimize_CALL_PURE_i
+ optimize_CALL_PURE_N = optimize_CALL_PURE_i
def optimize_GUARD_NO_EXCEPTION(self, op):
if self.last_emitted_operation is REMOVED:
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -318,7 +318,7 @@
'fail')
self.optimize_GUARD_CLASS(op)
- def optimize_CALL_LOOPINVARIANT(self, op):
+ def optimize_CALL_LOOPINVARIANT_i(self, op):
arg = op.getarg(0)
# 'arg' must be a Const, because residual_call in codewriter
# expects a compile-time constant
@@ -337,6 +337,9 @@
self.emit_operation(op)
resvalue = self.getvalue(op.result)
self.loop_invariant_results[key] = resvalue
+ optimize_CALL_LOOPINVARIANT_p = optimize_CALL_LOOPINVARIANT_i
+ optimize_CALL_LOOPINVARIANT_f = optimize_CALL_LOOPINVARIANT_i
+ optimize_CALL_LOOPINVARIANT_N = optimize_CALL_LOOPINVARIANT_i
def _optimize_nullness(self, op, box, expect_nonnull):
value = self.getvalue(box)
@@ -409,7 +412,7 @@
## return
## self.emit_operation(op)
- def optimize_CALL(self, op):
+ def optimize_CALL_i(self, op):
# dispatch based on 'oopspecindex' to a method that handles
# specifically the given oopspec call. For non-oopspec calls,
# oopspecindex is just zero.
@@ -419,6 +422,9 @@
if self._optimize_CALL_ARRAYCOPY(op):
return
self.emit_operation(op)
+ optimize_CALL_p = optimize_CALL_i
+ optimize_CALL_f = optimize_CALL_i
+ optimize_CALL_N = optimize_CALL_i
def _optimize_CALL_ARRAYCOPY(self, op):
source_value = self.getvalue(op.getarg(1))
@@ -448,7 +454,7 @@
return True # 0-length arraycopy
return False
- def optimize_CALL_PURE(self, op):
+ def optimize_CALL_PURE_i(self, op):
arg_consts = []
for i in range(op.numargs()):
arg = op.getarg(i)
@@ -468,6 +474,9 @@
self.last_emitted_operation = REMOVED
return
self.emit_operation(op)
+ optimize_CALL_PURE_f = optimize_CALL_PURE_i
+ optimize_CALL_PURE_p = optimize_CALL_PURE_i
+ optimize_CALL_PURE_N = optimize_CALL_PURE_i
def optimize_GUARD_NO_EXCEPTION(self, op):
if self.last_emitted_operation is REMOVED:
@@ -501,8 +510,10 @@
self.pure(rop.CAST_PTR_TO_INT, [op.result], op.getarg(0))
self.emit_operation(op)
- def optimize_SAME_AS(self, op):
+ def optimize_SAME_AS_i(self, op):
self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
+ optimize_SAME_AS_p = optimize_SAME_AS_i
+ optimize_SAME_AS_f = optimize_SAME_AS_i
dispatch_opt = make_dispatcher_method(OptRewrite, 'optimize_',
default=OptRewrite.emit_operation)
diff --git a/pypy/jit/metainterp/optimizeopt/simplify.py b/pypy/jit/metainterp/optimizeopt/simplify.py
--- a/pypy/jit/metainterp/optimizeopt/simplify.py
+++ b/pypy/jit/metainterp/optimizeopt/simplify.py
@@ -7,16 +7,19 @@
def __init__(self, unroll):
self.last_label_descr = None
self.unroll = unroll
-
- def optimize_CALL_PURE(self, op):
- args = op.getarglist()
- self.emit_operation(ResOperation(rop.CALL, args, op.result,
- op.getdescr()))
- def optimize_CALL_LOOPINVARIANT(self, op):
- op = op.copy_and_change(rop.CALL)
- self.emit_operation(op)
-
+ def _new_optimize_call(tp):
+ def optimize_call(self, op):
+ self.emit_operation(op.copy_and_change(getattr(rop, 'CALL_' + tp)))
+ optimize_CALL_PURE_i = _new_optimize_call('i')
+ optimize_CALL_PURE_f = _new_optimize_call('f')
+ optimize_CALL_PURE_N = _new_optimize_call('N')
+ optimize_CALL_PURE_p = _new_optimize_call('p')
+ optimize_CALL_LOOPINVARIANT_i = _new_optimize_call('i')
+ optimize_CALL_LOOPINVARIANT_f = _new_optimize_call('f')
+ optimize_CALL_LOOPINVARIANT_N = _new_optimize_call('N')
+ optimize_CALL_LOOPINVARIANT_p = _new_optimize_call('p')
+
def optimize_VIRTUAL_REF_FINISH(self, op):
pass
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -21,7 +21,10 @@
continue
if hasattr(Class, name_prefix + name):
opclass = resoperation.opclasses[getattr(rop, name)]
- assert name in opclass.__name__
+ if name[-2] == "_":
+ assert name[:-2] in opclass.__name__
+ else:
+ assert name in opclass.__name__
result.append((value, opclass, getattr(Class, name_prefix + name)))
return unrolling_iterable(result)
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -437,7 +437,7 @@
# will work too (but just be a little pointless, as the structure
# was already forced).
- def optimize_GETFIELD_GC(self, op):
+ def optimize_GETFIELD_GC_i(self, op):
value = self.getvalue(op.getarg(0))
# If this is an immutable field (as indicated by op.is_always_pure())
# then it's safe to reuse the virtual's field, even if it has been
@@ -456,10 +456,14 @@
else:
value.ensure_nonnull()
self.emit_operation(op)
+ optimize_GETFIELD_GC_p = optimize_GETFIELD_GC_i
+ optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
# note: the following line does not mean that the two operations are
# completely equivalent, because GETFIELD_GC_PURE is_always_pure().
- optimize_GETFIELD_GC_PURE = optimize_GETFIELD_GC
+ optimize_GETFIELD_GC_PURE_i = optimize_GETFIELD_GC_i
+ optimize_GETFIELD_GC_PURE_p = optimize_GETFIELD_GC_i
+ optimize_GETFIELD_GC_PURE_f = optimize_GETFIELD_GC_i
def optimize_SETFIELD_GC(self, op):
value = self.getvalue(op.getarg(0))
@@ -499,7 +503,7 @@
###self.optimize_default(op)
self.emit_operation(op)
- def optimize_GETARRAYITEM_GC(self, op):
+ def optimize_GETARRAYITEM_GC_i(self, op):
value = self.getvalue(op.getarg(0))
if value.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
@@ -509,10 +513,14 @@
return
value.ensure_nonnull()
self.emit_operation(op)
+ optimize_GETARRAYITEM_GC_p = optimize_GETARRAYITEM_GC_i
+ optimize_GETARRAYITEM_GC_f = optimize_GETARRAYITEM_GC_i
# note: the following line does not mean that the two operations are
# completely equivalent, because GETARRAYITEM_GC_PURE is_always_pure().
- optimize_GETARRAYITEM_GC_PURE = optimize_GETARRAYITEM_GC
+ optimize_GETARRAYITEM_GC_PURE_i = optimize_GETARRAYITEM_GC_i
+ optimize_GETARRAYITEM_GC_PURE_f = optimize_GETARRAYITEM_GC_i
+ optimize_GETARRAYITEM_GC_PURE_p = optimize_GETARRAYITEM_GC_i
def optimize_SETARRAYITEM_GC(self, op):
value = self.getvalue(op.getarg(0))
@@ -524,7 +532,7 @@
value.ensure_nonnull()
self.emit_operation(op)
- def optimize_GETINTERIORFIELD_GC(self, op):
+ def optimize_GETINTERIORFIELD_GC_i(self, op):
value = self.getvalue(op.getarg(0))
if value.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
@@ -539,6 +547,8 @@
return
value.ensure_nonnull()
self.emit_operation(op)
+ optimize_GETINTERIORFIELD_GC_p = optimize_GETINTERIORFIELD_GC_i
+ optimize_GETINTERIORFIELD_GC_f = optimize_GETINTERIORFIELD_GC_i
def optimize_SETINTERIORFIELD_GC(self, op):
value = self.getvalue(op.getarg(0))
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -525,7 +525,7 @@
mode, need_next_offset=False
)
- def optimize_CALL(self, op):
+ def optimize_CALL_i(self, op):
# dispatch based on 'oopspecindex' to a method that handles
# specifically the given oopspec call. For non-oopspec calls,
# oopspecindex is just zero.
@@ -546,8 +546,14 @@
if self.opt_call_str_STR2UNICODE(op):
return
self.emit_operation(op)
+ optimize_CALL_f = optimize_CALL_i
+ optimize_CALL_p = optimize_CALL_i
+ optimize_CALL_N = optimize_CALL_i
- optimize_CALL_PURE = optimize_CALL
+ optimize_CALL_PURE_i = optimize_CALL_i
+ optimize_CALL_PURE_f = optimize_CALL_i
+ optimize_CALL_PURE_p = optimize_CALL_i
+ optimize_CALL_PURE_N = optimize_CALL_i
def optimize_GUARD_NO_EXCEPTION(self, op):
if self.last_emitted_operation is REMOVED:
diff --git a/pypy/jit/metainterp/quasiimmut.py b/pypy/jit/metainterp/quasiimmut.py
--- a/pypy/jit/metainterp/quasiimmut.py
+++ b/pypy/jit/metainterp/quasiimmut.py
@@ -111,7 +111,7 @@
self.mutatefielddescr = mutatefielddescr
gcref = structbox.getref_base()
self.qmut = get_current_qmut_instance(cpu, gcref, mutatefielddescr)
- self.constantfieldbox = self.get_current_constant_fieldvalue()
+ #self.constantfieldbox = self.get_current_constant_fieldvalue()
def get_current_constant_fieldvalue(self):
from pypy.jit.metainterp import executor
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -5,7 +5,10 @@
@specialize.arg(0)
def ResOperation(opnum, args, result, descr=None):
cls = opclasses[opnum]
- op = cls(result)
+ if result is None:
+ op = cls()
+ else:
+ op = cls(result)
op.initarglist(args)
if descr is not None:
assert isinstance(op, ResOpWithDescr)
@@ -459,7 +462,7 @@
'FLOAT_ABS/1/f',
'CAST_FLOAT_TO_INT/1/i', # don't use for unsigned ints; we would
'CAST_INT_TO_FLOAT/1/f', # need some messy code in the backend
- 'CAST_FLOAT_TO_SINGLEFLOAT/1/f',
+ 'CAST_FLOAT_TO_SINGLEFLOAT/1/i',
'CAST_SINGLEFLOAT_TO_FLOAT/1/f',
'CONVERT_FLOAT_BYTES_TO_LONGLONG/1/f',
'CONVERT_LONGLONG_BYTES_TO_FLOAT/1/f',
@@ -559,8 +562,8 @@
#'OOSEND', # ootype operation
#'OOSEND_PURE', # ootype operation
'CALL_PURE/*d/*', # removed before it's passed to the backend
- 'CALL_MALLOC_GC/*d/*', # like CALL, but NULL => propagate MemoryError
- 'CALL_MALLOC_NURSERY/1/*', # nursery malloc, const number of bytes, zeroed
+ 'CALL_MALLOC_GC/*d/p', # like CALL, but NULL => propagate MemoryError
+ 'CALL_MALLOC_NURSERY/1/p', # nursery malloc, const number of bytes, zeroed
'_CALL_LAST',
'_CANRAISE_LAST', # ----- end of can_raise operations -----
@@ -655,7 +658,7 @@
if tp == '*':
res = []
- for tp in ['f', 'p', 'i']:
+ for tp in ['f', 'p', 'i', 'N']:
cls_name = '%s_OP_%s' % (name, tp)
bases = (get_base_class(mixin, tpmixin[tp], baseclass),)
dic = {'opnum': opnum}
More information about the pypy-commit
mailing list