Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: resume-refactor
Changeset: r68668:47e28c4e00ed
Date: 2014-01-14 14:35 +0100
http://bitbucket.org/pypy/pypy/changeset/47e28c4e00ed/

Log:    (fijal, rguillebert) few fixes to pass test_loop

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
@@ -756,6 +756,12 @@
         self.inputlocs = None
         self.operations = []
 
+    def any_operation(self):
+        for op in self.operations:
+            if not op.is_resume():
+                return True
+        return False
+
     def record(self, opnum, argboxes, resbox, descr=None):
         op = ResOperation(opnum, argboxes, resbox, descr)
         self.operations.append(op)
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
@@ -109,7 +109,9 @@
             elif box.type == history.FLOAT: self.registers_f[index] = box
             else: raise AssertionError(box.type)
 
-    def get_current_position_info(self):
+    def get_current_position_info(self, resumepc=-1):
+        if resumepc != -1:
+            return self.jitcode.get_live_vars_info(resumepc)
         return self.jitcode.get_live_vars_info(self.pc)
 
     def replace_active_box_in_frame(self, oldbox, newbox):
@@ -982,7 +984,7 @@
     @arguments("int", "boxes3", "jitcode_position", "boxes3", "orgpc")
     def opimpl_jit_merge_point(self, jdindex, greenboxes,
                                jcposition, redboxes, orgpc):
-        any_operation = len(self.metainterp.history.operations) > 0
+        any_operation = self.metainterp.history.any_operation()
         jitdriver_sd = self.metainterp.staticdata.jitdrivers_sd[jdindex]
         self.verify_green_args(jitdriver_sd, greenboxes)
         self.debug_merge_point(jitdriver_sd, jdindex,
@@ -1622,7 +1624,6 @@
         self.retracing_from = -1
         self.call_pure_results = args_dict_box()
         self.heapcache = HeapCache()
-        self.resumerecorder = ResumeRecorder(self)
 
         self.call_ids = []
         self.current_call_id = 0
@@ -2038,6 +2039,7 @@
                 duplicates[box] = None
 
     def reached_loop_header(self, greenboxes, redboxes, resumedescr):
+        self.resumerecorder.leave_frame()
         self.heapcache.reset()
 
         duplicates = {}
@@ -2102,6 +2104,7 @@
         # Otherwise, no loop found so far, so continue tracing.
         start = len(self.history.operations)
         self.current_merge_points.append((live_arg_boxes, start))
+        self.resumerecorder.enter_frame(-1, self.jitdriver_sd.mainjitcode)
 
     def _unpack_boxes(self, boxes, start, stop):
         ints = []; refs = []; floats = []
@@ -2335,6 +2338,7 @@
         # ----- make a new frame -----
         self.portal_call_depth = -1 # always one portal around
         self.framestack = []
+        self.resumerecorder = ResumeRecorder(self, False)
         f = self.newframe(self.jitdriver_sd.mainjitcode)
         f.setup_call(original_boxes)
         assert self.portal_call_depth == 0
@@ -2352,6 +2356,7 @@
             self.history = history.History()
             state = self.rebuild_state_after_failure(resumedescr, deadframe)
             self.history.inputframes, self.history.inputlocs = state
+            self.resumerecorder = ResumeRecorder(self, True)
         finally:
             rstack._stack_criticalcode_stop()
 
diff --git a/rpython/jit/metainterp/resume2.py 
b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -236,9 +236,12 @@
 class ResumeRecorder(object):
     """ Created by metainterp to record the resume as we record operations
     """
-    def __init__(self, metainterp):
+    def __init__(self, metainterp, is_bridge=False):
         self.metainterp = metainterp
         self.cachestack = []
+        if is_bridge:
+            for frame in metainterp.framestack:
+                self.cachestack.append([None] * frame.jitcode.num_regs())
 
     def enter_frame(self, pc, jitcode):
         self.metainterp.history.record(rop.ENTER_FRAME, [ConstInt(pc)], None,
@@ -252,7 +255,8 @@
     def resume_point(self, resumedescr, resumepc):
         framestack = self.metainterp.framestack
         for i, frame in enumerate(framestack):
-            self._emit_resume_data(resumepc, frame, i, not i == 
len(framestack))
+            in_a_call = not i == len(framestack) - 1
+            self._emit_resume_data(resumepc, frame, i, in_a_call)
 
     def process_box(self, index_in_frontend, frame_pos, box):
         cache = self.cachestack[frame_pos]
@@ -278,10 +282,13 @@
             elif argcode == 'f': frame.registers_f[index] = history.CONST_FZERO
             frame._result_argcode = '?'     # done
         #
-        info = frame.get_current_position_info()
+        if not in_a_call and resume_pc != -1:
+            info = frame.get_current_position_info(resume_pc)
+        else:
+            info = frame.get_current_position_info()
         start_i = 0
-        start_r = start_i + info.get_register_count_i()
-        start_f = start_r + info.get_register_count_r()
+        start_r = start_i + frame.jitcode.num_regs_i()
+        start_f = start_r + frame.jitcode.num_regs_r()
         # fill it now
         for i in range(info.get_register_count_i()):
             index = info.get_register_index_i(i)
@@ -289,11 +296,11 @@
         for i in range(info.get_register_count_r()):
             index = info.get_register_index_r(i)
             self.process_box(index + start_r, frame_pos,
-                             frame.registers_i[index])
+                             frame.registers_r[index])
         for i in range(info.get_register_count_f()):
             index = info.get_register_index_f(i)
             self.process_box(index + start_f, frame_pos,
-                             frame.registers_i[index])
+                             frame.registers_f[index])
 
         mi_history = self.metainterp.history
         cache = self.cachestack[frame_pos]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to