[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