Author: Maciej Fijalkowski <fij...@gmail.com> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit