Author: Maciej Fijalkowski <[email protected]>
Branch: fast-slowpath
Changeset: r65468:4da4ff886a5e
Date: 2013-07-18 22:10 +0200
http://bitbucket.org/pypy/pypy/changeset/4da4ff886a5e/
Log: implement rewriting for list_resize_ge
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
@@ -1,7 +1,7 @@
from rpython.rlib.rarithmetic import ovfcheck
from rpython.rtyper.lltypesystem import llmemory
from rpython.jit.metainterp import history
-from rpython.jit.metainterp.history import ConstInt, BoxPtr, ConstPtr
+from rpython.jit.metainterp.history import ConstInt, BoxPtr, ConstPtr, BoxInt
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.codewriter import heaptracker
from rpython.jit.codewriter.effectinfo import EffectInfo
@@ -128,7 +128,22 @@
""" what we want to do is to check the length and than add a
conditional
call to really resize
"""
- xxx
+ extra_info = op.getdescr().get_extra_info()
+ itemsdescr = extra_info.extra_descrs[0]
+ arraydescr = extra_info.extra_descrs[1]
+ func = op.getarg(0)
+ lst = op.getarg(1)
+ newsizebox = op.getarg(2)
+ arrbox = BoxPtr()
+ arrlenbox = BoxInt()
+ cond_box = BoxInt()
+ op0 = ResOperation(rop.GETFIELD_GC, [lst], arrbox, descr=itemsdescr)
+ 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())
+ self.newops += [op0, op1, op2, op3]
def handle_new_array(self, arraydescr, op, kind=FLAG_ARRAY):
v_length = op.getarg(0)
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py
b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -1,9 +1,10 @@
from rpython.jit.backend.llsupport.descr import get_size_descr,\
get_field_descr, get_array_descr, ArrayDescr, FieldDescr,\
- SizeDescrWithVTable, get_interiorfield_descr
+ SizeDescrWithVTable, get_interiorfield_descr, get_call_descr
from rpython.jit.backend.llsupport.gc import GcLLDescr_boehm,\
GcLLDescr_framework
from rpython.jit.backend.llsupport import jitframe
+from rpython.jit.codewriter.effectinfo import EffectInfo
from rpython.jit.metainterp.gc import get_description
from rpython.jit.tool.oparser import parse
from rpython.jit.metainterp.optimizeopt.util import equaloplists
@@ -87,6 +88,21 @@
casmdescr.compiled_loop_token = clt
tzdescr = None # noone cares
#
+
+ ARRAY = lltype.GcArray(lltype.Signed)
+ LIST = lltype.GcStruct('LIST', ('length', lltype.Signed),
+ ('items', lltype.Ptr(ARRAY)))
+ itemsdescr = get_field_descr(self.gc_ll_descr, LIST, 'items')
+ arraydescr = get_array_descr(self.gc_ll_descr, ARRAY)
+ extrainfo = EffectInfo(None, None, None, None,
+ extraeffect=EffectInfo.EF_RANDOM_EFFECTS,
+ oopspecindex=EffectInfo.OS_LIST_RESIZE_GE,
+ extra_descrs=[itemsdescr, arraydescr])
+ list_resize_descr = get_call_descr(self.gc_ll_descr,
+ [lltype.Ptr(LIST), lltype.Signed],
+ lltype.Void, extrainfo)
+ list_resize_ge = lltype.nullptr(ARRAY) # does not matter, not used
+
namespace.update(locals())
#
for funcname in self.gc_ll_descr._generated_functions:
@@ -775,4 +791,13 @@
""")
def test_rewrite_list_resize_ge(self):
- pass
+ self.check_rewrite("""
+ [p0, i0]
+ call(ConstClass(list_resize_ge), p0, i0, descr=list_resize_descr)
+ """, """
+ [p0, i0]
+ p1 = getfield_gc(p0, descr=itemsdescr)
+ i1 = arraylen_gc(p1, descr=arraydescr)
+ i2 = int_lt(i1, i0)
+ cond_call(i2, ConstClass(list_resize_ge), p0, i0,
descr=list_resize_descr)
+ """)
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
@@ -1621,10 +1621,10 @@
def do_resizable_list__resize_ge(self, op, args, *descrs):
index = EffectInfo.OS_LIST_RESIZE_GE
LIST = args[0].concretetype.TO
- lengthdescr = self.cpu.fielddescrof(LIST, 'length')
+ itemsdescr = self.cpu.fielddescrof(LIST, 'items')
arraydescr = self.cpu.arraydescrof(LIST.items.TO)
return self.handle_residual_call(op, oopspecindex=index,
- extradescrs=[lengthdescr, arraydescr])
+ extradescrs=[itemsdescr, arraydescr])
# ----------
# Strings and Unicodes.
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit