[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