Author: Armin Rigo <[email protected]>
Branch: op_malloc_gc
Changeset: r49510:8b49822025c6
Date: 2011-11-17 17:40 +0100
http://bitbucket.org/pypy/pypy/changeset/8b49822025c6/

Log:    Fix some tests.

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -839,22 +839,24 @@
     # - Add COND_CALLs to the write barrier before SETFIELD_GC and
     #   SETARRAYITEM_GC operations.
 
+    _v_last_malloc = None
+    _previous_size = -1
+
     def __init__(self, gc_ll_descr, cpu):
         self.gc_ll_descr = gc_ll_descr
         self.cpu = cpu
         self.tsc = self.gc_ll_descr.translate_support_code
+        self.newops = []
+        self.known_lengths = {}
+        self.op_malloc_gc = None
+        self.current_mallocs = {}     # set of variables
 
     def rewrite(self, operations):
-        self.newops = []
-        self.known_lengths = {}
         # we can only remember one malloc since the next malloc can possibly
         # collect; but we can try to collapse several known-size mallocs into
         # one, both for performance and to reduce the number of write
         # barriers.  We do this on each "basic block" of operations, which in
         # this case means between CALLs or unknown-size mallocs.
-        self.op_malloc_gc = None
-        self.v_last_malloc = None
-        self.previous_size = -1
         #
         for op in operations:
             if op.getopnum() == rop.DEBUG_MERGE_POINT:
@@ -885,11 +887,12 @@
                 xxxx
             elif op.can_malloc():
                 self.op_malloc_gc = None
+                self.current_mallocs.clear()
             # ---------- write barrier for SETFIELD_GC ----------
             if op.getopnum() == rop.SETFIELD_GC:
                 val = op.getarg(0)
                 # no need for a write barrier in the case of previous malloc
-                if val is not last_malloc:
+                if val not in self.current_mallocs:
                     v = op.getarg(1)
                     if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
                                             bool(v.value)): # store a non-NULL
@@ -899,7 +902,7 @@
             if op.getopnum() == rop.SETARRAYITEM_GC:
                 val = op.getarg(0)
                 # no need for a write barrier in the case of previous malloc
-                if val is not last_malloc:
+                if val not in self.current_mallocs:
                     v = op.getarg(2)
                     if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
                                             bool(v.value)): # store a non-NULL
@@ -923,11 +926,12 @@
             total_size += size
             self.op_malloc_gc.setarg(0, ConstInt(total_size))
             op = ResOperation(rop.INT_ADD,
-                              [self.v_last_malloc,
-                               ConstInt(self.previous_size)],
+                              [self._v_last_malloc,
+                               ConstInt(self._previous_size)],
                               v_result)
-        self.previous_size = size
-        self.v_last_malloc = v_result
+        self._previous_size = size
+        self._v_last_malloc = v_result
+        self.current_mallocs[v_result] = None
         self.newops.append(op)
 
     def gen_initialize_tid(self, v_newgcobj, tid):
@@ -945,9 +949,10 @@
         self.newops.append(op)
 
     def gen_write_barrier(self, v_base, v_value):
+        write_barrier_descr = self.gc_ll_descr.write_barrier_descr
         args = [v_base, v_value]
         self.newops.append(ResOperation(rop.COND_CALL_GC_WB, args, None,
-                                        descr=self.write_barrier_descr))
+                                        descr=write_barrier_descr))
 
     def gen_write_barrier_array(self, v_base, v_index, v_value):
         write_barrier_descr = self.gc_ll_descr.write_barrier_descr
diff --git a/pypy/jit/backend/llsupport/test/test_gc.py 
b/pypy/jit/backend/llsupport/test/test_gc.py
--- a/pypy/jit/backend/llsupport/test/test_gc.py
+++ b/pypy/jit/backend/llsupport/test/test_gc.py
@@ -404,10 +404,11 @@
         gc_ll_descr = self.gc_ll_descr
         llop1 = self.llop1
         #
-        newops = []
+        rewriter = GcRewriterAssembler(gc_ll_descr, None)
+        newops = rewriter.newops
         v_base = BoxPtr()
         v_value = BoxPtr()
-        gc_ll_descr._gen_write_barrier(newops, v_base, v_value)
+        rewriter.gen_write_barrier(v_base, v_value)
         assert llop1.record == []
         assert len(newops) == 1
         assert newops[0].getopnum() == rop.COND_CALL_GC_WB
@@ -482,7 +483,7 @@
 
     def test_rewrite_assembler_3(self):
         # check write barriers before SETARRAYITEM_GC
-        for v_new_length in (None, ConstInt(5), ConstInt(5000), BoxInt()):
+        for new_length in (-1, 5, 5000):
             v_base = BoxPtr()
             v_index = BoxInt()
             v_value = BoxPtr()
@@ -491,23 +492,11 @@
                 ResOperation(rop.SETARRAYITEM_GC, [v_base, v_index, v_value],
                              None, descr=array_descr),
                 ]
-            if v_new_length is not None:
-                operations.insert(0, ResOperation(rop.NEW_ARRAY,
-                                                  [v_new_length], v_base,
-                                                  descr=array_descr))
-                # we need to insert another, unrelated NEW_ARRAY here
-                # to prevent the initialization_store optimization
-                operations.insert(1, ResOperation(rop.NEW_ARRAY,
-                                                  [ConstInt(12)], BoxPtr(),
-                                                  descr=array_descr))
-            gc_ll_descr = self.gc_ll_descr
+            rewriter = GcRewriterAssembler(self.gc_ll_descr, self.fake_cpu)
+            if new_length >= 0:
+                rewriter.known_lengths[v_base] = new_length
             operations = get_deep_immutable_oplist(operations)
-            operations = gc_ll_descr.rewrite_assembler(self.fake_cpu,
-                                                       operations, [])
-            if v_new_length is not None:
-                assert operations[0].getopnum() == rop.NEW_ARRAY
-                assert operations[1].getopnum() == rop.NEW_ARRAY
-                del operations[:2]
+            operations = rewriter.rewrite(operations)
             assert len(operations) == 2
             #
             assert operations[0].getopnum() == rop.COND_CALL_GC_WB
@@ -525,7 +514,7 @@
         # check write barriers before SETARRAYITEM_GC,
         # if we have actually a write_barrier_from_array.
         self.llop1._have_wb_from_array = True
-        for v_new_length in (None, ConstInt(5), ConstInt(5000), BoxInt()):
+        for new_length in (-1, 5, 5000):
             v_base = BoxPtr()
             v_index = BoxInt()
             v_value = BoxPtr()
@@ -534,26 +523,14 @@
                 ResOperation(rop.SETARRAYITEM_GC, [v_base, v_index, v_value],
                              None, descr=array_descr),
                 ]
-            if v_new_length is not None:
-                operations.insert(0, ResOperation(rop.NEW_ARRAY,
-                                                  [v_new_length], v_base,
-                                                  descr=array_descr))
-                # we need to insert another, unrelated NEW_ARRAY here
-                # to prevent the initialization_store optimization
-                operations.insert(1, ResOperation(rop.NEW_ARRAY,
-                                                  [ConstInt(12)], BoxPtr(),
-                                                  descr=array_descr))
-            gc_ll_descr = self.gc_ll_descr
+            rewriter = GcRewriterAssembler(self.gc_ll_descr, self.fake_cpu)
+            if new_length >= 0:
+                rewriter.known_lengths[v_base] = new_length
             operations = get_deep_immutable_oplist(operations)
-            operations = gc_ll_descr.rewrite_assembler(self.fake_cpu,
-                                                       operations, [])
-            if v_new_length is not None:
-                assert operations[0].getopnum() == rop.NEW_ARRAY
-                assert operations[1].getopnum() == rop.NEW_ARRAY
-                del operations[:2]
+            operations = rewriter.rewrite(operations)
             assert len(operations) == 2
             #
-            if isinstance(v_new_length, ConstInt) and v_new_length.value < 130:
+            if 0 <= new_length < 130:
                 assert operations[0].getopnum() == rop.COND_CALL_GC_WB
                 assert operations[0].getarg(0) == v_base
                 assert operations[0].getarg(1) == v_value
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to