[pypy-commit] pypy fast-slowpath: Call directly the resize (avoids double calling). Add a jit target that I'm
fijal
noreply at buildbot.pypy.org
Fri Jul 19 12:34:30 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: fast-slowpath
Changeset: r65477:80cf2e2836ff
Date: 2013-07-19 12:33 +0200
http://bitbucket.org/pypy/pypy/changeset/80cf2e2836ff/
Log: Call directly the resize (avoids double calling). Add a jit target
that I'm testing.
diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -229,10 +229,15 @@
call to really resize
"""
extra_info = op.getdescr().get_extra_info()
+ if extra_info.extra_descrs is None:
+ # this is for tests only, actually never happens
+ self.newops.append(op)
+ return
lendescr = extra_info.extra_descrs[0]
itemsdescr = extra_info.extra_descrs[1]
arraydescr = extra_info.extra_descrs[2]
- func = op.getarg(0)
+ resize_ptr = ConstInt(extra_info.extra_descrs[3].getint())
+ calldescr = extra_info.extra_descrs[4]
lst = op.getarg(1)
newsizebox = op.getarg(2)
arrbox = BoxPtr()
@@ -242,8 +247,9 @@
op1 = ResOperation(rop.ARRAYLEN_GC, [arrbox], arrlenbox,
descr=arraydescr)
op2 = ResOperation(rop.INT_LT, [arrlenbox, newsizebox], cond_box)
- op3 = ResOperation(rop.COND_CALL, [cond_box, func, lst, newsizebox],
- None, descr=op.getdescr())
+ op3 = ResOperation(rop.COND_CALL, [cond_box, resize_ptr, lst,
+ newsizebox],
+ None, descr=calldescr)
op4 = ResOperation(rop.SETFIELD_GC, [lst, newsizebox], None,
descr=lendescr)
self.newops += [op0, op1, op2, op3, op4]
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
@@ -5,7 +5,7 @@
from rpython.jit.codewriter.flatten import ListOfKind, IndirectCallTargets
from rpython.jit.codewriter.policy import log
from rpython.jit.metainterp import quasiimmut
-from rpython.jit.metainterp.history import getkind
+from rpython.jit.metainterp.history import getkind, AbstractDescr
from rpython.jit.metainterp.typesystem import deref, arrayItem
from rpython.jit.metainterp.blackhole import BlackholeInterpreter
from rpython.flowspace.model import SpaceOperation, Variable, Constant, c_last_exception
@@ -17,6 +17,15 @@
from rpython.translator.simplify import get_funcobj
from rpython.translator.unsimplify import varoftype
+class IntDescr(AbstractDescr):
+ """ Disguise int as a descr
+ """
+ def __init__(self, v):
+ self.v = v
+
+ def getint(self):
+ return self.v
+
class UnsupportedMallocFlags(Exception):
pass
@@ -1624,9 +1633,16 @@
itemsdescr = self.cpu.fielddescrof(LIST, 'items')
lendescr = self.cpu.fielddescrof(LIST, 'length')
arraydescr = self.cpu.arraydescrof(LIST.items.TO)
+ oopspec = "list.resize_hint_really"
+ c_func, TP = support.builtin_func_for_spec(self.cpu.rtyper,
+ oopspec, [lltype.Ptr(LIST), lltype.Signed], lltype.Void)
+ op1 = SpaceOperation('direct_call', [c_func] + args, op.result)
+ calldescr = self.callcontrol.getcalldescr(op1)
+ extradescrs = [lendescr, itemsdescr, arraydescr,
+ IntDescr(rffi.cast(lltype.Signed, c_func.value)),
+ calldescr]
return self.handle_residual_call(op, oopspecindex=index,
- extradescrs=[lendescr, itemsdescr,
- arraydescr])
+ extradescrs=extradescrs)
# ----------
# Strings and Unicodes.
diff --git a/rpython/jit/codewriter/support.py b/rpython/jit/codewriter/support.py
--- a/rpython/jit/codewriter/support.py
+++ b/rpython/jit/codewriter/support.py
@@ -8,6 +8,7 @@
from rpython.rlib.jit import elidable, oopspec
from rpython.rlib.rarithmetic import r_longlong, r_ulonglong, r_uint, intmask
from rpython.rtyper import rlist
+from rpython.rtyper.lltypesystem import rlist as rlist_ll
from rpython.rtyper.annlowlevel import MixLevelHelperAnnotator
from rpython.rtyper.extregistry import ExtRegistryEntry
from rpython.rtyper.llinterp import LLInterpreter
@@ -74,7 +75,7 @@
# another block, so the set of alive_v will be different.
methname = op.args[0].value
assert methname == 'jit_merge_point', (
- "reds='auto' is supported only for jit drivers which "
+ "reds='auto' is supported only for jit drivers which "
"calls only jit_merge_point. Found a call to %s" % methname)
#
# compute the set of live variables across the jit_marker
@@ -212,6 +213,8 @@
_ll_5_list_ll_arraycopy = rgc.ll_arraycopy
+def _ll_2_list_resize_hint_really(l, newsize):
+ rlist_ll._ll_list_resize_hint_really(l, newsize, True)
@elidable
def _ll_1_gc_identityhash(x):
diff --git a/rpython/translator/goal/targetjitstandalone.py b/rpython/translator/goal/targetjitstandalone.py
new file mode 100644
--- /dev/null
+++ b/rpython/translator/goal/targetjitstandalone.py
@@ -0,0 +1,34 @@
+
+""" Only the JIT
+"""
+
+from rpython.rlib import jit
+from rpython.jit.codewriter.policy import JitPolicy
+
+driver = jit.JitDriver(greens = [], reds = 'auto')
+
+def main(count):
+ i = 0
+ l = []
+ while i < count:
+ driver.jit_merge_point()
+ l.append(i)
+ i += 1
+ return l
+
+def entry_point(argv):
+ if len(argv) < 3:
+ print "Usage: jitstandalone <number> <another number>"
+ count1 = int(argv[1])
+ count2 = int(argv[2])
+ s = 0
+ for i in range(count1):
+ s += len(main(count2))
+ print s
+ return 0
+
+def target(*args):
+ return entry_point, None
+
+def jitpolicy(driver):
+ return JitPolicy()
More information about the pypy-commit
mailing list