Author: Maciej Fijalkowski <[email protected]>
Branch: vmprof2
Changeset: r76818:680943462021
Date: 2015-04-17 16:31 +0200
http://bitbucket.org/pypy/pypy/changeset/680943462021/

Log:    exchange the logic with something much simpler

diff --git a/rpython/jit/backend/arm/assembler.py 
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -575,8 +575,8 @@
             self.mc.BL(self.stack_check_slowpath, c=c.HI)      # call if ip > 
lr
 
     # cpu interface
-    def assemble_loop(self, logger, loopname, inputargs, operations, looptoken,
-                      log):
+    def assemble_loop(self, jd_id, unique_id, logger, loopname, inputargs,
+                      operations, looptoken, log):
         clt = CompiledLoopToken(self.cpu, looptoken.number)
         looptoken.compiled_loop_token = clt
         clt._debug_nbargs = len(inputargs)
@@ -586,6 +586,9 @@
             assert len(set(inputargs)) == len(inputargs)
 
         self.setup(looptoken)
+        self.codemap_builder.enter_portal_frame(jd_id, unique_id,
+                                        self.mc.get_relative_pos())
+
 
         frame_info = self.datablockwrapper.malloc_aligned(
             jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
diff --git a/rpython/jit/backend/arm/regalloc.py 
b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -373,6 +373,12 @@
         return gcmap
 
     # ------------------------------------------------------------
+    def perform_enter_portal_frame(self, op):
+        self.assembler.enter_portal_frame(op)
+
+    def perform_leave_portal_frame(self, op):
+        self.assembler.leave_portal_frame(op)
+
     def perform_extra(self, op, args, fcond):
         return self.assembler.regalloc_emit_extra(op, args, fcond, self)
 
@@ -392,9 +398,6 @@
         else:
             self.rm._sync_var(v)
 
-    def prepare_op_debug_merge_point(self, op, fcond):
-        self.assembler.codemap.debug_merge_point(op)
-
     def _prepare_op_int_add(self, op, fcond):
         boxes = op.getarglist()
         a0, a1 = boxes
diff --git a/rpython/jit/backend/arm/runner.py 
b/rpython/jit/backend/arm/runner.py
--- a/rpython/jit/backend/arm/runner.py
+++ b/rpython/jit/backend/arm/runner.py
@@ -56,11 +56,6 @@
     def finish_once(self):
         self.assembler.finish_once()
 
-    def compile_loop(self, inputargs, operations, looptoken,
-                     log=True, name='', logger=None):
-        return self.assembler.assemble_loop(logger, name, inputargs, 
operations,
-                                            looptoken, log=log)
-
     def compile_bridge(self, faildescr, inputargs, operations,
                        original_loop_token, log=True, logger=None):
         clt = original_loop_token.compiled_loop_token
diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -199,11 +199,15 @@
         guardtok.faildescr.rd_locs = positions
         return fail_descr, target
 
-    def debug_merge_point(self, op):
-        self.codemap_builder.debug_merge_point(op.getarg(1).getint(),
-                                               op.getarg(3).getint(),
+    def enter_portal_frame(self, op):
+        self.codemap_builder.debug_merge_point(op.getarg(0).getint(),
+                                               op.getarg(1).getint(),
                                                self.mc.get_relative_pos())
 
+    def leave_portal_frame(self, op):
+        self.codemap_builder.leave_portal_frame(op.getarg(0).getint(),
+                                                self.mc.get_relative_pos())
+
     def call_assembler(self, op, guard_op, argloc, vloc, result_loc, tmploc):
         self._store_force_index(guard_op)
         descr = op.getdescr()
diff --git a/rpython/jit/backend/llsupport/codemap.py 
b/rpython/jit/backend/llsupport/codemap.py
--- a/rpython/jit/backend/llsupport/codemap.py
+++ b/rpython/jit/backend/llsupport/codemap.py
@@ -145,29 +145,21 @@
         self.patch_position = []
         self.last_call_depth = -1
 
-    def debug_merge_point(self, call_depth, unique_id, pos):
-        if call_depth != self.last_call_depth:
-            if unique_id == 0: # uninteresting case
-                return
-            assert unique_id & 1 == 0
-            if call_depth > self.last_call_depth:
-                assert call_depth == self.last_call_depth + 1
-                # ^^^ It should never be the case that we see
-                # debug_merge_points that suddenly go more than *one*
-                # call deeper than the previous one (unless we're at
-                # the start of a bridge, handled by
-                # inherit_code_from_position()).
-                self.l.append(unique_id)
-                self.l.append(pos) # <- this is a relative pos
-                self.patch_position.append(len(self.l))
-                self.l.append(0) # marker
-                self.l.append(0) # second marker
-            else:
-                for i in range(self.last_call_depth - call_depth):
-                    to_patch = self.patch_position.pop()
-                    self.l[to_patch] = pos
-                    self.l[to_patch + 1] = len(self.l)
-            self.last_call_depth = call_depth
+    def enter_portal_frame(self, jd_id, unique_id, relpos):
+        if jd_id != 0:
+            return
+        self.l.append(unique_id)
+        self.l.append(relpos)
+        self.patch_position.append(len(self.l))
+        self.l.append(0) # marker
+        self.l.append(0) # second marker
+
+    def leave_portal_frame(self, jd_id, relpos):
+        if jd_id != 0:
+            return
+        to_patch = self.patch_position.pop()
+        self.l[to_patch] = relpos
+        self.l[to_patch + 1] = len(self.l)
 
     def inherit_code_from_position(self, pos):
         lst = unpack_traceback(pos)
diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -82,6 +82,12 @@
     def finish_once(self):
         self.codemap.finish_once()
 
+    def compile_loop(self, jd_id, unique_id, inputargs, operations, looptoken,
+                     log=True, name='', logger=None):
+        return self.assembler.assemble_loop(jd_id, unique_id, logger, name,
+                                            inputargs, operations,
+                                            looptoken, log=log)
+
     def _setup_frame_realloc(self, translate_support_code):
         FUNC_TP = lltype.Ptr(lltype.FuncType([llmemory.GCREF, lltype.Signed],
                                              llmemory.GCREF))
diff --git a/rpython/jit/backend/llsupport/rewrite.py 
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -67,6 +67,8 @@
                 self.emit_pending_zeros()
             elif op.can_malloc():
                 self.emitting_an_operation_that_can_collect()
+            elif op.getopnum() == rop.DEBUG_MERGE_POINT:
+                continue # ignore debug_merge_points
             elif op.getopnum() == rop.LABEL:
                 self.emitting_an_operation_that_can_collect()
                 self.known_lengths.clear()
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -51,7 +51,7 @@
         """
         return False
 
-    def compile_loop(self, inputargs, operations, looptoken,
+    def compile_loop(self, jd_id, unique_id, inputargs, operations, looptoken,
                      log=True, name='', logger=None):
         """Assemble the given loop.
         Should create and attach a fresh CompiledLoopToken to
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
@@ -438,8 +438,8 @@
             self.wb_slowpath[withcards + 2 * withfloats] = rawstart
 
     @rgc.no_release_gil
-    def assemble_loop(self, inputargs, operations, looptoken, log,
-                      loopname, logger):
+    def assemble_loop(self, jd_id, unique_id, logger, loopname, inputargs,
+                      operations, looptoken, log):
         '''adds the following attributes to looptoken:
                _ll_function_addr    (address of the generated func, as an int)
                _ll_loop_code       (debug: addr of the start of the ResOps)
@@ -457,7 +457,8 @@
             assert len(set(inputargs)) == len(inputargs)
 
         self.setup(looptoken)
-
+        self.codemap_builder.enter_portal_frame(jd_id, unique_id,
+                                                self.mc.get_relative_pos())
         frame_info = self.datablockwrapper.malloc_aligned(
             jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
         clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info)
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
@@ -1323,8 +1323,11 @@
         self.possibly_free_vars_for_op(op)
         assembler.closing_jump(self.jump_target_descr)
 
-    def consider_debug_merge_point(self, op):
-        self.assembler.debug_merge_point(op)
+    def consider_enter_portal_frame(self, op):
+        self.assembler.enter_portal_frame(op)
+
+    def consider_leave_portal_frame(self, op):
+        self.assembler.leave_portal_frame(op)
 
     def consider_jit_debug(self, op):
         pass
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -92,11 +92,6 @@
         lines = machine_code_dump(data, addr, self.backend_name, label_list)
         print ''.join(lines)
 
-    def compile_loop(self, inputargs, operations, looptoken, log=True,
-                     name='', logger=None):
-        return self.assembler.assemble_loop(inputargs, operations, looptoken, 
log,
-                                            name, logger)
-
     def compile_bridge(self, faildescr, inputargs, operations,
                        original_loop_token, log=True, logger=None):
         clt = original_loop_token.compiled_loop_token
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
@@ -303,11 +303,12 @@
             token.original_jitcell_token = trace.original_jitcell_token
 
 
-def do_compile_loop(metainterp_sd, inputargs, operations, looptoken,
-                    log=True, name=''):
+def do_compile_loop(jd_id, unique_id, metainterp_sd, inputargs, operations,
+                    looptoken, log=True, name=''):
     metainterp_sd.logger_ops.log_loop(inputargs, operations, -2,
                                       'compiling', name=name)
-    return metainterp_sd.cpu.compile_loop(inputargs, operations, looptoken,
+    return metainterp_sd.cpu.compile_loop(jd_id, unique_id, inputargs,
+                                          operations, looptoken,
                                           log=log, name=name,
                                           logger=metainterp_sd.logger_ops)
 
@@ -347,7 +348,9 @@
     debug_start("jit-backend")
     try:
         loopname = jitdriver_sd.warmstate.get_location_str(greenkey)
-        asminfo = do_compile_loop(metainterp_sd, loop.inputargs,
+        unique_id = jitdriver_sd.warmstate.get_unique_id(greenkey)
+        asminfo = do_compile_loop(jitdriver_sd.index, unique_id, metainterp_sd,
+                                  loop.inputargs,
                                   operations, original_jitcell_token,
                                   name=loopname)
     finally:
@@ -925,7 +928,7 @@
     ]
     operations[1].setfailargs([])
     operations = get_deep_immutable_oplist(operations)
-    cpu.compile_loop(inputargs, operations, jitcell_token, log=False)
+    cpu.compile_loop(0, -1, inputargs, operations, jitcell_token, log=False)
     if memory_manager is not None:    # for tests
         memory_manager.keep_loop_alive(jitcell_token)
     return jitcell_token
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
@@ -1804,8 +1804,8 @@
         self.history.record(rop.ENTER_PORTAL_FRAME,
                             [ConstInt(jd_no), ConstInt(unique_id)], None)
 
-    def leave_portal_frame(self):
-        self.history.record(rop.LEAVE_PORTAL_FRAME, [], None)
+    def leave_portal_frame(self, jd_no):
+        self.history.record(rop.LEAVE_PORTAL_FRAME, [ConstInt(jd_no)], None)
 
 
     def popframe(self):
@@ -1813,7 +1813,7 @@
         jitcode = frame.jitcode
         if jitcode.jitdriver_sd:
             self.portal_call_depth -= 1
-            self.leave_portal_frame()
+            self.leave_portal_frame(jitcode.jitdriver_sd.index)
             self.call_ids.pop()
         if frame.greenkey is not None and self.is_main_jitcode(jitcode):
             self.portal_trace_positions.append(
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
@@ -523,7 +523,7 @@
     'COND_CALL_GC_WB_ARRAY/2d', # [objptr, arrayindex] (write barr. for array)
     'DEBUG_MERGE_POINT/*',      # debugging only
     'ENTER_PORTAL_FRAME/2',     # debugging only
-    'LEAVE_PORTAL_FRAME/0',     # debugging only
+    'LEAVE_PORTAL_FRAME/1',     # debugging only
     'JIT_DEBUG/*',              # debugging only
     'VIRTUAL_REF_FINISH/2',   # removed before it's passed to the backend
     'COPYSTRCONTENT/5',       # src, dst, srcstart, dststart, length
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to