Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66152:86ed2339b723
Date: 2013-08-14 18:17 +0200
http://bitbucket.org/pypy/pypy/changeset/86ed2339b723/

Log:    trying to find all locations where gcrefs are encoded in the trace
        and make them non-movable.

diff --git a/rpython/jit/backend/arm/regalloc.py 
b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -626,7 +626,7 @@
         # the frame is in fp, but we have to point where in the frame is
         # the potential argument to FINISH
         descr = op.getdescr()
-        fail_descr = cast_instance_to_gcref(descr)
+        fail_descr = rgc.cast_instance_to_gcref(descr)
         # we know it does not move, but well
         fail_descr = rgc._make_sure_does_not_move(fail_descr)
         fail_descr = rgc.cast_gcref_to_int(fail_descr)
diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -172,8 +172,6 @@
                 break
         exc = guardtok.exc
         target = self.failure_recovery_code[exc + 2 * withfloats]
-        fail_descr = cast_instance_to_gcref(guardtok.faildescr)
-        fail_descr = rffi.cast(lltype.Signed, fail_descr)
         base_ofs = self.cpu.get_baseofs_of_frame_field()
         positions = [0] * len(guardtok.fail_locs)
         for i, loc in enumerate(guardtok.fail_locs):
@@ -196,6 +194,11 @@
         guardtok.faildescr.rd_locs = positions
         # we want the descr to keep alive
         guardtok.faildescr.rd_loop_token = self.current_clt
+        fail_descr = rgc.cast_instance_to_gcref(guardtok.faildescr)
+        if self.cpu.gc_ll_descr.stm:
+            # only needed with STM, I think..
+            fail_descr = rgc._make_sure_does_not_move(fail_descr)
+        fail_descr = rgc.cast_gcref_to_int(fail_descr)
         return fail_descr, target
 
     def call_assembler(self, op, guard_op, argloc, vloc, result_loc, tmploc):
@@ -226,9 +229,9 @@
             else:
                 raise AssertionError(kind)
 
-        gcref = cast_instance_to_gcref(value)
+        gcref = rgc.cast_instance_to_gcref(value)
         gcref = rgc._make_sure_does_not_move(gcref)
-        value = rffi.cast(lltype.Signed, gcref)
+        value = rgc.cast_gcref_to_int(gcref)
         je_location = self._call_assembler_check_descr(value, tmploc)
         #
         # Path A: use assembler_helper_adr
diff --git a/rpython/jit/backend/llsupport/gc.py 
b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -102,19 +102,23 @@
         for i in range(op.numargs()):
             v = op.getarg(i)
             if isinstance(v, ConstPtr) and bool(v.value):
-                p = v.value
+                p = rgc.cast_instance_to_gcref(v.value)
                 new_p = rgc._make_sure_does_not_move(p)
-                v.value = new_p
+                if we_are_translated():
+                    v.value = new_p
+                else:
+                    assert p == new_p
                 gcrefs_output_list.append(new_p)
                 
         if op.is_guard() or op.getopnum() == rop.FINISH:
             # the only ops with descrs that get recorded in a trace
             from rpython.jit.metainterp.history import AbstractDescr
             descr = op.getdescr()
-            llref = cast_instance_to_gcref(descr)
+            llref = rgc.cast_instance_to_gcref(descr)
             new_llref = rgc._make_sure_does_not_move(llref)
             if we_are_translated():
-                new_d = cast_base_ptr_to_instance(AbstractDescr, new_llref)
+                new_d = rgc.try_cast_gcref_to_instance(AbstractDescr,
+                                                       new_llref)
                 # tests don't allow this:
                 op.setdescr(new_d)
             else:
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -249,8 +249,9 @@
         self._store_and_reset_exception(self.mc, eax)
         ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
         self.mc.MOV_br(ofs, eax.value)
-        propagate_exception_descr = rffi.cast(lltype.Signed,
-                  cast_instance_to_gcref(self.cpu.propagate_exception_descr))
+        propagate_exception_descr = rgc.cast_gcref_to_int(
+            rgc._make_sure_does_not_move(
+                
rgc.cast_instance_to_gcref(self.cpu.propagate_exception_descr)))
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
         self.mc.MOV(RawEbpLoc(ofs), imm(propagate_exception_descr))
         self.mc.MOV_rr(eax.value, ebp.value)
@@ -2202,6 +2203,15 @@
 
     def _call_assembler_check_descr(self, value, tmploc):
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
+
+        if self.cpu.gc_ll_descr.stm:
+            # value is non-moving, but jf_descr may have a changed
+            # descr -> different copy
+            self._stm_ptr_eq_fastpath(self.mc, [mem(eax, ofs), imm(value)],
+                                      tmploc)
+            self.mc.J_il8(rx86.Conditions['NZ'], 0)
+            return self.mc.get_relative_pos()
+        
         self.mc.CMP(mem(eax, ofs), imm(value))
         # patched later
         self.mc.J_il8(rx86.Conditions['E'], 0) # goto B if we get 
'done_with_this_frame'
diff --git a/rpython/jit/backend/x86/rx86.py b/rpython/jit/backend/x86/rx86.py
--- a/rpython/jit/backend/x86/rx86.py
+++ b/rpython/jit/backend/x86/rx86.py
@@ -539,6 +539,7 @@
 
     PUSH_r = insn(rex_nw, register(1), '\x50')
     PUSH_b = insn(rex_nw, '\xFF', orbyte(6<<3), stack_bp(1))
+    PUSH_m = insn(rex_nw, '\xFF', orbyte(6<<3), mem_reg_plus_const(1))
     PUSH_i8 = insn('\x6A', immediate(1, 'b'))
     PUSH_i32 = insn('\x68', immediate(1, 'i'))
     def PUSH_i(mc, immed):
@@ -549,6 +550,7 @@
 
     POP_r = insn(rex_nw, register(1), '\x58')
     POP_b = insn(rex_nw, '\x8F', orbyte(0<<3), stack_bp(1))
+    POP_m = insn(rex_nw, '\x8F', orbyte(0<<3), mem_reg_plus_const(1))
 
     LEA_rb = insn(rex_w, '\x8D', register(1,8), stack_bp(2))
     LEA_rs = insn(rex_w, '\x8D', register(1,8), stack_sp(2))
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py 
b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -1,5 +1,5 @@
 import py
-from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, rstr
+from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, rstr, rclass
 from rpython.jit.metainterp.history import ResOperation, TargetToken,\
      JitCellToken
 from rpython.jit.metainterp.history import (BoxInt, BoxPtr, ConstInt,
@@ -21,6 +21,7 @@
 from rpython.memory.gc.stmgc import StmGC
 from rpython.jit.metainterp import history
 from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.rtyper.llinterp import LLException
 import itertools, sys
 import ctypes
 
@@ -219,6 +220,17 @@
         cpu = CPU(None, None)
         cpu.gc_ll_descr = GCDescrStm()
 
+        def latest_descr(self, deadframe):
+            deadframe = lltype.cast_opaque_ptr(JITFRAMEPTR, deadframe)
+            descr = deadframe.jf_descr
+            res = history.AbstractDescr.show(self, descr)
+            assert isinstance(res, history.AbstractFailDescr)
+            return res
+        import types
+        cpu.get_latest_descr = types.MethodType(latest_descr, cpu,
+                                                cpu.__class__)
+        
+
         self.p2wd = cpu.gc_ll_descr.P2Wdescr
         self.p2rd = cpu.gc_ll_descr.P2Rdescr
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to