[pypy-commit] pypy gc_no_cleanup_nursery: Remove clear_array_contents on virtual values. Since they're initialized

fijal noreply at buildbot.pypy.org
Sat Sep 6 23:36:31 CEST 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: gc_no_cleanup_nursery
Changeset: r73354:bf18cdaa79cf
Date: 2014-09-06 15:36 -0600
http://bitbucket.org/pypy/pypy/changeset/bf18cdaa79cf/

Log:	Remove clear_array_contents on virtual values. Since they're
	initialized to zeros (and we force zeros on force), it should be
	about it

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
@@ -615,14 +615,13 @@
             op1 = SpaceOperation('new_array', [op.args[2], arraydescr],
                                  op.result)
             if self._has_gcptrs_in(ARRAY):
-                return self.zero_contents(op1, op.result, ARRAY,
+                return self.zero_contents([op1], op.result, ARRAY,
                                           only_gc_pointers=True)
             if op.args[1].value.get('zero', False):
-                return self.zero_contents(op1, op.result, ARRAY)
+                return self.zero_contents([op1], op.result, ARRAY)
             return op1
 
-    def zero_contents(self, prev_op, v, TYPE, only_gc_pointers=False):
-        ops = [prev_op]
+    def zero_contents(self, ops, v, TYPE, only_gc_pointers=False):
         if isinstance(TYPE, lltype.Struct):
             for name, FIELD in TYPE._flds.iteritems():
                 if (not only_gc_pointers or
@@ -922,9 +921,9 @@
         sizedescr = self.cpu.sizeof(STRUCT)
         op1 = SpaceOperation(opname, [sizedescr], op.result)
         if true_zero:
-            return self.zero_contents(op1, op.result, STRUCT)
+            return self.zero_contents([op1], op.result, STRUCT)
         if self._has_gcptrs_in(STRUCT):
-            return self.zero_contents(op1, op.result, STRUCT,
+            return self.zero_contents([op1], op.result, STRUCT,
                                       only_gc_pointers=True)
         return op1
 
@@ -1664,6 +1663,8 @@
             v.concretetype = lltype.Signed
             ops.append(SpaceOperation('int_force_ge_zero', [v_length], v))
         ops.append(SpaceOperation('new_array', [v, arraydescr], op.result))
+        if self._has_gcptrs_in(op.result.concretetype.TO):
+            self.zero_contents(ops, op.result, op.result.concretetype.TO)
         return ops
 
     def do_fixed_list_len(self, op, args, arraydescr):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5461,6 +5461,17 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_virtual_clear_array_contents(self):
+        ops = """
+        []
+        p0 = new_array(2, descr=arraydescr)
+        clear_array_contents(p0, descr=arraydescr)
+        """
+        expected = """
+        []
+        """
+        self.optimize_loop(ops, expected)
+
 
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -284,7 +284,7 @@
 
     def setitem(self, index, itemvalue):
         assert isinstance(itemvalue, optimizer.OptValue)
-        self._items[index] = itemvalue
+        self._items[index] = itemvalue        
 
     def force_at_end_of_preamble(self, already_forced, optforce):
         # note that this method is on VArrayValue instead of
@@ -660,6 +660,12 @@
         else:
             self.emit_operation(op)
 
+    def optimize_CLEAR_ARRAY_CONTENTS(self, op):
+        v = self.getvalue(op.getarg(0))
+        if v.is_virtual():
+            return
+        self.emit_operation(op)
+
     def optimize_CALL(self, op):
         effectinfo = op.getdescr().get_extra_info()
         if effectinfo.oopspecindex == EffectInfo.OS_RAW_MALLOC_VARSIZE_CHAR:
diff --git a/rpython/jit/metainterp/test/test_list.py b/rpython/jit/metainterp/test/test_list.py
--- a/rpython/jit/metainterp/test/test_list.py
+++ b/rpython/jit/metainterp/test/test_list.py
@@ -8,7 +8,7 @@
 
     def check_all_virtualized(self):
         self.check_resops(setarrayitem_gc=0, new_array=0, arraylen_gc=0,
-                          getarrayitem_gc=0)
+                          getarrayitem_gc=0)        
 
     def test_simple_array(self):
         jitdriver = JitDriver(greens = [], reds = ['n'])


More information about the pypy-commit mailing list