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

Reply via email to