[pypy-commit] pypy slim-down-resumedescr: yet another attempt - dont allocate descrs for not emitted guards at all

fijal noreply at buildbot.pypy.org
Thu Dec 25 13:28:03 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: slim-down-resumedescr
Changeset: r75111:cd94f2a8fe4a
Date: 2014-12-25 14:27 +0200
http://bitbucket.org/pypy/pypy/changeset/cd94f2a8fe4a/

Log:	yet another attempt - dont allocate descrs for not emitted guards at
	all (this nicely solves some nasty optimizeopt test questions in
	addition to being slightly better)

diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -130,8 +130,8 @@
                       [ResOperation(rop.LABEL, jumpargs, None, descr=jitcell_token)]
 
     try:
-        start_state = optimize_trace(metainterp_sd, part, enable_opts,
-                                     export_state=True)
+        start_state = optimize_trace(metainterp_sd, jitdriver_sd, part,
+                                     enable_opts, export_state=True)
     except InvalidLoop:
         return None
     target_token = part.operations[0].getdescr()
@@ -158,7 +158,7 @@
         jumpargs = part.operations[-1].getarglist()
 
         try:
-            optimize_trace(metainterp_sd, part, enable_opts,
+            optimize_trace(metainterp_sd, jitdriver_sd, part, enable_opts,
                            start_state=start_state, export_state=False)
         except InvalidLoop:
             return None
@@ -211,7 +211,8 @@
     orignial_label = label.clone()
     assert label.getopnum() == rop.LABEL
     try:
-        optimize_trace(metainterp_sd, part, jitdriver_sd.warmstate.enable_opts,
+        optimize_trace(metainterp_sd, jitdriver_sd, part,
+                       jitdriver_sd.warmstate.enable_opts,
                        start_state=start_state, export_state=False)
     except InvalidLoop:
         # Fall back on jumping to preamble
@@ -221,7 +222,7 @@
                           [ResOperation(rop.JUMP, inputargs[:],
                                         None, descr=loop_jitcell_token)]
         try:
-            optimize_trace(metainterp_sd, part,
+            optimize_trace(metainterp_sd, jitdriver_sd, part,
                            jitdriver_sd.warmstate.enable_opts,
                            inline_short_preamble=False, start_state=start_state,
                            export_state=False)
@@ -496,11 +497,6 @@
 
     status = r_uint(0)
 
-    def clone(self):
-        new = self.__class__()
-        new.rd_frame_info_list = self.rd_frame_info_list
-        return new
-
     def copy_all_attributes_from(self, other):
         assert isinstance(other, ResumeGuardDescr)
         self.rd_count = other.rd_count
@@ -712,12 +708,6 @@
         self.metainterp_sd = metainterp_sd
         self.jitdriver_sd = jitdriver_sd
 
-    def clone(self):
-        new = ResumeGuardForcedDescr()
-        new._init(self.metainterp_sd, self.jitdriver_sd)
-        new.rd_frame_info_list = self.rd_frame_info_list
-        return new
-
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         # Failures of a GUARD_NOT_FORCED are never compiled, but
         # always just blackholed.  First fish for the data saved when
@@ -775,6 +765,41 @@
         hidden_all_virtuals = obj.hide(metainterp_sd.cpu)
         metainterp_sd.cpu.set_savedata_ref(deadframe, hidden_all_virtuals)
 
+def invent_fail_descr_for_op(op, optimizer):
+    opnum = op.getopnum()
+    if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
+        resumedescr = ResumeGuardForcedDescr()
+        resumedescr._init(optimizer.metainterp_sd, optimizer.jitdriver_sd)
+    elif opnum == rop.GUARD_NOT_INVALIDATED:
+        resumedescr = ResumeGuardNotInvalidated()
+    elif opnum == rop.GUARD_FUTURE_CONDITION:
+        resumedescr = ResumeAtPositionDescr()
+    elif opnum == rop.GUARD_VALUE:
+        resumedescr = ResumeGuardValueDescr()
+    elif opnum == rop.GUARD_NONNULL:
+        resumedescr = ResumeGuardNonnullDescr()
+    elif opnum == rop.GUARD_ISNULL:
+        resumedescr = ResumeGuardIsnullDescr()
+    elif opnum == rop.GUARD_NONNULL_CLASS:
+        resumedescr = ResumeGuardNonnullClassDescr()
+    elif opnum == rop.GUARD_CLASS:
+        resumedescr = ResumeGuardClassDescr()
+    elif opnum == rop.GUARD_TRUE:
+        resumedescr = ResumeGuardTrueDescr()
+    elif opnum == rop.GUARD_FALSE:
+        resumedescr = ResumeGuardFalseDescr()
+    elif opnum == rop.GUARD_EXCEPTION:
+        resumedescr = ResumeGuardExceptionDescr()
+    elif opnum == rop.GUARD_NO_EXCEPTION:
+        resumedescr = ResumeGuardNoExceptionDescr()
+    elif opnum == rop.GUARD_OVERFLOW:
+        resumedescr = ResumeGuardOverflowDescr()
+    elif opnum == rop.GUARD_NO_OVERFLOW:
+        resumedescr = ResumeGuardNoOverflowDescr()
+    else:
+        assert False
+    return resumedescr
+
 class ResumeFromInterpDescr(ResumeDescr):
     def __init__(self, original_greenkey):
         self.original_greenkey = original_greenkey
@@ -813,13 +838,15 @@
 
     new_trace.operations = [op.clone() for op in metainterp.history.operations]
     metainterp_sd = metainterp.staticdata
-    state = metainterp.jitdriver_sd.warmstate
+    jitdriver_sd = metainterp.jitdriver_sd
+    state = jitdriver_sd.warmstate
     if isinstance(resumekey, ResumeAtPositionDescr):
         inline_short_preamble = False
     else:
         inline_short_preamble = True
     try:
-        state = optimize_trace(metainterp_sd, new_trace, state.enable_opts,
+        state = optimize_trace(metainterp_sd, jitdriver_sd, new_trace,
+                               state.enable_opts,
                                inline_short_preamble, export_state=True)
     except InvalidLoop:
         debug_print("compile_new_bridge: got an InvalidLoop")
diff --git a/rpython/jit/metainterp/jitexc.py b/rpython/jit/metainterp/jitexc.py
--- a/rpython/jit/metainterp/jitexc.py
+++ b/rpython/jit/metainterp/jitexc.py
@@ -41,6 +41,8 @@
 
 class ExitFrameWithExceptionRef(JitException):
     def __init__(self, cpu, value):
+        import pdb
+        pdb.set_trace()
         assert lltype.typeOf(value) == cpu.ts.BASETYPE
         self.value = value
     def __str__(self):
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -47,7 +47,7 @@
 
     return optimizations, unroll
 
-def optimize_trace(metainterp_sd, loop, enable_opts,
+def optimize_trace(metainterp_sd, jitdriver_sd, loop, enable_opts,
                    inline_short_preamble=True, start_state=None,
                    export_state=True):
     """Optimize loop.operations to remove internal overheadish operations.
@@ -59,11 +59,13 @@
                                                           loop.operations)
         optimizations, unroll = build_opt_chain(metainterp_sd, enable_opts)
         if unroll:
-            return optimize_unroll(metainterp_sd, loop, optimizations,
+            return optimize_unroll(metainterp_sd, jitdriver_sd, loop,
+                                   optimizations,
                                    inline_short_preamble, start_state,
                                    export_state)
         else:
-            optimizer = Optimizer(metainterp_sd, loop, optimizations)
+            optimizer = Optimizer(metainterp_sd, jitdriver_sd, loop,
+                                  optimizations)
             optimizer.propagate_all_forward()
     finally:
         debug_stop("jit-optimize")
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -502,8 +502,9 @@
 
 class Optimizer(Optimization):
 
-    def __init__(self, metainterp_sd, loop, optimizations=None):
+    def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations=None):
         self.metainterp_sd = metainterp_sd
+        self.jitdriver_sd = jitdriver_sd
         self.cpu = metainterp_sd.cpu
         self.loop = loop
         self.values = {}
@@ -748,7 +749,12 @@
 
     def store_final_boxes_in_guard(self, op, pendingfields):
         assert pendingfields is not None
-        descr = op.getdescr()
+        if op.getdescr() is not None:
+            descr = op.getdescr()
+            assert isinstance(descr, compile.ResumeAtPositionDescr)
+        else:
+            descr = compile.invent_fail_descr_for_op(op, self)
+            op.setdescr(descr)
         assert isinstance(descr, compile.ResumeGuardDescr)
         assert isinstance(op, GuardResOp)
         modifier = resume.ResumeDataVirtualAdder(descr, op,
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -17,16 +17,16 @@
     b0 = BoxInt()
     b1 = BoxInt()
     opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(LLtypeMixin.cpu),
-                                None)
-    fdescr = ResumeGuardDescr()
-    op = ResOperation(rop.GUARD_TRUE, ['dummy'], None, descr=fdescr)
+                                None, None)
+    op = ResOperation(rop.GUARD_TRUE, ['dummy'], None)
     # setup rd data
     fi0 = resume.FrameInfo(None, "code0", 11)
-    fdescr.rd_frame_info_list = resume.FrameInfo(fi0, "code1", 33)
     snapshot0 = resume.Snapshot(None, [b0])
     op.rd_snapshot = resume.Snapshot(snapshot0, [b1])
+    op.rd_frame_info_list = resume.FrameInfo(fi0, "code1", 33)
     #
     opt.store_final_boxes_in_guard(op, [])
+    fdescr = op.getdescr()
     if op.getfailargs() == [b0, b1]:
         assert list(fdescr.rd_numb.nums)      == [tag(1, TAGBOX)]
         assert list(fdescr.rd_numb.prev.nums) == [tag(0, TAGBOX)]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -361,36 +361,23 @@
 class BaseTest(object):
 
     def parse(self, s, boxkinds=None, want_fail_descr=True, postprocess=None):
-        if want_fail_descr:
-            invent_fail_descr = self.invent_fail_descr
-        else:
-            invent_fail_descr = lambda *args: None
         self.oparse = OpParser(s, self.cpu, self.namespace, 'lltype',
                                boxkinds,
-                               invent_fail_descr, False, postprocess)
+                               None, False, postprocess)
         return self.oparse.parse()
 
     def postprocess(self, op):
         if op.is_guard():
             op.rd_snapshot = resume.Snapshot(None, op.getfailargs())
-            op.getdescr().rd_frame_info_list = resume.FrameInfo(None, "code", 11)
+            op.rd_frame_info_list = resume.FrameInfo(None, "code", 11)
 
     def add_guard_future_condition(self, res):
         # invent a GUARD_FUTURE_CONDITION to not have to change all tests
         if res.operations[-1].getopnum() == rop.JUMP:
-            guard = ResOperation(rop.GUARD_FUTURE_CONDITION, [], None, descr=self.invent_fail_descr(None, rop.GUARD_FUTURE_CONDITION, []))
+            guard = ResOperation(rop.GUARD_FUTURE_CONDITION, [], None)
             guard.rd_snapshot = resume.Snapshot(None, [])
             res.operations.insert(-1, guard)
 
-    def invent_fail_descr(self, model, opnum, fail_args):
-        if rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST:
-            descr = Storage()
-            descr.guard_opnum = opnum
-            descr.rd_frame_info_list = resume.FrameInfo(None, "code", 11)
-        else:
-            descr = final_descr
-        return descr
-
     def assert_equal(self, optimized, expected, text_right=None):
         from rpython.jit.metainterp.optimizeopt.util import equaloplists
         assert len(optimized.inputargs) == len(expected.inputargs)
@@ -417,7 +404,8 @@
         if hasattr(self, 'callinfocollection'):
             metainterp_sd.callinfocollection = self.callinfocollection
         #
-        return optimize_trace(metainterp_sd, loop, self.enable_opts,
+        return optimize_trace(metainterp_sd, None, loop,
+                              self.enable_opts,
                               start_state=start_state,
                               export_state=export_state)
 
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -799,7 +799,7 @@
         if hasattr(self, 'callinfocollection'):
             metainterp_sd.callinfocollection = self.callinfocollection
         #
-        optimize_trace(metainterp_sd, bridge, self.enable_opts)
+        optimize_trace(metainterp_sd, None, bridge, self.enable_opts)
 
         
     def optimize_bridge(self, loops, bridge, expected, expected_target='Loop', **boxvalues):
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -9,15 +9,16 @@
         ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
 from rpython.jit.metainterp.resoperation import rop, ResOperation, GuardResOp
 from rpython.jit.metainterp.resume import Snapshot
+from rpython.jit.metainterp import compile
 from rpython.rlib.debug import debug_print, debug_start, debug_stop
 
 
 # FIXME: Introduce some VirtualOptimizer super class instead
 
-def optimize_unroll(metainterp_sd, loop, optimizations,
+def optimize_unroll(metainterp_sd, jitdriver_sd, loop, optimizations,
                     inline_short_preamble=True, start_state=None,
                     export_state=True):
-    opt = UnrollOptimizer(metainterp_sd, loop, optimizations)
+    opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, loop, optimizations)
     opt.inline_short_preamble = inline_short_preamble
     return opt.propagate_all_forward(start_state, export_state)
 
@@ -51,8 +52,9 @@
 
     inline_short_preamble = True
 
-    def __init__(self, metainterp_sd, loop, optimizations):
-        self.optimizer = UnrollableOptimizer(metainterp_sd, loop, optimizations)
+    def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations):
+        self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd,
+                                             loop, optimizations)
         self.boxes_created_this_iteration = None
 
     def get_virtual_state(self, args):
@@ -559,11 +561,10 @@
 
             for guard in extra_guards:
                 if guard.is_guard():
-                    descr = patchguardop.getdescr().clone()
-                    assert isinstance(guard, GuardResOp)
                     assert isinstance(patchguardop, GuardResOp)
                     guard.rd_snapshot = patchguardop.rd_snapshot
-                    guard.setdescr(descr)
+                    guard.rd_frame_info_list = patchguardop.rd_frame_info_list
+                    guard.setdescr(compile.ResumeAtPositionDescr())
                 self.optimizer.send_extra_operation(guard)
 
             try:
@@ -592,11 +593,11 @@
             if newop.is_guard():
                 if not patchguardop:
                     raise InvalidLoop("would like to have short preamble, but it has a guard and there's no guard_future_condition")
-                descr = patchguardop.getdescr().clone()
                 assert isinstance(newop, GuardResOp)
                 assert isinstance(patchguardop, GuardResOp)
                 newop.rd_snapshot = patchguardop.rd_snapshot
-                newop.setdescr(descr)
+                newop.rd_frame_info_list = patchguardop.rd_frame_info_list
+                newop.setdescr(compile.ResumeAtPositionDescr())
             self.optimizer.send_extra_operation(newop)
             if shop.result in assumed_classes:
                 classbox = self.getvalue(newop.result).get_constant_class(self.optimizer.cpu)
diff --git a/rpython/jit/metainterp/optimizeopt/util.py b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -164,8 +164,6 @@
                 assert op1.result.same_box(remap[op2.result])
         else:
             remap[op2.result] = op1.result
-        if op1.getopnum() not in (rop.JUMP, rop.LABEL):      # xxx obscure
-            assert op1.getdescr() == op2.getdescr()
         if op1.getfailargs() or op2.getfailargs():
             assert len(op1.getfailargs()) == len(op2.getfailargs())
             if strict_fail_args:
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1874,46 +1874,15 @@
             moreargs = [box] + extraargs
         else:
             moreargs = list(extraargs)
-        if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
-            resumedescr = compile.ResumeGuardForcedDescr()
-            resumedescr._init(self.staticdata, self.jitdriver_sd)
-        elif opnum == rop.GUARD_NOT_INVALIDATED:
-            resumedescr = compile.ResumeGuardNotInvalidated()
-        elif opnum == rop.GUARD_FUTURE_CONDITION:
-            resumedescr = compile.ResumeAtPositionDescr()
-        elif opnum == rop.GUARD_VALUE:
-            resumedescr = compile.ResumeGuardValueDescr()
-        elif opnum == rop.GUARD_NONNULL:
-            resumedescr = compile.ResumeGuardNonnullDescr()
-        elif opnum == rop.GUARD_ISNULL:
-            resumedescr = compile.ResumeGuardIsnullDescr()
-        elif opnum == rop.GUARD_NONNULL_CLASS:
-            resumedescr = compile.ResumeGuardNonnullClassDescr()
-        elif opnum == rop.GUARD_CLASS:
-            resumedescr = compile.ResumeGuardClassDescr()
-        elif opnum == rop.GUARD_TRUE:
-            resumedescr = compile.ResumeGuardTrueDescr()
-        elif opnum == rop.GUARD_FALSE:
-            resumedescr = compile.ResumeGuardFalseDescr()
-        elif opnum == rop.GUARD_EXCEPTION:
-            resumedescr = compile.ResumeGuardExceptionDescr()
-        elif opnum == rop.GUARD_NO_EXCEPTION:
-            resumedescr = compile.ResumeGuardNoExceptionDescr()
-        elif opnum == rop.GUARD_OVERFLOW:
-            resumedescr = compile.ResumeGuardOverflowDescr()
-        elif opnum == rop.GUARD_NO_OVERFLOW:
-            resumedescr = compile.ResumeGuardNoOverflowDescr()
-        else:
-            assert False
-        guard_op = self.history.record(opnum, moreargs, None, descr=resumedescr)
+        guard_op = self.history.record(opnum, moreargs, None)
         assert isinstance(guard_op, GuardResOp)
-        self.capture_resumedata(guard_op, resumedescr, resumepc)
+        self.capture_resumedata(guard_op, resumepc)
         self.staticdata.profiler.count_ops(opnum, Counters.GUARDS)
         # count
         self.attach_debug_info(guard_op)
         return guard_op
 
-    def capture_resumedata(self, guard_op, resumedescr, resumepc=-1):
+    def capture_resumedata(self, guard_op, resumepc=-1):
         virtualizable_boxes = None
         if (self.jitdriver_sd.virtualizable_info is not None or
             self.jitdriver_sd.greenfield_info is not None):
@@ -1925,7 +1894,7 @@
             if resumepc >= 0:
                 frame.pc = resumepc
         resume.capture_resumedata(self.framestack, virtualizable_boxes,
-                                  self.virtualref_boxes, resumedescr, guard_op)
+                                  self.virtualref_boxes, guard_op)
         if self.framestack:
             self.framestack[-1].pc = saved_pc
 
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
@@ -216,6 +216,7 @@
     _fail_args = None
 
     rd_snapshot = None
+    rd_frame_info_list = None
 
     def getfailargs(self):
         return self._fail_args
@@ -228,6 +229,7 @@
         assert isinstance(newop, GuardResOp)
         newop.setfailargs(self.getfailargs())
         newop.rd_snapshot = self.rd_snapshot
+        newop.rd_frame_info_list = self.rd_frame_info_list
         return newop
 
     def clone(self):
@@ -235,10 +237,7 @@
         assert isinstance(newop, GuardResOp)
         newop.setfailargs(self.getfailargs())
         newop.rd_snapshot = self.rd_snapshot
-        descr = self.getdescr()
-        if descr is not None: # for short preamble which is a mess
-            newdescr = descr.clone()
-            newop.setdescr(newdescr)
+        newop.rd_frame_info_list = self.rd_frame_info_list
         return newop
 
 # ============
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -55,7 +55,7 @@
                                          back.get_list_of_active_boxes(True))
 
 def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
-                       storage, snapshot_storage):
+                       snapshot_storage):
     n = len(framestack) - 1
     if virtualizable_boxes is not None:
         boxes = virtualref_boxes + virtualizable_boxes
@@ -66,13 +66,13 @@
         _ensure_parent_resumedata(framestack, n)
         frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list,
                                     top.jitcode, top.pc)
-        storage.rd_frame_info_list = frame_info_list
+        snapshot_storage.rd_frame_info_list = frame_info_list
         snapshot = Snapshot(top.parent_resumedata_snapshot,
                             top.get_list_of_active_boxes(False))
         snapshot = Snapshot(snapshot, boxes)
         snapshot_storage.rd_snapshot = snapshot
     else:
-        storage.rd_frame_info_list = None
+        snapshot_storage.rd_frame_info_list = None
         snapshot_storage.rd_snapshot = Snapshot(None, boxes)
 
 #
@@ -365,6 +365,7 @@
         self.liveboxes = {}
         storage.rd_numb = numb
         self.snapshot_storage.rd_snapshot = None
+        storage.rd_frame_info_list = self.snapshot_storage.rd_frame_info_list
 
         # collect liveboxes and virtuals
         n = len(liveboxes_from_env) - v
diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -2764,7 +2764,8 @@
             return i
         #
         seen = []
-        def my_optimize_trace(metainterp_sd, loop, enable_opts, *args, **kwds):
+        def my_optimize_trace(metainterp_sd, jitdriver_sd, loop, enable_opts,
+                              *args, **kwds):
             seen.append('unroll' in enable_opts)
             raise InvalidLoop
         old_optimize_trace = optimizeopt.optimize_trace


More information about the pypy-commit mailing list