[pypy-commit] pypy remove-globals-in-jit: tweak tweak
arigo
noreply at buildbot.pypy.org
Fri Nov 9 16:30:04 CET 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: remove-globals-in-jit
Changeset: r58808:62528f66db7a
Date: 2012-11-08 14:06 +0100
http://bitbucket.org/pypy/pypy/changeset/62528f66db7a/
Log: tweak tweak
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -2,8 +2,8 @@
from pypy.jit.backend import model
from pypy.jit.backend.llgraph import support
from pypy.jit.metainterp.history import AbstractDescr
-from pypy.jit.metainterp.resoperation import Const, getkind
-from pypy.jit.metainterp.resoperation import INT, REF, FLOAT, VOID, FLOAT_SIZE
+from pypy.jit.metainterp.history import Const, getkind
+from pypy.jit.metainterp.history import INT, REF, FLOAT, VOID
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.codewriter import longlong, heaptracker
from pypy.jit.codewriter.effectinfo import EffectInfo
@@ -22,13 +22,6 @@
# We need to clone the list of operations because the
# front-end will mutate them under our feet again. We also
# need to make sure things get freed.
-
- # XXX for now
- for op in inputargs + operations:
- assert op.type == VOID or op._varindex >= 0
- self.operations = operations
- self.inputargs = inputargs
- return
def mapping(box, _cache={}):
if isinstance(box, Const) or box is None:
return box
@@ -49,24 +42,26 @@
map(mapping, op.getarglist()),
mapping(op.result),
newdescr)
+ if op.getfailargs() is not None:
+ newop.setfailargs(map(mapping, op.getfailargs()))
self.operations.append(newop)
class WeakrefDescr(AbstractDescr):
def __init__(self, realdescr):
self.realdescrref = weakref.ref(realdescr)
-class GuardFailed(Exception):
- def __init__(self, descr):
- self.descr = descr
+ def getrealdescr(self):
+ realdescr = self.realdescrref()
+ assert realdescr is not None, "the descr disappeared: %r" % (op,)
+ return realdescr
class ExecutionFinished(Exception):
- def __init__(self, descr, arg):
- self.descr = descr
- self.arg = arg
+ def __init__(self, deadframe):
+ self.deadframe = deadframe
class Jump(Exception):
- def __init__(self, descr, args):
- self.descr = descr
+ def __init__(self, jump_target, args):
+ self.jump_target = jump_target
self.args = args
class CallDescr(AbstractDescr):
@@ -163,18 +158,6 @@
def is_float_field(self):
return getkind(self.FIELD) == 'float'
-class JFDescrDescr(AbstractDescr):
- def is_pointer_field(self):
- return True
-
-class JFValueDescr(AbstractDescr):
- def __init__(self, kind):
- self.kind = kind
- def is_pointer_field(self):
- return self.kind == 'ref'
- def is_float_field(self):
- return self.kind == 'float'
-
_example_res = {'v': None,
'r': lltype.nullptr(llmemory.GCREF.TO),
'i': 0,
@@ -187,12 +170,6 @@
supports_singlefloats = True
translate_support_code = False
- JITFRAMEPTR = llmemory.GCREF
-
- jfdescr_for_int = JFValueDescr('int')
- jfdescr_for_ref = JFValueDescr('ref')
- jfdescr_for_float = JFValueDescr('float')
-
def __init__(self, rtyper, stats=None, *ignored_args, **ignored_kwds):
model.AbstractCPU.__init__(self)
self.rtyper = rtyper
@@ -201,7 +178,6 @@
class MiniStats:
pass
self.stats = stats or MiniStats()
- self.TOKEN_TRACING_RESCALL = NotAFrame()
def compile_loop(self, inputargs, operations, looptoken, log=True, name=''):
clt = model.CompiledLoopToken(self, looptoken.number)
@@ -258,51 +234,47 @@
frame.execute(lltrace)
assert False
except ExecutionFinished, e:
- frame.finish_value = e.arg
- frame.latest_descr = e.descr
- frame._fast_path_done = e.descr.fast_path_done
- return frame
- except GuardFailed, e:
- frame.latest_descr = e.descr
- return frame
+ return e.deadframe
- def get_frame_value_int(self, frame, index):
- return frame.framecontent[index]
- get_frame_value_float = get_frame_value_int
- get_frame_value_ref = get_frame_value_int
+ def get_latest_value_int(self, deadframe, index):
+ v = deadframe._values[index]
+ assert isinstance(v, int)
+ return v
- def get_latest_descr(self, frame):
- return frame.latest_descr
+ def get_latest_value_ref(self, deadframe, index):
+ v = deadframe._values[index]
+ assert lltype.typeOf(v) == llmemory.GCREF
+ return v
- def grab_exc_value(self, frame):
- if frame.last_exception is not None:
- result = frame.last_exception.args[1]
+ def get_latest_value_float(self, deadframe, index):
+ v = deadframe._values[index]
+ assert lltype.typeOf(v) == longlong.FLOATSTORAGE
+ return v
+
+ def get_latest_descr(self, deadframe):
+ return deadframe._latest_descr
+
+ def get_latest_value_count(self, deadframe):
+ return len(deadframe._values)
+
+ def grab_exc_value(self, deadframe):
+ if deadframe._last_exception is not None:
+ result = deadframe._last_exception.args[1]
gcref = lltype.cast_opaque_ptr(llmemory.GCREF, result)
else:
gcref = lltype.nullptr(llmemory.GCREF.TO)
- frame.last_exception = None
return gcref
- def force(self, frame):
+ def force(self, force_token):
+ xxxx
assert not frame._forced
frame._forced = True
- def force_vable_if_necessary(self, vable):
- if vable.jitframe:
- self.force(vable.jitframe)
- vable.jitframe = lltype.nulltpr(llmemory.GCREF.TO)
-
def set_savedata_ref(self, frame, data):
frame.saved_data = data
def get_savedata_ref(self, frame):
return frame.saved_data
-
- def jitframe_get_jfdescr_descr(self):
- return JFDescrDescr()
-
- def jitframe_cast_jfdescr_to_descr(self, descr):
- return descr
# ------------------------------------------------------------
@@ -393,7 +365,7 @@
res = ptr._obj._callable(*args)
return support.cast_result(RESULT, res)
- def _do_call(self, func, args_i, args_r, args_f, calldescr):
+ def _do_call(self, func, calldescr, args_i, args_r, args_f):
TP = llmemory.cast_int_to_adr(func).ptr._obj._TYPE
args = support.cast_call_args(TP.ARGS, args_i, args_r, args_f)
return self.maybe_on_top_of_llinterp(func, args, TP.RESULT)
@@ -595,39 +567,26 @@
def bh_read_timestamp(self):
return read_timestamp()
-class NotAFrame(object):
- _TYPE = llmemory.GCREF
- class latest_descr:
- pass
+class LLDeadFrame(object):
- def __eq__(self, other):
- return isinstance(other, NotAFrame)
- def __ne__(self, other):
- return not (self == other)
+ def __init__(self, latest_descr, values, last_exception=None):
+ self._latest_descr = latest_descr
+ self._values = values
+ self._last_exception = last_exception
+
class LLFrame(object):
- _TYPE = llmemory.GCREF
+ killed = None
+ overflow_flag = False
+ last_exception = None
- # some obscure hacks to support comparison with llmemory.GCREF
- def __ne__(self, other):
- return not self == other
- def __eq__(self, other):
- return isinstance(other, LLFrame) and self is other
-
- _forced = False
- _fast_path_done = False
- finish_value = None
-
def __init__(self, cpu, argboxes, args):
self.env = {}
- self.framecontent = {}
self.cpu = cpu
assert len(argboxes) == len(args)
for box, arg in zip(argboxes, args):
self.setenv(box, arg)
- self.overflow_flag = False
- self.last_exception = None
def setenv(self, box, arg):
if box.type == INT:
@@ -642,20 +601,12 @@
else:
raise AssertionError(box)
#
- assert box.getvarindex() >= 0
self.env[box] = arg
- self.framecontent[box.getvarindex()] = arg
- if box.type == FLOAT and FLOAT_SIZE > 1:
- self.framecontent[box.getvarindex() + 1] = '2nd float word'
def lookup(self, arg):
if isinstance(arg, Const):
return arg.value
- result = self.env[arg]
- assert result is self.framecontent[arg.getvarindex()]
- if arg.type == FLOAT and FLOAT_SIZE > 1:
- assert self.framecontent[arg.getvarindex() + 1] == '2nd float word'
- return result
+ return self.env[arg]
def execute(self, lltrace):
self.lltrace = lltrace
@@ -671,22 +622,18 @@
try:
resval = execute(_getdescr(op), *args)
except Jump, j:
- self.lltrace, i = j.descr._llgraph_target
- label_op = self.lltrace.operations[i]
- self.do_renaming(label_op.getarglist(), j.args)
- i += 1
+ self.lltrace, i = j.jump_target
+ if i >= 0:
+ label_op = self.lltrace.operations[i]
+ i += 1
+ targetargs = label_op.getarglist()
+ else:
+ targetargs = self.lltrace.inputargs
+ i = 0
+ self.do_renaming(targetargs, j.args)
continue
- except GuardFailed, gf:
- if hasattr(gf.descr, '_llgraph_bridge'):
- i = 0
- self.lltrace = gf.descr._llgraph_bridge
- newvals = [self.framecontent[arg._varindex]
- for arg in self.lltrace.inputargs]
- self.do_renaming(self.lltrace.inputargs, newvals)
- continue
- raise
- if op.type != VOID:
- self.setenv(op, resval)
+ if op.result is not None:
+ self.setenv(op.result, resval)
else:
assert resval is None
i += 1
@@ -701,13 +648,26 @@
# -----------------------------------------------------
def fail_guard(self, descr):
- raise GuardFailed(descr)
+ values = []
+ for box in self.current_op.getfailargs():
+ if box is not None:
+ value = self.env[box]
+ else:
+ value = None
+ values.append(value)
+ if hasattr(descr, '_llgraph_bridge'):
+ target = (descr._llgraph_bridge, -1)
+ values = [value for value in values if value is not None]
+ raise Jump(target, values)
+ else:
+ raise ExecutionFinished(LLDeadFrame(descr, values,
+ self.last_exception))
def execute_force_spill(self, _, arg):
pass
- def execute_finish(self, descr, arg=None):
- raise ExecutionFinished(descr, arg)
+ def execute_finish(self, descr, *args):
+ raise ExecutionFinished(LLDeadFrame(descr, args))
def execute_label(self, descr, *args):
argboxes = self.current_op.getarglist()
@@ -815,8 +775,7 @@
self.fail_guard(descr)
def execute_jump(self, descr, *args):
- assert descr is not None
- raise Jump(descr, args)
+ raise Jump(descr._llgraph_target, args)
def _do_math_sqrt(self, value):
import math
@@ -923,10 +882,8 @@
def _getdescr(op):
d = op.getdescr()
- # XXX for now
- #if d is not None:
- # d = d.realdescrref()
- # assert d is not None, "the descr disappeared: %r" % (op,)
+ if d is not None:
+ d = d.getrealdescr()
return d
def _setup():
diff --git a/pypy/jit/backend/llgraph/support.py b/pypy/jit/backend/llgraph/support.py
--- a/pypy/jit/backend/llgraph/support.py
+++ b/pypy/jit/backend/llgraph/support.py
@@ -2,7 +2,7 @@
from pypy.jit.codewriter import longlong
from pypy.jit.codewriter import heaptracker
-from pypy.jit.metainterp.resoperation import getkind
+from pypy.jit.metainterp.history import getkind
from pypy.rlib.rarithmetic import r_longlong, r_ulonglong, r_uint
from pypy.rpython.lltypesystem import lltype, rffi, llmemory
diff --git a/pypy/jit/backend/llgraph/test/test_llgraph.py b/pypy/jit/backend/llgraph/test/test_llgraph.py
--- a/pypy/jit/backend/llgraph/test/test_llgraph.py
+++ b/pypy/jit/backend/llgraph/test/test_llgraph.py
@@ -14,7 +14,7 @@
# for individual tests see:
# ====> ../../test/runner_test.py
- from pypy.jit.backend.llgraph.runner import LLtypeCPU as cpu_type
+ from pypy.jit.backend.llgraph.runner import LLGraphCPU as cpu_type
def setup_method(self, _):
self.cpu = self.cpu_type(None)
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -155,11 +155,19 @@
raise NotImplementedError
def grab_exc_value(self, deadframe):
- """Return and clear the exception set by the latest execute_token(),
+ """Return the exception set by the latest execute_token(),
when it exits due to a failure of a GUARD_EXCEPTION or
GUARD_NO_EXCEPTION. (Returns a GCREF)""" # XXX remove me
raise NotImplementedError
+ def set_savedata_ref(self, deadframe, data):
+ """For the front-end: store a GCREF on the deadframe object."""
+ raise NotImplementedError
+
+ def get_savedata_ref(self, deadframe):
+ """For the front-end: get the GCREF saved with set_savedata_ref()."""
+ raise NotImplementedError
+
def force(self, force_token):
"""Take a 'force token' as produced by the FORCE_TOKEN operation,
and 'kill' the corresponding JIT frame, which should be somewhere
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -56,17 +56,17 @@
args.append(box.getfloatstorage())
else:
raise NotImplementedError(box)
- res = self.cpu.execute_token(looptoken, *args)
- if res is operations[-1].getdescr():
+ deadframe = self.cpu.execute_token(looptoken, *args)
+ if self.cpu.get_latest_descr(deadframe) is operations[-1].getdescr():
self.guard_failed = False
else:
self.guard_failed = True
if result_type == 'int':
- return BoxInt(self.cpu.get_latest_value_int(0))
+ return BoxInt(self.cpu.get_latest_value_int(deadframe, 0))
elif result_type == 'ref':
- return BoxPtr(self.cpu.get_latest_value_ref(0))
+ return BoxPtr(self.cpu.get_latest_value_ref(deadframe, 0))
elif result_type == 'float':
- return BoxFloat(self.cpu.get_latest_value_float(0))
+ return BoxFloat(self.cpu.get_latest_value_float(deadframe, 0))
elif result_type == 'void':
return None
else:
@@ -117,8 +117,9 @@
inputargs = [i0]
looptoken = JitCellToken()
self.cpu.compile_loop(inputargs, operations, looptoken)
- fail = self.cpu.execute_token(looptoken, 2)
- res = self.cpu.get_latest_value_int(0)
+ deadframe = self.cpu.execute_token(looptoken, 2)
+ fail = self.cpu.get_latest_descr(deadframe)
+ res = self.cpu.get_latest_value_int(deadframe, 0)
assert res == 3
assert fail.identifier == 1
@@ -132,9 +133,11 @@
inputargs = [i0]
looptoken = JitCellToken()
self.cpu.compile_loop(inputargs, operations, looptoken)
- fail = self.cpu.execute_token(looptoken, longlong.getfloatstorage(2.8))
- res = self.cpu.get_latest_value_float(0)
+ deadframe = self.cpu.execute_token(looptoken,
+ longlong.getfloatstorage(2.8))
+ res = self.cpu.get_latest_value_float(deadframe, 0)
assert longlong.getrealfloat(res) == 5.1
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 1
def test_compile_loop(self):
@@ -154,9 +157,10 @@
operations[3].setfailargs([i1])
self.cpu.compile_loop(inputargs, operations, looptoken)
- fail = self.cpu.execute_token(looptoken, 2)
+ deadframe = self.cpu.execute_token(looptoken, 2)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 2
- res = self.cpu.get_latest_value_int(0)
+ res = self.cpu.get_latest_value_int(deadframe, 0)
assert res == 10
def test_compile_with_holes_in_fail_args(self):
@@ -178,9 +182,10 @@
operations[4].setfailargs([None, None, i1, None])
self.cpu.compile_loop(inputargs, operations, looptoken)
- fail = self.cpu.execute_token(looptoken, 44)
+ deadframe = self.cpu.execute_token(looptoken, 44)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 2
- res = self.cpu.get_latest_value_int(2)
+ res = self.cpu.get_latest_value_int(deadframe, 2)
assert res == 10
def test_backends_dont_keep_loops_alive(self):
@@ -243,9 +248,10 @@
self.cpu.compile_bridge(faildescr1, [i1b], bridge, looptoken)
- fail = self.cpu.execute_token(looptoken, 2)
+ deadframe = self.cpu.execute_token(looptoken, 2)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 2
- res = self.cpu.get_latest_value_int(0)
+ res = self.cpu.get_latest_value_int(deadframe, 0)
assert res == 20
assert self.cpu.total_compiled_loops == 1
@@ -284,9 +290,10 @@
self.cpu.compile_bridge(faildescr1, [i1b], bridge, looptoken)
- fail = self.cpu.execute_token(looptoken, 2)
+ deadframe = self.cpu.execute_token(looptoken, 2)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 2
- res = self.cpu.get_latest_value_int(0)
+ res = self.cpu.get_latest_value_int(deadframe, 0)
assert res == 20
def test_compile_big_bridge_out_of_small_loop(self):
@@ -315,10 +322,11 @@
self.cpu.compile_bridge(faildescr1, [i0], bridge, looptoken)
- fail = self.cpu.execute_token(looptoken, 1)
+ deadframe = self.cpu.execute_token(looptoken, 1)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 3
for i in range(1000):
- res = self.cpu.get_latest_value_int(i)
+ res = self.cpu.get_latest_value_int(deadframe, i)
assert res == 2 + i
def test_get_latest_value_count(self):
@@ -339,14 +347,15 @@
operations[3].setfailargs([None, i1, None])
self.cpu.compile_loop(inputargs, operations, looptoken)
- fail = self.cpu.execute_token(looptoken, 2)
+ deadframe = self.cpu.execute_token(looptoken, 2)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail is faildescr1
- count = self.cpu.get_latest_value_count()
+ count = self.cpu.get_latest_value_count(deadframe)
assert count == 3
- assert self.cpu.get_latest_value_int(1) == 10
- assert self.cpu.get_latest_value_int(1) == 10 # multiple reads ok
- self.cpu.clear_latest_values(3)
+ assert self.cpu.get_latest_value_int(deadframe, 1) == 10
+ # multiple reads ok
+ assert self.cpu.get_latest_value_int(deadframe, 1) == 10
def test_finish(self):
i0 = BoxInt()
@@ -361,9 +370,10 @@
ResOperation(rop.FINISH, [i0], None, descr=faildescr)
]
self.cpu.compile_loop([i0], operations, looptoken)
- fail = self.cpu.execute_token(looptoken, 99)
+ deadframe = self.cpu.execute_token(looptoken, 99)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail is faildescr
- res = self.cpu.get_latest_value_int(0)
+ res = self.cpu.get_latest_value_int(deadframe, 0)
assert res == 99
looptoken = JitCellToken()
@@ -371,9 +381,10 @@
ResOperation(rop.FINISH, [ConstInt(42)], None, descr=faildescr)
]
self.cpu.compile_loop([], operations, looptoken)
- fail = self.cpu.execute_token(looptoken)
+ deadframe = self.cpu.execute_token(looptoken)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail is faildescr
- res = self.cpu.get_latest_value_int(0)
+ res = self.cpu.get_latest_value_int(deadframe, 0)
assert res == 42
looptoken = JitCellToken()
@@ -381,7 +392,8 @@
ResOperation(rop.FINISH, [], None, descr=faildescr)
]
self.cpu.compile_loop([], operations, looptoken)
- fail = self.cpu.execute_token(looptoken)
+ deadframe = self.cpu.execute_token(looptoken)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail is faildescr
if self.cpu.supports_floats:
@@ -392,9 +404,10 @@
]
self.cpu.compile_loop([f0], operations, looptoken)
value = longlong.getfloatstorage(-61.25)
- fail = self.cpu.execute_token(looptoken, value)
+ deadframe = self.cpu.execute_token(looptoken, value)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail is faildescr
- res = self.cpu.get_latest_value_float(0)
+ res = self.cpu.get_latest_value_float(deadframe, 0)
assert longlong.getrealfloat(res) == -61.25
looptoken = JitCellToken()
@@ -402,9 +415,10 @@
ResOperation(rop.FINISH, [constfloat(42.5)], None, descr=faildescr)
]
self.cpu.compile_loop([], operations, looptoken)
- fail = self.cpu.execute_token(looptoken)
+ deadframe = self.cpu.execute_token(looptoken)
+ fail = self.cpu.get_latest_descr(deadframe)
assert fail is faildescr
- res = self.cpu.get_latest_value_float(0)
+ res = self.cpu.get_latest_value_float(deadframe, 0)
assert longlong.getrealfloat(res) == 42.5
def test_execute_operations_in_env(self):
@@ -427,9 +441,9 @@
]
operations[-2].setfailargs([t, z])
cpu.compile_loop([x, y], operations, looptoken)
- res = self.cpu.execute_token(looptoken, 0, 10)
- assert self.cpu.get_latest_value_int(0) == 0
- assert self.cpu.get_latest_value_int(1) == 55
+ deadframe = self.cpu.execute_token(looptoken, 0, 10)
+ assert self.cpu.get_latest_value_int(deadframe, 0) == 0
+ assert self.cpu.get_latest_value_int(deadframe, 1) == 55
def test_int_operations(self):
from pypy.jit.metainterp.test.test_executor import get_int_tests
@@ -486,16 +500,15 @@
looptoken = JitCellToken()
self.cpu.compile_loop([v1, v2], ops, looptoken)
for x, y, z in testcases:
- excvalue = self.cpu.grab_exc_value()
- assert not excvalue
- fail = self.cpu.execute_token(looptoken, x, y)
+ deadframe = self.cpu.execute_token(looptoken, x, y)
+ fail = self.cpu.get_latest_descr(deadframe)
if (z == boom) ^ reversed:
assert fail.identifier == 1
else:
assert fail.identifier == 2
if z != boom:
- assert self.cpu.get_latest_value_int(0) == z
- excvalue = self.cpu.grab_exc_value()
+ assert self.cpu.get_latest_value_int(deadframe, 0) == z
+ excvalue = self.cpu.grab_exc_value(deadframe)
assert not excvalue
def test_ovf_operations_reversed(self):
More information about the pypy-commit
mailing list