Author: fijal
Branch: jit-leaner-frontend
Changeset: r83051:18ea5495a9de
Date: 2016-03-14 21:02 +0200
http://bitbucket.org/pypy/pypy/changeset/18ea5495a9de/

Log:    try a much simpler implementation for resop in the frontend (ideally
        dying completely)

diff --git a/rpython/jit/metainterp/history.py 
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -672,12 +672,13 @@
         self.trace = Trace(inpargs)
         self.inputargs = inpargs
         if self._cache:
-            xxx
             # hack to record the ops *after* we know our inputargs
             for op in self._cache:
                 newop = self.trace.record_op(op.getopnum(), op.getarglist(),
                                              op.getdescr())
                 op.position = newop.position
+                if op.type != 'v':
+                    newop.copy_value_from(op)
             self._cache = None
 
     def length(self):
@@ -692,29 +693,38 @@
     def any_operation(self):
         return self.trace._count > 0
 
+    @specialize.argtype(2)
+    def set_op_value(self, op, value):
+        if value is None:
+            return        
+        elif isinstance(value, bool):
+            op.setint(int(value))
+        elif lltype.typeOf(value) == lltype.Signed:
+            op.setint(value)
+        elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
+            op.setfloatstorage(value)
+        else:
+            assert lltype.typeOf(value) == llmemory.GCREF
+            op.setref_base(value)
+
     @specialize.argtype(3)
     def record(self, opnum, argboxes, value, descr=None):
         if self.trace is None:
-            xxx
             op = ResOperation(opnum, argboxes, -1, descr)
             self._cache.append(op)
         else:
             pos = self.trace._record_op(opnum, argboxes, descr)
-        if value is None:
-            op = FrontendOp(pos)
-        elif isinstance(value, bool):
-            op = IntFrontendOp(pos)
-            op.setint(int(value))
-        elif lltype.typeOf(value) == lltype.Signed:
-            op = IntFrontendOp(pos)
-            op.setint(value)
-        elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
-            op = FloatFrontendOp(pos)
-            op.setfloatstorage(value)
-        else:
-            op = RefFrontendOp(pos)
-            assert lltype.typeOf(value) == llmemory.GCREF
-            op.setref_base(value)
+            if value is None:
+                op = FrontendOp(pos)
+            elif isinstance(value, bool):
+                op = IntFrontendOp(pos)
+            elif lltype.typeOf(value) == lltype.Signed:
+                op = IntFrontendOp(pos)
+            elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
+                op = FloatFrontendOp(pos)
+            else:
+                op = RefFrontendOp(pos)
+        self.set_op_value(op, value)
         return op
 
     def record_nospec(self, opnum, argboxes, descr=None):
@@ -772,13 +782,14 @@
     enter_count = 0
     aborted_count = 0
 
-    def __init__(self):
+    def __init__(self, metainterp_sd):
         self.loops = []
         self.locations = []
         self.aborted_keys = []
         self.invalidated_token_numbers = set()    # <- not RPython
         self.jitcell_token_wrefs = []
         self.jitcell_dicts = []                   # <- not RPython
+        self.metainterp_sd = metainterp_sd
 
     def clear(self):
         del self.loops[:]
@@ -834,7 +845,7 @@
 
     def check_history(self, expected=None, **check):
         insns = {}
-        t = self.history.trace.get_iter()
+        t = self.history.trace.get_iter(self.metainterp_sd)
         while not t.done():
             op = t.next()
             opname = op.getopname()
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
@@ -1527,7 +1527,8 @@
         op = self.metainterp.execute_and_record_varargs(opnum, argboxes,
                                                             descr=descr)
         if pure and not self.metainterp.last_exc_value and op:
-            op = self.metainterp.record_result_of_call_pure(op, patch_pos)
+            op = self.metainterp.record_result_of_call_pure(op, argboxes, 
descr,
+                patch_pos)
             exc = exc and not isinstance(op, Const)
         if exc:
             if op is not None:
@@ -1620,7 +1621,7 @@
             vablebox = None
             if assembler_call:
                 vablebox, resbox = self.metainterp.direct_assembler_call(
-                    self.metainterp._last_op, assembler_call_jd, cut_pos)
+                    self.metainterp._last_op, allboxes, descr, 
assembler_call_jd, cut_pos)
             if resbox and resbox.type != 'v':
                 self.make_result_of_lastop(resbox)
             self.metainterp.vable_after_residual_call(funcbox)
@@ -2063,12 +2064,11 @@
                                            lltype.nullptr(llmemory.GCREF.TO))
         else:
             guard_op = self.history.record(opnum, moreargs, None)            
-        assert isinstance(guard_op, GuardResOp)
         self.capture_resumedata(resumepc)
         # ^^^ records extra to history
         self.staticdata.profiler.count_ops(opnum, Counters.GUARDS)
         # count
-        self.attach_debug_info(guard_op)
+        #self.attach_debug_info(guard_op)
         return guard_op
 
     def capture_resumedata(self, resumepc=-1):
@@ -2997,14 +2997,12 @@
         debug_stop("jit-abort-longest-function")
         return max_jdsd, max_key
 
-    def record_result_of_call_pure(self, op, patch_pos):
+    def record_result_of_call_pure(self, op, argboxes, descr, patch_pos):
         """ Patch a CALL into a CALL_PURE.
         """
-        opnum = op.getopnum()
-        assert opnum in [rop.CALL_R, rop.CALL_N, rop.CALL_I, rop.CALL_F]
         resbox_as_const = executor.constant_from_op(op)
-        for i in range(op.numargs()):
-            if not isinstance(op.getarg(i), Const):
+        for argbox in argboxes:
+            if not isinstance(argbox, Const):
                 break
         else:
             # all-constants: remove the CALL operation now and propagate a
@@ -3013,28 +3011,26 @@
             return resbox_as_const
         # not all constants (so far): turn CALL into CALL_PURE, which might
         # be either removed later by optimizeopt or turned back into CALL.
-        arg_consts = [executor.constant_from_op(a) for a in op.getarglist()]
+        arg_consts = [executor.constant_from_op(a) for a in argboxes]
         self.call_pure_results[arg_consts] = resbox_as_const
-        opnum = OpHelpers.call_pure_for_descr(op.getdescr())
+        opnum = OpHelpers.call_pure_for_descr(descr)
         self.history.cut(patch_pos)
-        newop = self.history.record_nospec(opnum, op.getarglist(), 
op.getdescr())
+        newop = self.history.record_nospec(opnum, argboxes, descr)
         newop.copy_value_from(op)
         return newop
 
-    def direct_assembler_call(self, op, targetjitdriver_sd, cut_pos):
+    def direct_assembler_call(self, op, arglist, descr, targetjitdriver_sd, 
cut_pos):
         """ Generate a direct call to assembler for portal entry point,
         patching the CALL_MAY_FORCE that occurred just now.
         """
         self.history.cut(cut_pos)
-        assert rop.is_call_may_force(op.getopnum())
         num_green_args = targetjitdriver_sd.num_green_args
-        arglist = op.getarglist()
         greenargs = arglist[1:num_green_args+1]
         args = arglist[num_green_args+1:]
         assert len(args) == targetjitdriver_sd.num_red_args
         warmrunnerstate = targetjitdriver_sd.warmstate
         token = warmrunnerstate.get_assembler_token(greenargs)
-        opnum = OpHelpers.call_assembler_for_descr(op.getdescr())
+        opnum = OpHelpers.call_assembler_for_descr(descr)
         oldop = op
         op = self.history.record_nospec(opnum, args, descr=token)
         if opnum == rop.CALL_ASSEMBLER_N:
diff --git a/rpython/jit/metainterp/test/support.py 
b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -73,7 +73,7 @@
         portal_runner_ptr = "???"
         vec = False
 
-    stats = history.Stats()
+    stats = history.Stats(None)
     cpu = CPUClass(rtyper, stats, None, False)
     cw = codewriter.CodeWriter(cpu, [FakeJitDriverSD()])
     cw.debug = True
@@ -99,6 +99,7 @@
         testself.finish_setup_for_interp_operations()
     #
     cw.make_jitcodes(verbose=True)
+    return stats
 
 def _run_with_blackhole(testself, args):
     from rpython.jit.metainterp.blackhole import BlackholeInterpBuilder
@@ -125,11 +126,13 @@
     blackholeinterp.run()
     return blackholeinterp._final_result_anytype()
 
-def _run_with_pyjitpl(testself, args):
+def _run_with_pyjitpl(testself, args, stats):
     cw = testself.cw
     opt = history.Options(listops=True)
     metainterp_sd = pyjitpl.MetaInterpStaticData(cw.cpu, opt)
+    stats.metainterp_sd = metainterp_sd
     metainterp_sd.finish_setup(cw)
+
     [jitdriver_sd] = metainterp_sd.jitdrivers_sd
     metainterp = pyjitpl.MetaInterp(metainterp_sd, jitdriver_sd)
     testself.metainterp = metainterp
@@ -258,11 +261,11 @@
 
     def interp_operations(self, f, args, **kwds):
         # get the JitCodes for the function f
-        _get_jitcodes(self, self.CPUClass, f, args, **kwds)
+        stats = _get_jitcodes(self, self.CPUClass, f, args, **kwds)
         # try to run it with blackhole.py
         result1 = _run_with_blackhole(self, args)
         # try to run it with pyjitpl.py
-        result2 = _run_with_pyjitpl(self, args)
+        result2 = _run_with_pyjitpl(self, args, stats)
         assert result1 == result2 or isnan(result1) and isnan(result2)
         # try to run it by running the code compiled just before
         df, result3 = _run_with_machine_code(self, args)
diff --git a/rpython/jit/metainterp/test/test_compile.py 
b/rpython/jit/metainterp/test/test_compile.py
--- a/rpython/jit/metainterp/test/test_compile.py
+++ b/rpython/jit/metainterp/test/test_compile.py
@@ -59,7 +59,7 @@
     logger_ops = FakeLogger()
     config = get_combined_translation_config(translating=True)
 
-    stats = Stats()
+    stats = Stats(None)
     profiler = jitprof.EmptyProfiler()
     warmrunnerdesc = None
     def log(self, msg, event_kind=None):
diff --git a/rpython/jit/metainterp/test/test_resume.py 
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -8,9 +8,9 @@
      tagged_list_eq, AbstractVirtualInfo, TAGCONST, NULLREF,\
      ResumeDataDirectReader, TAGINT, REF, VirtualInfo, VStructInfo,\
      VArrayInfoNotClear, VStrPlainInfo, VStrConcatInfo, VStrSliceInfo,\
-     VUniPlainInfo, VUniConcatInfo, VUniSliceInfo, Snapshot, FrameInfo,\
+     VUniPlainInfo, VUniConcatInfo, VUniSliceInfo,\
      capture_resumedata, ResumeDataLoopMemo, UNASSIGNEDVIRTUAL, INT,\
-     annlowlevel, PENDINGFIELDSP, unpack_uint, TAG_CONST_OFFSET, TopSnapshot
+     annlowlevel, PENDINGFIELDSP, TAG_CONST_OFFSET
 from rpython.jit.metainterp.resumecode import unpack_numbering,\
      create_numbering, NULL_NUMBER
 from rpython.jit.metainterp.opencoder import Trace
diff --git a/rpython/jit/metainterp/warmspot.py 
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -464,7 +464,7 @@
         if no_stats:
             stats = history.NoStats()
         else:
-            stats = history.Stats()
+            stats = history.Stats(None)
         self.stats = stats
         if translate_support_code:
             self.annhelper = MixLevelHelperAnnotator(self.translator.rtyper)
@@ -483,6 +483,7 @@
                                                   self.opt,
                                                   ProfilerClass=ProfilerClass,
                                                   warmrunnerdesc=self)
+        self.stats.metainterp_sd = self.metainterp_sd
 
     def make_virtualizable_infos(self):
         vinfos = {}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to