Author: Antonio Cuni <[email protected]>
Branch:
Changeset: r44203:324d87271777
Date: 2011-05-16 12:05 +0200
http://bitbucket.org/pypy/pypy/changeset/324d87271777/
Log: make sure that rewrite_assembler does not mutate the operations
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
@@ -768,6 +768,31 @@
funcptr(llmemory.cast_ptr_to_adr(gcref_struct),
llmemory.cast_ptr_to_adr(gcref_newptr))
+ def replace_constptrs_with_getfield_raw(self, cpu, newops, op):
+ # xxx some performance issue here
+ newargs = [None] * op.numargs()
+ needs_copy = False
+ for i in range(op.numargs()):
+ v = op.getarg(i)
+ newargs[i] = v
+ if isinstance(v, ConstPtr) and bool(v.value):
+ addr = self.gcrefs.get_address_of_gcref(v.value)
+ # ^^^even for non-movable objects, to record their presence
+ if rgc.can_move(v.value):
+ box = BoxPtr(v.value)
+ addr = cpu.cast_adr_to_int(addr)
+ newops.append(ResOperation(rop.GETFIELD_RAW,
+ [ConstInt(addr)], box,
+ self.single_gcref_descr))
+ newargs[i] = box
+ needs_copy = True
+ #
+ if needs_copy:
+ return op.copy_and_change(op.getopnum(), args=newargs)
+ else:
+ return op
+
+
def rewrite_assembler(self, cpu, operations):
# Perform two kinds of rewrites in parallel:
#
@@ -790,19 +815,7 @@
if op.getopnum() == rop.DEBUG_MERGE_POINT:
continue
# ---------- replace ConstPtrs with GETFIELD_RAW ----------
- # xxx some performance issue here
- for i in range(op.numargs()):
- v = op.getarg(i)
- if isinstance(v, ConstPtr) and bool(v.value):
- addr = self.gcrefs.get_address_of_gcref(v.value)
- # ^^^even for non-movable objects, to record their presence
- if rgc.can_move(v.value):
- box = BoxPtr(v.value)
- addr = cpu.cast_adr_to_int(addr)
- newops.append(ResOperation(rop.GETFIELD_RAW,
- [ConstInt(addr)], box,
- self.single_gcref_descr))
- op.setarg(i, box)
+ op = self.replace_constptrs_with_getfield_raw(cpu, newops, op)
if op.is_malloc():
last_malloc = op.result
elif op.can_malloc():
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
@@ -6,6 +6,7 @@
from pypy.jit.backend.llsupport.gc import *
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.metainterp.gc import get_description
+from pypy.jit.metainterp.resoperation import get_deep_immutable_oplist
from pypy.jit.tool.oparser import parse
from pypy.rpython.lltypesystem.rclass import OBJECT, OBJECT_VTABLE
from pypy.jit.metainterp.test.test_optimizeopt import equaloplists
@@ -437,6 +438,7 @@
]
gc_ll_descr = self.gc_ll_descr
gc_ll_descr.gcrefs = MyFakeGCRefList()
+ operations = get_deep_immutable_oplist(operations)
operations = gc_ll_descr.rewrite_assembler(MyFakeCPU(), operations)
assert len(operations) == 2
assert operations[0].getopnum() == rop.GETFIELD_RAW
@@ -472,6 +474,7 @@
gc_ll_descr = self.gc_ll_descr
gc_ll_descr.gcrefs = MyFakeGCRefList()
old_can_move = rgc.can_move
+ operations = get_deep_immutable_oplist(operations)
try:
rgc.can_move = lambda s: False
operations = gc_ll_descr.rewrite_assembler(MyFakeCPU(), operations)
@@ -496,6 +499,7 @@
descr=field_descr),
]
gc_ll_descr = self.gc_ll_descr
+ operations = get_deep_immutable_oplist(operations)
operations = gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
assert len(operations) == 2
#
@@ -520,6 +524,7 @@
descr=array_descr),
]
gc_ll_descr = self.gc_ll_descr
+ operations = get_deep_immutable_oplist(operations)
operations = gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
assert len(operations) == 2
#
@@ -552,7 +557,8 @@
setfield_gc(p0, p1, descr=xdescr)
jump()
""", namespace=locals())
- operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
ops.operations)
+ operations = get_deep_immutable_oplist(ops.operations)
+ operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
operations)
equaloplists(operations, expected.operations)
def test_rewrite_assembler_initialization_store_2(self):
@@ -576,7 +582,8 @@
setfield_raw(p0, p1, descr=xdescr)
jump()
""", namespace=locals())
- operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
ops.operations)
+ operations = get_deep_immutable_oplist(ops.operations)
+ operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
operations)
equaloplists(operations, expected.operations)
def test_rewrite_assembler_initialization_store_3(self):
@@ -594,7 +601,8 @@
setarrayitem_gc(p0, 0, p1, descr=arraydescr)
jump()
""", namespace=locals())
- operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
ops.operations)
+ operations = get_deep_immutable_oplist(ops.operations)
+ operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu,
operations)
equaloplists(operations, expected.operations)
class TestFrameworkMiniMark(TestFramework):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit