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