[pypy-commit] pypy vmprof2: improve the tests for enter_portal_frame
fijal
noreply at buildbot.pypy.org
Fri Apr 17 15:56:47 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: vmprof2
Changeset: r76817:e521ae5f23f5
Date: 2015-04-17 15:56 +0200
http://bitbucket.org/pypy/pypy/changeset/e521ae5f23f5/
Log: improve the tests for enter_portal_frame
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,7 +1025,7 @@
else:
stats.add_merge_point_location(args[1:])
- def execute_enter_portal_frame(self, descr, arg):
+ def execute_enter_portal_frame(self, descr, *args):
pass
def execute_leave_portal_frame(self, descr):
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
@@ -884,6 +884,8 @@
insns[opname] = insns.get(opname, 0) + 1
if expected is not None:
insns.pop('debug_merge_point', None)
+ insns.pop('enter_portal_frame', None)
+ insns.pop('leave_portal_frame', None)
assert insns == expected
for insn, expected_count in check.items():
getattr(rop, insn.upper()) # fails if 'rop.INSN' does not exist
@@ -901,6 +903,8 @@
def _check_insns(self, insns, expected, check):
if expected is not None:
insns.pop('debug_merge_point', None)
+ insns.pop('enter_portal_frame', None)
+ insns.pop('leave_portal_frame', None)
insns.pop('label', None)
assert insns == expected
for insn, expected_count in check.items():
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
@@ -1771,22 +1771,23 @@
def perform_call(self, jitcode, boxes, greenkey=None):
# causes the metainterp to enter the given subfunction
- 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 = self.newframe(jitcode, greenkey)
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, unique_id=-1):
+ def newframe(self, jitcode, greenkey=None):
if jitcode.jitdriver_sd:
self.portal_call_depth += 1
self.call_ids.append(self.current_call_id)
- self.enter_portal_frame(unique_id)
+ unique_id = -1
+ if greenkey is not None:
+ unique_id = jitcode.jitdriver_sd.warmstate.get_unique_id(
+ greenkey)
+ jd_no = jitcode.jitdriver_sd.index
+ self.enter_portal_frame(jd_no, unique_id)
self.current_call_id += 1
if greenkey is not None and self.is_main_jitcode(jitcode):
self.portal_trace_positions.append(
@@ -1799,9 +1800,9 @@
self.framestack.append(f)
return f
- def enter_portal_frame(self, unique_id):
+ def enter_portal_frame(self, jd_no, unique_id):
self.history.record(rop.ENTER_PORTAL_FRAME,
- [ConstInt(unique_id)], None)
+ [ConstInt(jd_no), ConstInt(unique_id)], None)
def leave_portal_frame(self):
self.history.record(rop.LEAVE_PORTAL_FRAME, [], None)
@@ -2514,10 +2515,7 @@
# ----- make a new frame -----
self.portal_call_depth = -1 # always one portal around
self.framestack = []
- 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 = self.newframe(self.jitdriver_sd.mainjitcode)
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,7 +522,7 @@
'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
+ 'ENTER_PORTAL_FRAME/2', # debugging only
'LEAVE_PORTAL_FRAME/0', # debugging only
'JIT_DEBUG/*', # debugging only
'VIRTUAL_REF_FINISH/2', # removed before it's passed to the backend
diff --git a/rpython/jit/metainterp/test/test_jitdriver.py b/rpython/jit/metainterp/test/test_jitdriver.py
--- a/rpython/jit/metainterp/test/test_jitdriver.py
+++ b/rpython/jit/metainterp/test/test_jitdriver.py
@@ -195,21 +195,24 @@
driver = JitDriver(greens=["pc"], reds='auto',
get_unique_id=get_unique_id)
- def f():
+ def f(arg):
i = 0
pc = 0
- while i < 10:
+ while i < 30 and pc < 3:
driver.jit_merge_point(pc=pc)
pc += 1
- if pc == 3:
+ if arg == 0 and pc == 3:
pc = 0
+ if arg == 0:
+ f(1)
i += 1
- self.meta_interp(f, [])
- loop = get_stats().loops[0]
+ self.meta_interp(f, [0], inline=True)
+ loop = get_stats().loops[1]
for op in loop.operations:
- if op.getopname() == 'debug_merge_point':
- assert op.getarg(3).getint() == op.getarg(4).getint() + 1
-
+ if op.getopname() == 'enter_portal_frame':
+ assert op.getarg(0).getint() == 0
+ assert op.getarg(1).getint() == 1
+
class TestLLtype(MultipleJitDriversTests, LLJitMixin):
pass
More information about the pypy-commit
mailing list