[pypy-commit] pypy fast-slowpath: This seems to work

fijal noreply at buildbot.pypy.org
Fri Jul 19 00:03:11 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: fast-slowpath
Changeset: r65471:8d11a494f1a9
Date: 2013-07-19 00:02 +0200
http://bitbucket.org/pypy/pypy/changeset/8d11a494f1a9/

Log:	This seems to work

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
@@ -126,27 +126,6 @@
         else:
             self.gen_malloc_fixedsize(size, descr.tid, op.result)
 
-    def handle_list_resize_ge(self, op):
-        """ what we want to do is to check the length and than add a conditional
-        call to really resize
-        """
-        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_GE, [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)
         total_size = -1
@@ -245,6 +224,30 @@
         self.newops.append(ResOperation(rop.CALL_ASSEMBLER, args,
                                         op.result, op.getdescr()))
 
+    def handle_list_resize_ge(self, op):
+        """ what we want to do is to check the length and than add a conditional
+        call to really resize
+        """
+        extra_info = op.getdescr().get_extra_info()
+        lendescr = extra_info.extra_descrs[0]
+        itemsdescr = extra_info.extra_descrs[1]
+        arraydescr = extra_info.extra_descrs[2]
+        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())
+        op4 = ResOperation(rop.SETFIELD_GC, [lst, newsizebox], None,
+                           descr=lendescr)
+        self.newops += [op0, op1, op2, op3, op4]
+
     # ----------
 
     def emitting_an_operation_that_can_collect(self):
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
@@ -92,12 +92,13 @@
         ARRAY = lltype.GcArray(lltype.Signed)
         LIST = lltype.GcStruct('LIST', ('length', lltype.Signed),
                                ('items', lltype.Ptr(ARRAY)))
+        lendescr = get_field_descr(self.gc_ll_descr, LIST, 'length')
         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])
+                               extra_descrs=[lendescr, itemsdescr, arraydescr])
         list_resize_descr = get_call_descr(self.gc_ll_descr,
                                            [lltype.Ptr(LIST), lltype.Signed],
                                            lltype.Void, extrainfo)
@@ -798,6 +799,7 @@
         [p0, i0]
         p1 = getfield_gc(p0, descr=itemsdescr)
         i1 = arraylen_gc(p1, descr=arraydescr)
-        i2 = int_ge(i1, i0)
+        i2 = int_lt(i1, i0)
         cond_call(i2, ConstClass(list_resize_ge), p0, i0, descr=list_resize_descr)
+        setfield_gc(p0, i0, descr=lendescr)
         """)
diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -272,8 +272,10 @@
             funcobj = op.args[0].value._obj
             if funcobj.random_effects_on_gcobjs:
                 return True
-        except (AttributeError, lltype.DelayedPointer):
+        except lltype.DelayedPointer:
             return True   # better safe than sorry
+        except AttributeError:
+            return False
         return super(RandomEffectsAnalyzer, self).analyze_external_call(
             op, seen)
 
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
@@ -1622,9 +1622,11 @@
         index = EffectInfo.OS_LIST_RESIZE_GE
         LIST = args[0].concretetype.TO
         itemsdescr = self.cpu.fielddescrof(LIST, 'items')
+        lendescr = self.cpu.fielddescrof(LIST, 'length')
         arraydescr = self.cpu.arraydescrof(LIST.items.TO)
         return self.handle_residual_call(op, oopspecindex=index,
-                                         extradescrs=[itemsdescr, arraydescr])
+                                         extradescrs=[lendescr, itemsdescr,
+                                                      arraydescr])
 
     # ----------
     # Strings and Unicodes.


More information about the pypy-commit mailing list