Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r66400:f43bf844019b
Date: 2013-08-28 15:03 +0100
http://bitbucket.org/pypy/pypy/changeset/f43bf844019b/
Log: (fijal, arigo, antocuni, rguillebert) in-progress, start fighting
with resume
diff --git a/rpython/jit/backend/llsupport/regalloc.py
b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -706,13 +706,6 @@
if opnum != rop.JUMP and opnum != rop.LABEL:
if arg not in last_real_usage:
last_real_usage[arg] = i
- if op.is_guard():
- for arg in op.getfailargs():
- if arg is None: # hole
- continue
- assert isinstance(arg, Box)
- if arg not in last_used:
- last_used[arg] = i
#
longevity = {}
for arg in produced:
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -911,15 +911,14 @@
oopspecindex = effectinfo.oopspecindex
genop_math_list[oopspecindex](self, op, arglocs, resloc)
- def regalloc_perform_with_guard(self, op, guard_op, faillocs,
+ def regalloc_perform_with_guard(self, op, guard_op,
arglocs, resloc, frame_depth):
faildescr = guard_op.getdescr()
assert isinstance(faildescr, AbstractFailDescr)
- failargs = guard_op.getfailargs()
guard_opnum = guard_op.getopnum()
guard_token = self.implement_guard_recovery(guard_opnum,
- faildescr, failargs,
- faillocs, frame_depth)
+ faildescr,
+ frame_depth)
if op is None:
dispatch_opnum = guard_opnum
else:
@@ -930,9 +929,9 @@
# must be added by the genop_guard_list[]()
assert guard_token is self.pending_guard_tokens[-1]
- def regalloc_perform_guard(self, guard_op, faillocs, arglocs, resloc,
+ def regalloc_perform_guard(self, guard_op, arglocs, resloc,
frame_depth):
- self.regalloc_perform_with_guard(None, guard_op, faillocs, arglocs,
+ self.regalloc_perform_with_guard(None, guard_op, arglocs,
resloc, frame_depth)
def load_effective_addr(self, sizereg, baseofs, scale, result, frm=imm0):
@@ -1712,14 +1711,15 @@
#
self.implement_guard(guard_token, 'NE')
- def implement_guard_recovery(self, guard_opnum, faildescr, failargs,
- fail_locs, frame_depth):
+ def implement_guard_recovery(self, guard_opnum, faildescr,
+ frame_depth):
exc = (guard_opnum == rop.GUARD_EXCEPTION or
guard_opnum == rop.GUARD_NO_EXCEPTION or
guard_opnum == rop.GUARD_NOT_FORCED)
is_guard_not_invalidated = guard_opnum == rop.GUARD_NOT_INVALIDATED
is_guard_not_forced = guard_opnum == rop.GUARD_NOT_FORCED
gcmap = allocate_gcmap(self, frame_depth, JITFRAME_FIXED_SIZE)
+ XXX
return GuardToken(self.cpu, gcmap, faildescr, failargs,
fail_locs, exc, frame_depth,
is_guard_not_invalidated, is_guard_not_forced)
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -7,6 +7,7 @@
from rpython.jit.backend.llsupport.descr import (ArrayDescr, CallDescr,
unpack_arraydescr, unpack_fielddescr, unpack_interiorfielddescr)
from rpython.jit.backend.llsupport.gcmap import allocate_gcmap
+from rpython.jit.backend.llsupport.resumebuilder import ResumeBuilder
from rpython.jit.backend.llsupport.regalloc import (FrameManager, BaseRegalloc,
RegisterManager, TempBox, compute_vars_longevity, is_comparison_or_ovf_op)
from rpython.jit.backend.x86 import rx86
@@ -22,7 +23,7 @@
from rpython.jit.codewriter.effectinfo import EffectInfo
from rpython.jit.metainterp.history import (Box, Const, ConstInt, ConstPtr,
ConstFloat, BoxInt, BoxFloat, INT, REF, FLOAT, TargetToken)
-from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.jit.metainterp.resoperation import rop
from rpython.rlib import rgc
from rpython.rlib.objectmodel import we_are_translated
from rpython.rlib.rarithmetic import r_longlong, r_uint
@@ -124,6 +125,7 @@
def __init__(self, assembler, translate_support_code=False):
assert isinstance(translate_support_code, bool)
+ self.resumebuilder = ResumeBuilder(self)
# variables that have place in register
self.assembler = assembler
self.translate_support_code = translate_support_code
@@ -276,30 +278,23 @@
self.assembler.dump('%s <- %s(%s)' % (result_loc, op, arglocs))
self.assembler.regalloc_perform_math(op, arglocs, result_loc)
- def locs_for_fail(self, guard_op):
- return [self.loc(v) for v in guard_op.getfailargs()]
-
def perform_with_guard(self, op, guard_op, arglocs, result_loc):
- faillocs = self.locs_for_fail(guard_op)
self.rm.position += 1
self.xrm.position += 1
- self.assembler.regalloc_perform_with_guard(op, guard_op, faillocs,
+ self.assembler.regalloc_perform_with_guard(op, guard_op,
arglocs, result_loc,
self.fm.get_frame_depth())
- self.possibly_free_vars(guard_op.getfailargs())
def perform_guard(self, guard_op, arglocs, result_loc):
- faillocs = self.locs_for_fail(guard_op)
if not we_are_translated():
if result_loc is not None:
self.assembler.dump('%s <- %s(%s)' % (result_loc, guard_op,
arglocs))
else:
self.assembler.dump('%s(%s)' % (guard_op, arglocs))
- self.assembler.regalloc_perform_guard(guard_op, faillocs, arglocs,
+ self.assembler.regalloc_perform_guard(guard_op, arglocs,
result_loc,
self.fm.get_frame_depth())
- self.possibly_free_vars(guard_op.getfailargs())
def perform_discard(self, op, arglocs):
if not we_are_translated():
@@ -314,6 +309,10 @@
self.assembler.mc.mark_op(op)
self.rm.position = i
self.xrm.position = i
+ if op.is_resume():
+ self.resumebuilder.process(op)
+ i += 1
+ continue
if op.has_no_side_effect() and op.result not in self.longevity:
i += 1
self.possibly_free_vars_for_op(op)
@@ -1333,6 +1332,7 @@
# self._compute_hint_frame_locations_from_descr(descr)
def consider_guard_not_forced_2(self, op):
+ xxx
self.rm.before_call(op.getfailargs(), save_all_regs=True)
fail_locs = [self.loc(v) for v in op.getfailargs()]
self.assembler.store_force_descr(op, fail_locs,
diff --git a/rpython/jit/backend/x86/regloc.py
b/rpython/jit/backend/x86/regloc.py
--- a/rpython/jit/backend/x86/regloc.py
+++ b/rpython/jit/backend/x86/regloc.py
@@ -51,6 +51,7 @@
def get_position(self):
raise NotImplementedError # only for stack
+
class RawEbpLoc(AssemblerLocation):
""" The same as stack location, but does not know it's position.
Mostly usable for raw frame access
@@ -112,7 +113,7 @@
class FrameLoc(RawEbpLoc):
_immutable_ = True
-
+
def __init__(self, position, ebp_offset, type):
# _getregkey() returns self.value; the value returned must not
# conflict with RegLoc._getregkey(). It doesn't a bit by chance,
@@ -342,7 +343,7 @@
# we actually do:
# mov r11, 0xDEADBEEFDEADBEEF
# mov rax, [r11]
-#
+#
# NB: You can use the scratch register as a temporary register in
# assembler.py, but care must be taken when doing so. A call to a method in
# LocationCodeBuilder could clobber the scratch register when certain
@@ -638,7 +639,7 @@
CVTTSD2SI = _binaryop('CVTTSD2SI')
CVTSD2SS = _binaryop('CVTSD2SS')
CVTSS2SD = _binaryop('CVTSS2SD')
-
+
SQRTSD = _binaryop('SQRTSD')
ANDPD = _binaryop('ANDPD')
diff --git a/rpython/jit/metainterp/executor.py
b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -289,7 +289,8 @@
for key, value in rop.__dict__.items():
if not key.startswith('_'):
if (rop._FINAL_FIRST <= value <= rop._FINAL_LAST or
- rop._GUARD_FIRST <= value <= rop._GUARD_LAST):
+ rop._GUARD_FIRST <= value <= rop._GUARD_LAST or
+ rop._RESUME_FIRST <= value <= rop._RESUME_LAST):
continue
# find which list to store the operation in, based on num_args
num_args = resoperation.oparity[value]
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -51,15 +51,6 @@
def numargs(self):
raise NotImplementedError
- # methods implemented by GuardResOp
- # ---------------------------------
-
- def getfailargs(self):
- return None
-
- def setfailargs(self, fail_args):
- raise NotImplementedError
-
# methods implemented by ResOpWithDescr
# -------------------------------------
@@ -145,10 +136,15 @@
self.getopnum() == rop.GUARD_NO_OVERFLOW)
def is_always_pure(self):
- return rop._ALWAYS_PURE_FIRST <= self.getopnum() <=
rop._ALWAYS_PURE_LAST
+ return (rop._ALWAYS_PURE_FIRST <= self.getopnum()
+ <= rop._ALWAYS_PURE_LAST)
def has_no_side_effect(self):
- return rop._NOSIDEEFFECT_FIRST <= self.getopnum() <=
rop._NOSIDEEFFECT_LAST
+ return (rop._NOSIDEEFFECT_FIRST <= self.getopnum()
+ <= rop._NOSIDEEFFECT_LAST)
+
+ def is_resume(self):
+ return rop._RESUME_FIRST <= self.getopnum() <= rop._RESUME_LAST
def can_raise(self):
return rop._CANRAISE_FIRST <= self.getopnum() <= rop._CANRAISE_LAST
@@ -211,24 +207,7 @@
class GuardResOp(ResOpWithDescr):
-
- _fail_args = None
-
- def getfailargs(self):
- return self._fail_args
-
- def setfailargs(self, fail_args):
- self._fail_args = fail_args
-
- def copy_and_change(self, opnum, args=None, result=None, descr=None):
- newop = AbstractResOp.copy_and_change(self, opnum, args, result, descr)
- newop.setfailargs(self.getfailargs())
- return newop
-
- def clone(self):
- newop = AbstractResOp.clone(self)
- newop.setfailargs(self.getfailargs())
- return newop
+ pass
# ============
# arity mixins
@@ -489,8 +468,11 @@
'VIRTUAL_REF/2', # removed before it's passed to the backend
'READ_TIMESTAMP/0',
'MARK_OPAQUE_PTR/1b',
- # this one has no *visible* side effect, since the virtualizable
- # must be forced, however we need to execute it anyway
+ '_RESUME_FIRST',
+ 'ENTER_FRAME/1d',
+ 'LEAVE_FRAME/0',
+ 'RESUME_PUT/3',
+ '_RESUME_LAST',
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
'SETARRAYITEM_GC/3d',
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -49,7 +49,7 @@
return newop
-def default_fail_descr(model, opnum, fail_args=None):
+def default_fail_descr(model, opnum):
if opnum == rop.FINISH:
return model.BasicFinalDescr()
return model.BasicFailDescr()
@@ -217,38 +217,22 @@
if endnum == -1:
raise ParseError("invalid line: %s" % line)
args, descr = self.parse_args(opname, line[num + 1:endnum])
+ if '[' in line:
+ raise Exception("failargs are dead")
if rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST:
- i = line.find('[', endnum) + 1
- j = line.find(']', i)
- if (i <= 0 or j <= 0) and not self.nonstrict:
- raise ParseError("missing fail_args for guard operation")
- fail_args = []
- if i < j:
- for arg in line[i:j].split(','):
- arg = arg.strip()
- if arg == 'None':
- fail_arg = None
- else:
- try:
- fail_arg = self.vars[arg]
- except KeyError:
- raise ParseError(
- "Unknown var in fail_args: %s" % arg)
- fail_args.append(fail_arg)
if descr is None and self.invent_fail_descr:
- descr = self.invent_fail_descr(self.model, opnum, fail_args)
+ descr = self.invent_fail_descr(self.model, opnum)
if hasattr(descr, '_oparser_uses_descr_of_guard'):
- descr._oparser_uses_descr_of_guard(self, fail_args)
+ descr._oparser_uses_descr_of_guard(self)
else:
- fail_args = None
if opnum == rop.FINISH:
if descr is None and self.invent_fail_descr:
- descr = self.invent_fail_descr(self.model, opnum,
fail_args)
+ descr = self.invent_fail_descr(self.model, opnum)
elif opnum == rop.JUMP:
if descr is None and self.invent_fail_descr:
descr = self.original_jitcell_token
- return opnum, args, descr, fail_args
+ return opnum, args, descr
def create_op(self, opnum, args, result, descr):
if opnum == ESCAPE_OP.OPNUM:
@@ -268,21 +252,17 @@
res, op = line.split("=", 1)
res = res.strip()
op = op.strip()
- opnum, args, descr, fail_args = self.parse_op(op)
+ opnum, args, descr = self.parse_op(op)
if res in self.vars:
raise ParseError("Double assign to var %s in line: %s" % (res,
line))
rvar = self.box_for_var(res)
self.vars[res] = rvar
res = self.create_op(opnum, args, rvar, descr)
- if fail_args is not None:
- res.setfailargs(fail_args)
return res
def parse_op_no_result(self, line):
- opnum, args, descr, fail_args = self.parse_op(line)
+ opnum, args, descr = self.parse_op(line)
res = self.create_op(opnum, args, None, descr)
- if fail_args is not None:
- res.setfailargs(fail_args)
return res
def parse_next_op(self, line):
diff --git a/rpython/jit/tool/test/test_oparser.py
b/rpython/jit/tool/test/test_oparser.py
--- a/rpython/jit/tool/test/test_oparser.py
+++ b/rpython/jit/tool/test/test_oparser.py
@@ -33,14 +33,13 @@
def test_const_ptr_subops(self):
x = """
[p0]
- guard_class(p0, ConstClass(vtable)) []
+ guard_class(p0, ConstClass(vtable))
"""
S = lltype.Struct('S')
vtable = lltype.nullptr(S)
loop = self.parse(x, None, locals())
assert len(loop.operations) == 1
assert loop.operations[0].getdescr()
- assert loop.operations[0].getfailargs() == []
def test_descr(self):
class Xyz(AbstractDescr):
@@ -57,7 +56,7 @@
def test_after_fail(self):
x = """
[i0]
- guard_value(i0, 3) []
+ guard_value(i0, 3)
i1 = int_add(1, 2)
"""
loop = self.parse(x, None, {})
@@ -174,7 +173,7 @@
i4 = int_add(i0, 2)
i6 = int_sub(i1, 1)
i8 = int_gt(i6, 3)
- guard_true(i8, descr=<Guard15>) [i4, i6]
+ guard_true(i8, descr=<Guard15>)
debug_merge_point('(no jitdriver.get_printable_location!)', 0)
jump(i6, i4, descr=<Loop0>)
'''
@@ -195,14 +194,6 @@
loop = self.parse(x)
assert loop.operations[0].getopname() == 'new'
- def test_no_fail_args(self):
- x = '''
- [i0]
- guard_true(i0, descr=<Guard0>)
- '''
- loop = self.parse(x, nonstrict=True)
- assert loop.operations[0].getfailargs() == []
-
def test_no_inputargs(self):
x = '''
i2 = int_add(i0, i1)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit