[pypy-commit] pypy jit-constptr-2: more tests, and store the descr of guards and finish operations
arigo
pypy.commits at gmail.com
Thu Mar 31 06:42:31 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-constptr-2
Changeset: r83454:e7787f9361a4
Date: 2016-03-31 11:47 +0100
http://bitbucket.org/pypy/pypy/changeset/e7787f9361a4/
Log: more tests, and store the descr of guards and finish operations
diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -2,6 +2,7 @@
from rpython.rlib.objectmodel import we_are_translated
from rpython.rlib.rarithmetic import ovfcheck, highest_bit
from rpython.rtyper.lltypesystem import llmemory, lltype, rstr
+from rpython.rtyper.annlowlevel import cast_instance_to_gcref
from rpython.jit.metainterp import history
from rpython.jit.metainterp.history import ConstInt, ConstPtr
from rpython.jit.metainterp.resoperation import ResOperation, rop, OpHelpers
@@ -94,6 +95,7 @@
op = self.get_box_replacement(op)
orig_op = op
replaced = False
+ opnum = op.getopnum()
for i in range(op.numargs()):
orig_arg = op.getarg(i)
arg = self.get_box_replacement(orig_arg)
@@ -101,16 +103,19 @@
arg = self.remove_constptr(arg)
if orig_arg is not arg:
if not replaced:
- op = op.copy_and_change(op.getopnum())
+ op = op.copy_and_change(opnum)
orig_op.set_forwarded(op)
replaced = True
op.setarg(i, arg)
- if rop.is_guard(op.opnum):
+ if rop.is_guard(opnum):
if not replaced:
- op = op.copy_and_change(op.getopnum())
+ op = op.copy_and_change(opnum)
orig_op.set_forwarded(op)
op.setfailargs([self.get_box_replacement(a, True)
for a in op.getfailargs()])
+ if rop.is_guard(opnum) or opnum == rop.FINISH:
+ llref = cast_instance_to_gcref(op.getdescr())
+ self.gcrefs_output_list.append(llref)
self._newops.append(op)
def replace_op_with(self, op, newop):
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -79,6 +79,7 @@
tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
myT = lltype.cast_opaque_ptr(llmemory.GCREF,
lltype.malloc(T, zero=True))
+ self.myT = myT
#
A = lltype.GcArray(lltype.Signed)
adescr = get_array_descr(self.gc_ll_descr, A)
@@ -116,6 +117,10 @@
zdescr = get_field_descr(self.gc_ll_descr, R1, 'z')
myR1 = lltype.cast_opaque_ptr(llmemory.GCREF,
lltype.malloc(R1, zero=True))
+ myR1b = lltype.cast_opaque_ptr(llmemory.GCREF,
+ lltype.malloc(R1, zero=True))
+ self.myR1 = myR1
+ self.myR1b = myR1b
#
E = lltype.GcStruct('Empty')
edescr = get_size_descr(self.gc_ll_descr, E)
@@ -178,9 +183,10 @@
ops = parse(frm_operations, namespace=namespace)
expected = parse(to_operations % Evaluator(namespace),
namespace=namespace)
+ self.gcrefs = []
operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
ops.operations,
- [])
+ self.gcrefs)
remap = {}
for a, b in zip(ops.inputargs, expected.inputargs):
remap[b] = a
@@ -1297,6 +1303,7 @@
gc_store(p0, %(xdescr.offset)s, i1, %(xdescr.field_size)s)
jump()
""")
+ assert self.gcrefs == [self.myR1]
def test_load_from_gc_table_1p(self):
self.check_rewrite("""
@@ -1310,6 +1317,7 @@
gc_store(p0, %(tzdescr.offset)s, i1, %(tzdescr.field_size)s)
jump()
""")
+ assert self.gcrefs == [self.myT]
def test_load_from_gc_table_2(self):
self.check_rewrite("""
@@ -1324,6 +1332,7 @@
gc_store(p0, %(ydescr.offset)s, f2, %(ydescr.field_size)s)
jump()
""")
+ assert self.gcrefs == [self.myR1]
def test_load_from_gc_table_3(self):
self.check_rewrite("""
@@ -1341,3 +1350,34 @@
gc_store(p1, %(ydescr.offset)s, f2, %(ydescr.field_size)s)
jump()
""")
+ assert self.gcrefs == [self.myR1]
+
+ def test_load_from_gc_table_4(self):
+ self.check_rewrite("""
+ [i1, f2]
+ setfield_gc(ConstPtr(myR1), i1, descr=xdescr)
+ setfield_gc(ConstPtr(myR1b), f2, descr=ydescr)
+ jump()
+ """, """
+ [i1, f2]
+ p0 = load_from_gc_table(0)
+ gc_store(p0, %(xdescr.offset)s, i1, %(xdescr.field_size)s)
+ p1 = load_from_gc_table(1)
+ gc_store(p1, %(ydescr.offset)s, f2, %(ydescr.field_size)s)
+ jump()
+ """)
+ assert self.gcrefs == [self.myR1, self.myR1b]
+
+ def test_guard_in_gcref(self):
+ self.check_rewrite("""
+ [i1, i2]
+ guard_true(i1) []
+ guard_true(i2) []
+ jump()
+ """, """
+ [i1, i2]
+ guard_true(i1) []
+ guard_true(i2) []
+ jump()
+ """)
+ assert len(self.gcrefs) == 2
More information about the pypy-commit
mailing list