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

Reply via email to