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

Reply via email to