[pypy-commit] pypy vmprof2: in-progress try making enter/leave instead of relying on DMP

fijal noreply at buildbot.pypy.org
Fri Apr 17 15:56:46 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: vmprof2
Changeset: r76816:1178d8344723
Date: 2015-04-17 14:16 +0200
http://bitbucket.org/pypy/pypy/changeset/1178d8344723/

Log:	in-progress try making enter/leave instead of relying on DMP

diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -1025,6 +1025,12 @@
         else:
             stats.add_merge_point_location(args[1:])
 
+    def execute_enter_portal_frame(self, descr, arg):
+        pass
+
+    def execute_leave_portal_frame(self, descr):
+        pass
+
     def execute_new_with_vtable(self, _, vtable):
         descr = heaptracker.vtable2descr(self.cpu, vtable)
         return self.cpu.bh_new_with_vtable(vtable, descr)
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
@@ -329,6 +329,8 @@
                          rop.ZERO_ARRAY,
                          rop.DEBUG_MERGE_POINT,
                          rop.JIT_DEBUG,
+                         rop.ENTER_PORTAL_FRAME,
+                         rop.LEAVE_PORTAL_FRAME,
                          rop.SETARRAYITEM_RAW,
                          rop.SETINTERIORFIELD_RAW,
                          rop.CALL_RELEASE_GIL,
diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py
--- a/rpython/jit/metainterp/logger.py
+++ b/rpython/jit/metainterp/logger.py
@@ -134,7 +134,7 @@
     def repr_of_resop(self, op, ops_offset=None):
         if op.getopnum() == rop.DEBUG_MERGE_POINT:
             jd_sd = self.metainterp_sd.jitdrivers_sd[op.getarg(0).getint()]
-            s = jd_sd.warmstate.get_location_str(op.getarglist()[4:])
+            s = jd_sd.warmstate.get_location_str(op.getarglist()[3:])
             s = s.replace(',', '.') # we use comma for argument splitting
             return "debug_merge_point(%d, %d, '%s')" % (op.getarg(1).getint(), op.getarg(2).getint(), s)
         if op.getopnum() == rop.JIT_DEBUG:
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
@@ -1180,9 +1180,8 @@
         # Note: the logger hides the jd_index argument, so we see in the logs:
         #    debug_merge_point(portal_call_depth, current_call_id, 'location')
         #
-        unique_id = jitdriver_sd.warmstate.get_unique_id(greenkey)
         args = [ConstInt(jd_index), ConstInt(portal_call_depth),
-                ConstInt(current_call_id), ConstInt(unique_id)] + greenkey
+                ConstInt(current_call_id)] + greenkey
         self.metainterp.history.record(rop.DEBUG_MERGE_POINT, args, None)
 
     @arguments("box", "label")
@@ -1772,17 +1771,22 @@
 
     def perform_call(self, jitcode, boxes, greenkey=None):
         # causes the metainterp to enter the given subfunction
-        f = self.newframe(jitcode, greenkey)
+        if greenkey is not None:
+            unique_id = jitcode.jitdriver_sd.warmstate.get_unique_id(greenkey)
+        else:
+            unique_id = -1
+        f = self.newframe(jitcode, greenkey, unique_id)
         f.setup_call(boxes)
         raise ChangeFrame
 
     def is_main_jitcode(self, jitcode):
         return self.jitdriver_sd is not None and jitcode is self.jitdriver_sd.mainjitcode
 
-    def newframe(self, jitcode, greenkey=None):
+    def newframe(self, jitcode, greenkey=None, unique_id=-1):
         if jitcode.jitdriver_sd:
             self.portal_call_depth += 1
             self.call_ids.append(self.current_call_id)
+            self.enter_portal_frame(unique_id)
             self.current_call_id += 1
         if greenkey is not None and self.is_main_jitcode(jitcode):
             self.portal_trace_positions.append(
@@ -1795,11 +1799,20 @@
         self.framestack.append(f)
         return f
 
+    def enter_portal_frame(self, unique_id):
+        self.history.record(rop.ENTER_PORTAL_FRAME,
+                            [ConstInt(unique_id)], None)
+
+    def leave_portal_frame(self):
+        self.history.record(rop.LEAVE_PORTAL_FRAME, [], None)
+
+
     def popframe(self):
         frame = self.framestack.pop()
         jitcode = frame.jitcode
         if jitcode.jitdriver_sd:
             self.portal_call_depth -= 1
+            self.leave_portal_frame()
             self.call_ids.pop()
         if frame.greenkey is not None and self.is_main_jitcode(jitcode):
             self.portal_trace_positions.append(
@@ -2501,7 +2514,10 @@
         # ----- make a new frame -----
         self.portal_call_depth = -1 # always one portal around
         self.framestack = []
-        f = self.newframe(self.jitdriver_sd.mainjitcode)
+        jitdriver_sd = self.jitdriver_sd
+        greenkey = original_boxes[:jitdriver_sd.num_green_args]
+        unique_id = jitdriver_sd.warmstate.get_unique_id(greenkey)
+        f = self.newframe(self.jitdriver_sd.mainjitcode, None, unique_id)
         f.setup_call(original_boxes)
         assert self.portal_call_depth == 0
         self.virtualref_boxes = []
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
@@ -522,6 +522,8 @@
     'COND_CALL_GC_WB/1d',       # [objptr] (for the write barrier)
     'COND_CALL_GC_WB_ARRAY/2d', # [objptr, arrayindex] (write barr. for array)
     'DEBUG_MERGE_POINT/*',      # debugging only
+    'ENTER_PORTAL_FRAME/1',     # debugging only
+    'LEAVE_PORTAL_FRAME/0',     # 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


More information about the pypy-commit mailing list