[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