[pypy-commit] pypy result-in-resops: a bit of random progress and moving stuff around. Now all Box/Const/ResOperation
fijal
noreply at buildbot.pypy.org
Thu Sep 13 20:28:15 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57326:9357f1cff6b7
Date: 2012-09-13 20:27 +0200
http://bitbucket.org/pypy/pypy/changeset/9357f1cff6b7/
Log: a bit of random progress and moving stuff around. Now all
Box/Const/ResOperation live in resoperation.py, should be probably
named model.py
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -105,6 +105,7 @@
def compile_loop(metainterp, greenkey, start,
inputargs, jumpargs,
resume_at_jump_descr, full_preamble_needed=True):
+ XXX # requires a rewrite
"""Try to compile a new procedure by closing the current history back
to the first operation.
"""
@@ -498,7 +499,7 @@
assert guard_value_op.getopnum() == rop.GUARD_VALUE
box = guard_value_op.getarg(0)
try:
- i = guard_value_op.getfailargs().index(box)
+ i = guard_value_op.get_extra("failargs").index(box)
except ValueError:
return # xxx probably very rare
else:
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -53,216 +53,6 @@
def get_jitcode_for_class(self, oocls):
return self.jitcodes[oocls]
-
-class Box(AbstractValue):
- __slots__ = ()
- _extended_display = True
- _counter = 0
- is_box = True # hint that we want to make links in graphviz from this
-
- @staticmethod
- def _new(x):
- "NOT_RPYTHON"
- kind = getkind(lltype.typeOf(x))
- if kind == "int":
- intval = lltype.cast_primitive(lltype.Signed, x)
- return BoxInt(intval)
- elif kind == "ref":
- # XXX add ootype support?
- ptrval = lltype.cast_opaque_ptr(llmemory.GCREF, x)
- return BoxPtr(ptrval)
- elif kind == "float":
- return BoxFloat(longlong.getfloatstorage(x))
- else:
- raise NotImplementedError(kind)
-
- def nonconstbox(self):
- return self
-
- def __repr__(self):
- result = str(self)
- if self._extended_display:
- result += '(%s)' % self._getrepr_()
- return result
-
- def __str__(self):
- if not hasattr(self, '_str'):
- try:
- if self.type == INT:
- t = 'i'
- elif self.type == FLOAT:
- t = 'f'
- else:
- t = 'p'
- except AttributeError:
- t = 'b'
- self._str = '%s%d' % (t, Box._counter)
- Box._counter += 1
- return self._str
-
- def _get_str(self): # for debugging only
- return self.constbox()._get_str()
-
- def forget_value(self):
- raise NotImplementedError
-
- def is_constant(self):
- return False
-
-class BoxInt(Box):
- type = INT
- _attrs_ = ('value',)
-
- def __init__(self, value=0):
- if not we_are_translated():
- if is_valid_int(value):
- value = int(value) # bool -> int
- else:
- assert isinstance(value, Symbolic)
- self.value = value
-
- def forget_value(self):
- self.value = 0
-
- def clonebox(self):
- return BoxInt(self.value)
-
- def constbox(self):
- return ConstInt(self.value)
-
- def getint(self):
- return self.value
-
- def getaddr(self):
- return heaptracker.int2adr(self.value)
-
- def _get_hash_(self):
- return make_hashable_int(self.value)
-
- def nonnull(self):
- return self.value != 0
-
- def _getrepr_(self):
- return self.value
-
- def repr_rpython(self):
- return repr_rpython(self, 'bi')
-
-class BoxFloat(Box):
- type = FLOAT
- _attrs_ = ('value',)
-
- def __init__(self, valuestorage=longlong.ZEROF):
- assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
- self.value = valuestorage
-
- def forget_value(self):
- self.value = longlong.ZEROF
-
- def clonebox(self):
- return BoxFloat(self.value)
-
- def constbox(self):
- return ConstFloat(self.value)
-
- def getfloatstorage(self):
- return self.value
-
- def _get_hash_(self):
- return longlong.gethash(self.value)
-
- def nonnull(self):
- return self.value != longlong.ZEROF
-
- def _getrepr_(self):
- return self.getfloat()
-
- def repr_rpython(self):
- return repr_rpython(self, 'bf')
-
-class BoxPtr(Box):
- type = REF
- _attrs_ = ('value',)
-
- def __init__(self, value=lltype.nullptr(llmemory.GCREF.TO)):
- assert lltype.typeOf(value) == llmemory.GCREF
- self.value = value
-
- def forget_value(self):
- self.value = lltype.nullptr(llmemory.GCREF.TO)
-
- def clonebox(self):
- return BoxPtr(self.value)
-
- def constbox(self):
- return ConstPtr(self.value)
-
- def getref_base(self):
- return self.value
-
- def getref(self, PTR):
- return lltype.cast_opaque_ptr(PTR, self.getref_base())
- getref._annspecialcase_ = 'specialize:arg(1)'
-
- def getaddr(self):
- return llmemory.cast_ptr_to_adr(self.value)
-
- def _get_hash_(self):
- if self.value:
- return lltype.identityhash(self.value)
- else:
- return 0
-
- def nonnull(self):
- return bool(self.value)
-
- def repr_rpython(self):
- return repr_rpython(self, 'bp')
-
- _getrepr_ = repr_pointer
-
-NULLBOX = BoxPtr()
-
-
-class BoxObj(Box):
- type = REF
- _attrs_ = ('value',)
-
- def __init__(self, value=ootype.NULL):
- assert ootype.typeOf(value) is ootype.Object
- self.value = value
-
- def forget_value(self):
- self.value = ootype.NULL
-
- def clonebox(self):
- return BoxObj(self.value)
-
- def constbox(self):
- return ConstObj(self.value)
-
- def getref_base(self):
- return self.value
-
- def getref(self, OBJ):
- return ootype.cast_from_object(OBJ, self.getref_base())
- getref._annspecialcase_ = 'specialize:arg(1)'
-
- def _get_hash_(self):
- if self.value:
- return ootype.identityhash(self.value)
- else:
- return 0
-
- def nonnull(self):
- return bool(self.value)
-
- def repr_rpython(self):
- return repr_rpython(self, 'bo')
-
- _getrepr_ = repr_object
-
-
# ____________________________________________________________
diff --git a/pypy/jit/metainterp/inliner.py b/pypy/jit/metainterp/inliner.py
--- a/pypy/jit/metainterp/inliner.py
+++ b/pypy/jit/metainterp/inliner.py
@@ -1,3 +1,4 @@
+
from pypy.jit.metainterp.resoperation import Const
from pypy.jit.metainterp.resume import Snapshot
diff --git a/pypy/jit/metainterp/optimize.py b/pypy/jit/metainterp/optimize.py
--- a/pypy/jit/metainterp/optimize.py
+++ b/pypy/jit/metainterp/optimize.py
@@ -11,3 +11,6 @@
debug_print(msg)
debug_stop("jit-abort")
self.msg = msg
+
+def unroll_and_optimize_loop(loop, call_pure_results=None):
+ xxx
diff --git a/pypy/jit/metainterp/optimizeopt/__init__.py b/pypy/jit/metainterp/optimizeopt/__init__.py
--- a/pypy/jit/metainterp/optimizeopt/__init__.py
+++ b/pypy/jit/metainterp/optimizeopt/__init__.py
@@ -32,9 +32,7 @@
'please fix rlib/jit.py to say ENABLE_ALL_OPTS = %r' % (ALL_OPTS_NAMES,))
def build_opt_chain(metainterp_sd, enable_opts):
- config = metainterp_sd.config
optimizations = []
- enable_opts = {} # XXX
unroll = 'unroll' in enable_opts # 'enable_opts' is normally a dict
for name, opt in unroll_all_opts:
if name in enable_opts:
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
@@ -405,6 +405,7 @@
if constbox is None:
return box
if constbox.type == REF:
+ xxx
value = constbox.getref_base()
if not value:
return box
@@ -419,9 +420,10 @@
def getvalue(self, box):
box = self.getinterned(box)
try:
- value = self.values[box]
+ value = box.get_extra("optimize_value")
except KeyError:
- value = self.values[box] = OptValue(box)
+ value = OptValue(box)
+ box.set_extra("optimize_value", value)
self.ensure_imported(value)
return value
@@ -433,7 +435,7 @@
if isinstance(box, Const):
return box
try:
- value = self.values[box]
+ value = box.get_extra("optimize_value")
self.ensure_imported(value)
except KeyError:
return None
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
@@ -24,8 +24,7 @@
sb.add_potential(op)
def propagate_forward(self, op):
- args = self.optimizer.make_args_key(op)
- if self.find_rewritable_bool(op, args):
+ if self.find_rewritable_bool(op):
return
dispatch_opt(self, op)
@@ -45,25 +44,16 @@
return False
- def find_rewritable_bool(self, op, args):
- # XXXX
- return False
-
- try:
- oldopnum = opboolinvers[op.getopnum()]
- except KeyError:
- pass
- else:
+ def find_rewritable_bool(self, op):
+ oldopnum = opboolinvers[op.getopnum()]
+ if oldopnum != -1:
targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[0], args[1]],
None))
if self.try_boolinvers(op, targs):
return True
- try:
- oldopnum = opboolreflex[op.getopnum()] # FIXME: add INT_ADD, INT_MUL
- except KeyError:
- pass
- else:
+ oldopnum = opboolreflex[op.getopnum()] # FIXME: add INT_ADD, INT_MUL
+ if oldopnum != -1:
targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
None))
oldop = self.get_pure_result(targs)
@@ -71,11 +61,8 @@
self.make_equal_to(op, self.getvalue(oldop))
return True
- try:
- oldopnum = opboolinvers[opboolreflex[op.getopnum()]]
- except KeyError:
- pass
- else:
+ oldopnum = opboolinvers[opboolreflex[op.getopnum()]]
+ if oldopnum != -1:
targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
None))
if self.try_boolinvers(op, targs):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -359,7 +359,7 @@
self.metainterp_sd = metainterp_sd
self.original_greenkey = original_greenkey
def store_final_boxes(self, op, boxes):
- op.setfailargs(boxes)
+ op.set_extra("failargs", boxes)
def __eq__(self, other):
return type(self) is type(other) # xxx obscure
def clone_if_mutable(self):
@@ -397,15 +397,15 @@
assert equaloplists(optimized.operations,
expected.operations, False, remap, text_right)
- def _do_optimize_loop(self, loop, call_pure_results):
+ def _do_optimize_loop(self, loop):
from pypy.jit.metainterp.optimizeopt import optimize_trace
- from pypy.jit.metainterp.optimizeopt.util import args_dict
+ #from pypy.jit.metainterp.optimizeopt.util import args_dict
self.loop = loop
- loop.call_pure_results = args_dict()
- if call_pure_results is not None:
- for k, v in call_pure_results.items():
- loop.call_pure_results[list(k)] = v
+ #loop.call_pure_results = args_dict()
+ #if call_pure_results is not None:
+ # for k, v in call_pure_results.items():
+ # loop.call_pure_results[list(k)] = v
metainterp_sd = FakeMetaInterpStaticData(self.cpu)
if hasattr(self, 'vrefinfo'):
metainterp_sd.virtualref_info = self.vrefinfo
@@ -414,32 +414,35 @@
#
optimize_trace(metainterp_sd, loop, self.enable_opts)
- def unroll_and_optimize(self, loop, call_pure_results=None):
+ def unroll_and_optimize(self, loop):#, call_pure_results=None):
operations = loop.operations
jumpop = operations[-1]
assert jumpop.getopnum() == rop.JUMP
inputargs = loop.inputargs
- jump_args = jumpop.getarglist()[:]
+ jump_args = jumpop.getarglist()
operations = operations[:-1]
- cloned_operations = [op.clone() for op in operations]
preamble = TreeLoop('preamble')
preamble.inputargs = inputargs
preamble.resume_at_jump_descr = FakeDescrWithSnapshot()
- token = JitCellToken()
- preamble.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(token))] + \
- operations + \
- [ResOperation(rop.LABEL, jump_args, None, descr=token)]
- self._do_optimize_loop(preamble, call_pure_results)
+ token = JitCellToken()
+ preamble.operations = [create_resop(rop.LABEL, None, inputargs,
+ descr=TargetToken(token))] + \
+ operations + \
+ [create_resop(rop.LABEL, None, jump_args,
+ descr=token)]
+ self._do_optimize_loop(preamble)#, call_pure_results)
assert preamble.operations[-1].getopnum() == rop.LABEL
+ import pdb
+ pdb.set_trace()
inliner = Inliner(inputargs, jump_args)
loop.resume_at_jump_descr = preamble.resume_at_jump_descr
loop.operations = [preamble.operations[-1]] + \
- [inliner.inline_op(op, clone=False) for op in cloned_operations] + \
+ [inliner.inline_op(op) for op in cloned_operations] + \
[ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jump_args],
None, descr=token)]
#[inliner.inline_op(jumpop)]
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
@@ -85,37 +85,50 @@
# ____________________________________________________________
-def args_eq(args1, args2):
- make_sure_not_resized(args1)
- make_sure_not_resized(args2)
- if len(args1) != len(args2):
- return False
- for i in range(len(args1)):
- arg1 = args1[i]
- arg2 = args2[i]
- if arg1 is None:
- if arg2 is not None:
- return False
- elif not arg1.same_box(arg2):
- return False
- return True
+BUCKET_SIZE = 1000
-def args_hash(args):
- make_sure_not_resized(args)
- res = 0x345678
- for arg in args:
- if arg is None:
- y = 17
- else:
- y = arg._get_hash_()
- res = intmask((1000003 * res) ^ y)
- return res
+class ArgsDict(object):
+ """ An imprecise dict. If you look it up and it's there, it's correct,
+ however we don't care about collisions, so a colliding element can
+ kick someone else out
+ """
+ def __init__(self):
+ self.buckets = [None] * BUCKET_SIZE
-def args_dict():
- return r_dict(args_eq, args_hash)
+ def get(self, op):
+ hash = op.get_hash()
-def args_dict_box():
- return r_dict(args_eq, args_hash)
+# def args_eq(args1, args2):
+# make_sure_not_resized(args1)
+# make_sure_not_resized(args2)
+# if len(args1) != len(args2):
+# return False
+# for i in range(len(args1)):
+# arg1 = args1[i]
+# arg2 = args2[i]
+# if arg1 is None:
+# if arg2 is not None:
+# return False
+# elif not arg1.same_box(arg2):
+# return False
+# return True
+
+# def args_hash(args):
+# make_sure_not_resized(args)
+# res = 0x345678
+# for arg in args:
+# if arg is None:
+# y = 17
+# else:
+# y = arg._get_hash_()
+# res = intmask((1000003 * res) ^ y)
+# return res
+
+# def args_dict():
+# return r_dict(args_eq, args_hash)
+
+# def args_dict_box():
+# return r_dict(args_eq, args_hash)
# ____________________________________________________________
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
@@ -143,11 +143,6 @@
def _get_hash_(self):
return compute_identity_hash(self)
- # XXX the interface below has to be revisited
-
- def clonebox(self):
- raise NotImplementedError
-
def constbox(self):
raise NotImplementedError
@@ -223,27 +218,161 @@
raise NotImplementedError("type %s not supported" % TYPE)
getkind._annspecialcase_ = 'specialize:memo'
+def repr_pointer(box):
+ from pypy.rpython.lltypesystem import rstr
+ try:
+ T = box.value._obj.container._normalizedcontainer(check=False)._TYPE
+ if T is rstr.STR:
+ return repr(box._get_str())
+ return '*%s' % (T._name,)
+ except AttributeError:
+ return box.value
+
+class Box(AbstractValue):
+ __slots__ = ()
+ _counter = 0
+
+ def nonconstbox(self):
+ return self
+
+ def __repr__(self):
+ result = str(self)
+ if self._extended_display:
+ result += '(%s)' % self._getrepr_()
+ return result
+
+ def __str__(self):
+ if not hasattr(self, '_str'):
+ try:
+ if self.type == INT:
+ t = 'i'
+ elif self.type == FLOAT:
+ t = 'f'
+ else:
+ t = 'p'
+ except AttributeError:
+ t = 'b'
+ self._str = '%s%d' % (t, Box._counter)
+ Box._counter += 1
+ return self._str
+
+ def _get_str(self): # for debugging only
+ return self.constbox()._get_str()
+
+ def forget_value(self):
+ raise NotImplementedError
+
+ def is_constant(self):
+ return False
+
+class BoxInt(Box):
+ type = INT
+ _attrs_ = ('value',)
+
+ def __init__(self, value=0):
+ if not we_are_translated():
+ if is_valid_int(value):
+ value = int(value) # bool -> int
+ else:
+ assert isinstance(value, Symbolic)
+ self.value = value
+
+ def forget_value(self):
+ self.value = 0
+
+ def constbox(self):
+ return ConstInt(self.value)
+
+ def getint(self):
+ return self.value
+
+ def getaddr(self):
+ return heaptracker.int2adr(self.value)
+
+ def _get_hash_(self):
+ return make_hashable_int(self.value)
+
+ def nonnull(self):
+ return self.value != 0
+
+ def _getrepr_(self):
+ return self.value
+
+ def repr_rpython(self):
+ return repr_rpython(self, 'bi')
+
+class BoxFloat(Box):
+ type = FLOAT
+ _attrs_ = ('value',)
+
+ def __init__(self, valuestorage=longlong.ZEROF):
+ assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
+ self.value = valuestorage
+
+ def forget_value(self):
+ self.value = longlong.ZEROF
+
+ def constbox(self):
+ return ConstFloat(self.value)
+
+ def getfloatstorage(self):
+ return self.value
+
+ def _get_hash_(self):
+ return longlong.gethash(self.value)
+
+ def nonnull(self):
+ return self.value != longlong.ZEROF
+
+ def _getrepr_(self):
+ return self.getfloat()
+
+ def repr_rpython(self):
+ return repr_rpython(self, 'bf')
+
+class BoxPtr(Box):
+ type = REF
+ _attrs_ = ('value',)
+
+ def __init__(self, value=lltype.nullptr(llmemory.GCREF.TO)):
+ assert lltype.typeOf(value) == llmemory.GCREF
+ self.value = value
+
+ def forget_value(self):
+ self.value = lltype.nullptr(llmemory.GCREF.TO)
+
+ def constbox(self):
+ return ConstPtr(self.value)
+
+ def getref_base(self):
+ return self.value
+
+ def getref(self, PTR):
+ return lltype.cast_opaque_ptr(PTR, self.getref_base())
+ getref._annspecialcase_ = 'specialize:arg(1)'
+
+ def getaddr(self):
+ return llmemory.cast_ptr_to_adr(self.value)
+
+ def _get_hash_(self):
+ if self.value:
+ return lltype.identityhash(self.value)
+ else:
+ return 0
+
+ def nonnull(self):
+ return bool(self.value)
+
+ def repr_rpython(self):
+ return repr_rpython(self, 'bp')
+
+ _getrepr_ = repr_pointer
+
+NULLBOX = BoxPtr()
+
class Const(AbstractValue):
__slots__ = ()
- @staticmethod
- def _new(x):
- "NOT_RPYTHON"
- T = lltype.typeOf(x)
- kind = getkind(T)
- if kind == "int":
- if isinstance(T, lltype.Ptr):
- intval = heaptracker.adr2int(llmemory.cast_ptr_to_adr(x))
- else:
- intval = lltype.cast_primitive(lltype.Signed, x)
- return ConstInt(intval)
- elif kind == "ref":
- return cpu.ts.new_ConstRef(x)
- elif kind == "float":
- return ConstFloat(longlong.getfloatstorage(x))
- else:
- raise NotImplementedError(kind)
-
def constbox(self):
return self
@@ -264,16 +393,6 @@
compute_unique_id(box))
-def repr_pointer(box):
- from pypy.rpython.lltypesystem import rstr
- try:
- T = box.value._obj.container._normalizedcontainer(check=False)._TYPE
- if T is rstr.STR:
- return repr(box._get_str())
- return '*%s' % (T._name,)
- except AttributeError:
- return box.value
-
def repr_object(box):
try:
TYPE = box.value.obj._TYPE
@@ -312,12 +431,9 @@
assert isinstance(value, Symbolic)
self.value = value
- def clonebox(self):
- from pypy.jit.metainterp.history import BoxInt
+ def nonconstbox(self):
return BoxInt(self.value)
- nonconstbox = clonebox
-
def getint(self):
return self.value
@@ -353,12 +469,9 @@
assert lltype.typeOf(valuestorage) is longlong.FLOATSTORAGE
self.value = valuestorage
- def clonebox(self):
- from pypy.jit.metainterp.history import BoxFloat
+ def nonconstbox(self):
return BoxFloat(self.value)
- nonconstbox = clonebox
-
def getfloatstorage(self):
return self.value
@@ -390,12 +503,9 @@
assert lltype.typeOf(value) == llmemory.GCREF
self.value = value
- def clonebox(self):
- from pypy.jit.metainterp.history import BoxPtr
+ def nonconstbox(self):
return BoxPtr(self.value)
- nonconstbox = clonebox
-
def getref_base(self):
return self.value
@@ -436,57 +546,6 @@
CONST_NULL = ConstPtr(ConstPtr.value)
-class ConstObj(Const):
- type = REF
- value = ootype.NULL
- _attrs_ = ('value',)
-
- def __init__(self, value):
- assert ootype.typeOf(value) is ootype.Object
- self.value = value
-
- def clonebox(self):
- from pypy.jit.metainterp.history import BoxObj
- return BoxObj(self.value)
-
- nonconstbox = clonebox
-
- def getref_base(self):
- return self.value
-
- def getref(self, OBJ):
- return ootype.cast_from_object(OBJ, self.getref_base())
- getref._annspecialcase_ = 'specialize:arg(1)'
-
- def _get_hash_(self):
- if self.value:
- return ootype.identityhash(self.value)
- else:
- return 0
-
-## def getaddr(self):
-## # so far this is used only when calling
-## # CodeWriter.IndirectCallset.bytecode_for_address. We don't need a
-## # real addr, but just a key for the dictionary
-## return self.value
-
- def same_constant(self, other):
- if isinstance(other, ConstObj):
- return self.value == other.value
- return False
-
- def nonnull(self):
- return bool(self.value)
-
- _getrepr_ = repr_object
-
- def repr_rpython(self):
- return repr_rpython(self, 'co')
-
- def _get_str(self): # for debugging only
- from pypy.rpython.annlowlevel import hlstr
- return hlstr(ootype.cast_from_object(ootype.String, self.value))
-
class AbstractResOp(AbstractValue):
"""The central ResOperation class, representing one operation."""
@@ -500,6 +559,8 @@
'valid from optimizations (store_final_args) until '
'the backend',
'llgraph_var2index': 'llgraph internal attribute',
+ 'optimize_value': 'value replacement for the optimizer. only valid for'
+ ' the length of optimization pass',
}
extras = None
@@ -529,6 +590,9 @@
return cls.opnum
def __hash__(self):
+ import sys
+ if sys._getframe(1).f_code.co_filename.endswith('resume.py'):
+ return object.__hash__(self)
raise Exception("Should not hash resops, use get/set extra instead")
# methods implemented by the arity mixins
@@ -1308,7 +1372,7 @@
setup(__name__ == '__main__') # print out the table when run directly
del _oplist
-opboolinvers = {
+_opboolinvers = {
rop.INT_EQ: rop.INT_NE,
rop.INT_NE: rop.INT_EQ,
rop.INT_LT: rop.INT_GE,
@@ -1332,7 +1396,7 @@
rop.PTR_NE: rop.PTR_EQ,
}
-opboolreflex = {
+_opboolreflex = {
rop.INT_EQ: rop.INT_EQ,
rop.INT_NE: rop.INT_NE,
rop.INT_LT: rop.INT_GT,
@@ -1355,3 +1419,10 @@
rop.PTR_EQ: rop.PTR_EQ,
rop.PTR_NE: rop.PTR_NE,
}
+
+opboolinvers = [-1] * len(opclasses)
+opboolreflex = [-1] * len(opclasses)
+for k, v in _opboolreflex.iteritems():
+ opboolreflex[k] = v
+for k, v in _opboolinvers.iteritems():
+ opboolinvers[k] = v
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -23,11 +23,9 @@
self.initarglist(args)
self.setdescr(descr)
- def getopnum(self):
- return self.OPNUM
-
- def clone(self):
- return ESCAPE_OP(self.OPNUM, self.getarglist()[:], self.result, self.getdescr())
+ @classmethod
+ def getopnum(cls):
+ return cls.OPNUM
class FORCE_SPILL(UnaryOp, ResOpNone, PlainResOp):
More information about the pypy-commit
mailing list