[pypy-commit] pypy fast-slowpath: improve the heuristic and fix some tests

fijal noreply at buildbot.pypy.org
Fri Jul 19 12:58:18 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: fast-slowpath
Changeset: r65479:07f3a1f54312
Date: 2013-07-19 12:57 +0200
http://bitbucket.org/pypy/pypy/changeset/07f3a1f54312/

Log:	improve the heuristic and fix some tests

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
@@ -106,7 +106,8 @@
                 kind='unicode')
         else:
             self.malloc_slowpath_unicode = None
-        self.cond_call_slowpath = self._build_cond_call_slowpath()
+        self.cond_call_slowpath = [self._build_cond_call_slowpath(False),
+                                   self._build_cond_call_slowpath(True)]
 
         self._build_stack_check_slowpath()
         self._build_release_gil(gc_ll_descr.gcrootmap)
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
@@ -149,18 +149,17 @@
         mc.RET()
         self._frame_realloc_slowpath = mc.materialize(self.cpu.asmmemmgr, [])
 
-    def _build_cond_call_slowpath(self):
+    def _build_cond_call_slowpath(self, supports_floats):
         """ This builds a general call slowpath, for whatever call happens to
         come.
         """
         mc = codebuf.MachineCodeBlockWrapper()
-        self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats,
-                                     callee_only=False)
+        self._push_all_regs_to_frame(mc, [], supports_floats, callee_only=False)
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
             self._call_header_shadowstack(mc, gcrootmap)
         mc.SUB(esp, imm(WORD))
-        # first arg is always in edi
+        # args are in their respective positions
         mc.CALL(eax)
         mc.ADD(esp, imm(WORD))
         if gcrootmap and gcrootmap.is_shadow_stack:
@@ -2150,7 +2149,11 @@
         self.mc.J_il8(rx86.Conditions['Z'], 0) # patched later
         jmp_adr = self.mc.get_relative_pos()
         self.push_gcmap(self.mc, gcmap, store=True)
-        self.mc.CALL(imm(self.cond_call_slowpath))
+        if self._regalloc is not None and self._regalloc.xrm.reg_bindings:
+            cond_call_adr = self.cond_call_slowpath[1]
+        else:
+            cond_call_adr = self.cond_call_slowpath[0]
+        self.mc.CALL(imm(cond_call_adr))
         self.pop_gcmap(self.mc)
         # never any result value
         offset = self.mc.get_relative_pos() - jmp_adr
diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -86,7 +86,7 @@
     OS_JIT_FORCE_VIRTUAL        = 120
 
     OS_LIST_RESIZE_GE           = 130
-    OS_LIST_RESIZE_LE           = 130
+    OS_LIST_RESIZE_LE           = 131
 
     # for debugging:
     _OS_CANRAISE = set([
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1638,8 +1638,9 @@
             oopspec, [lltype.Ptr(LIST), lltype.Signed], lltype.Void)
         op1 = SpaceOperation('direct_call', [c_func] + args, op.result)
         calldescr = self.callcontrol.getcalldescr(op1)
+        addr = llmemory.cast_ptr_to_adr(c_func.value)
         extradescrs = [lendescr, itemsdescr, arraydescr,
-                       IntDescr(rffi.cast(lltype.Signed, c_func.value)),
+                       IntDescr(heaptracker.adr2int(addr)),
                        calldescr]
         return self.handle_residual_call(op, oopspecindex=index,
                                          extradescrs=extradescrs)
diff --git a/rpython/jit/codewriter/test/test_flatten.py b/rpython/jit/codewriter/test/test_flatten.py
--- a/rpython/jit/codewriter/test/test_flatten.py
+++ b/rpython/jit/codewriter/test/test_flatten.py
@@ -49,7 +49,7 @@
 class FakeCPU:
     class tracker:
         pass
-    
+
     def __init__(self, rtyper):
         rtyper._builtin_func_for_spec_cache = FakeDict()
         self.rtyper = rtyper
@@ -71,7 +71,8 @@
     callinfocollection = FakeCallInfoCollection()
     def guess_call_kind(self, op):
         return 'residual'
-    def getcalldescr(self, op, oopspecindex=None, extraeffect=None):
+    def getcalldescr(self, op, oopspecindex=None, extraeffect=None,
+                     extradescrs=None):
         try:
             name = op.args[0].value._obj._name
             if 'cannot_raise' in name or name.startswith('cast_'):
diff --git a/rpython/jit/codewriter/test/test_jtransform.py b/rpython/jit/codewriter/test/test_jtransform.py
--- a/rpython/jit/codewriter/test/test_jtransform.py
+++ b/rpython/jit/codewriter/test/test_jtransform.py
@@ -35,7 +35,7 @@
 class FakeCPU:
     class tracker:
         pass
-    
+
     rtyper = FakeRTyper()
     def calldescrof(self, FUNC, ARGS, RESULT):
         return ('calldescr', FUNC, ARGS, RESULT)
@@ -60,7 +60,7 @@
 class FakeResidualCallControl:
     def guess_call_kind(self, op):
         return 'residual'
-    def getcalldescr(self, op):
+    def getcalldescr(self, op, **kwds):
         return 'calldescr'
     def calldescr_canraise(self, calldescr):
         return True
@@ -77,7 +77,7 @@
 class FakeResidualIndirectCallControl:
     def guess_call_kind(self, op):
         return 'residual'
-    def getcalldescr(self, op):
+    def getcalldescr(self, op, **kwds):
         return 'calldescr'
     def calldescr_canraise(self, calldescr):
         return True
@@ -87,7 +87,7 @@
         return 'regular'
     def graphs_from(self, op):
         return ['somegraph1', 'somegraph2']
-    def getcalldescr(self, op):
+    def getcalldescr(self, op, **kwds):
         return 'calldescr'
     def get_jitcode(self, graph, called_from=None):
         assert graph in ('somegraph1', 'somegraph2')
diff --git a/rpython/jit/codewriter/test/test_regalloc.py b/rpython/jit/codewriter/test/test_regalloc.py
--- a/rpython/jit/codewriter/test/test_regalloc.py
+++ b/rpython/jit/codewriter/test/test_regalloc.py
@@ -250,7 +250,7 @@
         class FakeCallControl:
             def guess_call_kind(self, op):
                 return 'residual'
-            def getcalldescr(self, op):
+            def getcalldescr(self, op, **kwds):
                 return FakeDescr()
             def calldescr_canraise(self, calldescr):
                 return True


More information about the pypy-commit mailing list