[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