Author: Armin Rigo <[email protected]>
Branch: op_malloc_gc
Changeset: r49512:c4bcb5c2b12f
Date: 2011-11-17 18:11 +0100
http://bitbucket.org/pypy/pypy/changeset/c4bcb5c2b12f/
Log: Missing rounding up: tests and fix.
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
@@ -4,7 +4,7 @@
from pypy.rlib.debug import fatalerror
from pypy.rlib.rarithmetic import ovfcheck
from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rclass, rstr
-from pypy.rpython.lltypesystem import llgroup
+from pypy.rpython.lltypesystem import llgroup, llarena
from pypy.rpython.lltypesystem.lloperation import llop
from pypy.rpython.annlowlevel import llhelper
from pypy.translator.tool.cbuild import ExternalCompilationInfo
@@ -879,6 +879,7 @@
basesize = descr.get_base_size(self.tsc)
itemsize = descr.get_item_size(self.tsc)
fullsize = basesize + newlength * itemsize
+ fullsize = self.round_up_for_allocation(fullsize)
self.gen_malloc_const(fullsize, op.result)
self.gen_initialize_tid(op.result, descr.tid)
self.gen_initialize_len(op.result, v_newlength, descr)
@@ -972,6 +973,16 @@
# fall-back case: produce a write_barrier
self.gen_write_barrier(v_base, v_value)
+ def round_up_for_allocation(self, size):
+ if self.tsc:
+ return llarena.round_up_for_allocation(
+ size, self.gc_ll_descr.minimal_size_in_nursery)
+ else:
+ # non-translated: do it manually
+ # assume that "self.gc_ll_descr.minimal_size_in_nursery" is 2 WORDs
+ size = max(size, 2 * WORD)
+ return (size + WORD-1) & ~(WORD-1) # round up
+
# ____________________________________________________________
def get_ll_description(gcdescr, translator=None, rtyper=None):
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
@@ -564,6 +564,11 @@
adescr.tid = 4321
alendescr = get_field_arraylen_descr(self.gc_ll_descr, A)
#
+ B = lltype.GcArray(lltype.Char)
+ bdescr = get_array_descr(self.gc_ll_descr, B)
+ bdescr.tid = 8765
+ blendescr = get_field_arraylen_descr(self.gc_ll_descr, B)
+ #
tiddescr = self.gc_ll_descr.fielddescr_tid
#
ops = parse(frm_operations, namespace=locals())
@@ -638,6 +643,44 @@
jump()
""")
+ def test_rewrite_assembler_round_up(self):
+ self.check_rewrite("""
+ []
+ p0 = new_array(6, descr=bdescr)
+ jump()
+ """, """
+ []
+ p0 = malloc_gc(%(adescr.get_base_size(False) + 8)d)
+ setfield_gc(p0, 8765, descr=tiddescr)
+ setfield_gc(p0, 6, descr=blendescr)
+ jump()
+ """)
+
+ def test_rewrite_assembler_round_up_always(self):
+ self.check_rewrite("""
+ []
+ p0 = new_array(5, descr=bdescr)
+ p1 = new_array(5, descr=bdescr)
+ p2 = new_array(5, descr=bdescr)
+ p3 = new_array(5, descr=bdescr)
+ jump()
+ """, """
+ []
+ p0 = malloc_gc(%(4 * (adescr.get_base_size(False) + 8))d)
+ setfield_gc(p0, 8765, descr=tiddescr)
+ setfield_gc(p0, 5, descr=blendescr)
+ p1 = int_add(p0, %(adescr.get_base_size(False) + 8)d)
+ setfield_gc(p1, 8765, descr=tiddescr)
+ setfield_gc(p1, 5, descr=blendescr)
+ p2 = int_add(p1, %(adescr.get_base_size(False) + 8)d)
+ setfield_gc(p2, 8765, descr=tiddescr)
+ setfield_gc(p2, 5, descr=blendescr)
+ p3 = int_add(p2, %(adescr.get_base_size(False) + 8)d)
+ setfield_gc(p3, 8765, descr=tiddescr)
+ setfield_gc(p3, 5, descr=blendescr)
+ jump()
+ """)
+
def test_rewrite_assembler_initialization_store(self):
S = lltype.GcStruct('S', ('parent', OBJECT),
('x', lltype.Signed))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit