Author: Maciej Fijalkowski <[email protected]>
Branch: kill-gen-store-back-in
Changeset: r64576:7c4ed9c84edd
Date: 2013-05-27 12:30 +0200
http://bitbucket.org/pypy/pypy/changeset/7c4ed9c84edd/

Log:    use a different guard name, so the optimizer does not get confused.
        Saves some hacks, but is definitely not pretty

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
@@ -787,6 +787,7 @@
             saved_data = self.forced_deadframe._saved_data
             self.fail_guard(descr, saved_data)
         self.force_guard_op = self.current_op
+    execute_guard_not_forced_2 = execute_guard_not_forced
 
     def execute_guard_not_invalidated(self, descr):
         if self.lltrace.invalid:
@@ -922,6 +923,16 @@
         #
         # Emulate the fast path
         #
+        faildescr = self.cpu.get_latest_descr(pframe)
+        if faildescr == self.cpu.done_with_this_frame_descr_int:
+            return self.cpu.get_int_value(pframe, 0)
+        elif faildescr == self.cpu.done_with_this_frame_descr_ref:
+            return self.cpu.get_ref_value(pframe, 0)
+        elif faildescr == self.cpu.done_with_this_frame_descr_float:
+            return self.cpu.get_float_value(pframe, 0)
+        elif faildescr == self.cpu.done_with_this_frame_descr_void:
+            return None
+
         assembler_helper_ptr = jd.assembler_helper_adr.ptr  # fish
         try:
             result = assembler_helper_ptr(pframe, vable)
diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1336,7 +1336,7 @@
         #if jump_op is not None and jump_op.getdescr() is descr:
         #    self._compute_hint_frame_locations_from_descr(descr)
 
-    def consider_guard_not_forced(self, op):
+    def consider_guard_not_forced_2(self, op):
         self.rm.before_call([], save_all_regs=True)
         fail_locs = [self.loc(v) for v in op.getfailargs()]
         self.assembler.store_force_descr(op, fail_locs,
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5102,6 +5102,15 @@
         }
         self.optimize_loop(ops, expected, call_pure_results)
 
+    def test_guard_not_forced_2_virtual(self):
+        ops = """
+        [i0]
+        p0 = new_array(3, descr=arraydescr)
+        guard_not_forced_2() [p0]
+        finish(p0)
+        """
+        self.optimize_loop(ops, ops)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -481,6 +481,8 @@
 class OptVirtualize(optimizer.Optimization):
     "Virtualize objects until they escape."
 
+    _last_guard_not_forced = None
+
     def new(self):
         return OptVirtualize()
 
@@ -524,6 +526,18 @@
             return
         self.emit_operation(op)
 
+    def optimize_GUARD_NOT_FORCED_2(self, op):
+        self._last_guard_not_forced = op
+
+    def optimize_FINISH(self, op):
+        if self._last_guard_not_forced is not None:
+            guard_op = self._last_guard_not_forced
+            self.emit_operation(op)
+            guard_op = self.optimizer.store_final_boxes_in_guard(guard_op)
+            self.optimizer._newoperations.insert(-1, guard_op)
+        else:
+            self.emit_operation(op)
+
     def optimize_FORCE_VIRTUALIZABLE(self, op):
         val = self.getvalue(op.getarg(0))
         if val.is_virtual():
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
@@ -1741,7 +1741,7 @@
         else:
             moreargs = list(extraargs)
         metainterp_sd = self.staticdata
-        if opnum == rop.GUARD_NOT_FORCED:
+        if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2:
             resumedescr = compile.ResumeGuardForcedDescr(metainterp_sd,
                                                          self.jitdriver_sd)
         elif opnum == rop.GUARD_NOT_INVALIDATED:
@@ -2281,7 +2281,7 @@
         self.history.record(rop.FORCE_TOKEN, [], force_token_box)
         self.history.record(rop.SETFIELD_GC, [vbox, force_token_box],
                             None, descr=vinfo.vable_token_descr)
-        self.generate_guard(rop.GUARD_NOT_FORCED, None)
+        self.generate_guard(rop.GUARD_NOT_FORCED_2, None)
 
     def compile_exit_frame_with_exception(self, valuebox):
         self.store_token_in_vable()
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
@@ -395,6 +395,7 @@
     'GUARD_NO_OVERFLOW/0d',
     'GUARD_OVERFLOW/0d',
     'GUARD_NOT_FORCED/0d',      # may be called with an exception currently set
+    'GUARD_NOT_FORCED_2/0d',    # same as GUARD_NOT_FORCED, but for finish()
     'GUARD_NOT_INVALIDATED/0d',
     '_GUARD_LAST', # ----- end of guard operations -----
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to