[pypy-commit] pypy optresult: whack at vrefs
fijal
noreply at buildbot.pypy.org
Tue May 26 14:44:06 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77578:20e90dc30259
Date: 2015-05-26 14:44 +0200
http://bitbucket.org/pypy/pypy/changeset/20e90dc30259/
Log: whack at vrefs
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -86,8 +86,9 @@
newop = optforce.getlastop()
op.set_forwarded(newop)
newop.set_forwarded(self)
+ descr = self.vdescr
self.vdescr = None
- self._force_elements(newop, optforce)
+ self._force_elements(newop, optforce, descr)
return newop
return op
@@ -113,10 +114,9 @@
def getfield(self, descr, optheap=None):
return self._fields[descr.index]
- def _force_elements(self, op, optforce):
+ def _force_elements(self, op, optforce, descr):
if self._fields is None:
return 0
- descr = op.getdescr()
count = 0
for i, flddescr in enumerate(descr.all_fielddescrs):
fld = self._fields[i]
@@ -189,7 +189,7 @@
else:
self._items = [None] * size
- def _force_elements(self, op, optforce):
+ def _force_elements(self, op, optforce, descr):
arraydescr = op.getdescr()
count = 0
for i in range(self.length):
@@ -254,7 +254,7 @@
index = self._compute_index(index, fielddescr)
return self._items[index]
- def _force_elements(self, op, optforce):
+ def _force_elements(self, op, optforce, descr):
i = 0
fielddescrs = op.getdescr().all_interiorfielddescrs
count = 0
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -3017,12 +3017,12 @@
expected = """
[p1]
p0 = force_token()
- p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+ p2 = new_with_vtable(descr=vref_descr)
+ setfield_gc(p2, p0, descr=virtualtokendescr)
setfield_gc(p2, NULL, descr=virtualforceddescr)
- setfield_gc(p2, p0, descr=virtualtokendescr)
escape_n(p2)
+ setfield_gc(p2, NULL, descr=virtualtokendescr)
setfield_gc(p2, p1, descr=virtualforceddescr)
- setfield_gc(p2, NULL, descr=virtualtokendescr)
jump(p1)
"""
# XXX we should optimize a bit more the case of a nonvirtual.
@@ -3050,21 +3050,21 @@
[p0, i1]
p3 = force_token()
#
- p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+ p2 = new_with_vtable(descr=vref_descr)
+ setfield_gc(p2, p3, descr=virtualtokendescr)
setfield_gc(p2, NULL, descr=virtualforceddescr)
- setfield_gc(p2, p3, descr=virtualtokendescr)
setfield_gc(p0, p2, descr=nextdescr)
#
call_may_force_n(i1, descr=mayforcevirtdescr)
guard_not_forced() [i1]
#
setfield_gc(p0, NULL, descr=nextdescr)
+ setfield_gc(p2, NULL, descr=virtualtokendescr)
p1 = new_with_vtable(descr=nodesize)
p1b = new_with_vtable(descr=nodesize)
setfield_gc(p1b, 252, descr=valuedescr)
setfield_gc(p1, p1b, descr=nextdescr)
setfield_gc(p2, p1, descr=virtualforceddescr)
- setfield_gc(p2, NULL, descr=virtualtokendescr)
jump(p0, i1)
"""
self.optimize_loop(ops, expected)
@@ -3090,21 +3090,21 @@
[p0, i1]
p3 = force_token()
#
- p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+ p2 = new_with_vtable(descr=vref_descr)
+ setfield_gc(p2, p3, descr=virtualtokendescr)
setfield_gc(p2, NULL, descr=virtualforceddescr)
- setfield_gc(p2, p3, descr=virtualtokendescr)
setfield_gc(p0, p2, descr=nextdescr)
#
call_may_force_n(i1, descr=mayforcevirtdescr)
guard_not_forced() [p2, i1]
#
setfield_gc(p0, NULL, descr=nextdescr)
+ setfield_gc(p2, NULL, descr=virtualtokendescr)
p1 = new_with_vtable(descr=nodesize)
p1b = new_with_vtable(descr=nodesize)
setfield_gc(p1b, i1, descr=valuedescr)
setfield_gc(p1, p1b, descr=nextdescr)
setfield_gc(p2, p1, descr=virtualforceddescr)
- setfield_gc(p2, NULL, descr=virtualtokendescr)
jump(p0, i1)
"""
# the point of this test is that 'i1' should show up in the fail_args
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -292,6 +292,7 @@
jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable
jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable)
+ vref_descr = cpu.sizeof(vrefinfo.JIT_VIRTUAL_REF, False)
register_known_gctype(cpu, node_vtable, NODE)
register_known_gctype(cpu, node_vtable2, NODE2)
diff --git a/rpython/jit/metainterp/optimizeopt/util.py b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -157,7 +157,7 @@
txt2 = txt2[width:]
print '-' * totwidth
- for op1, op2 in zip(oplist1, oplist2):
+ for i_count, (op1, op2) in enumerate(zip(oplist1, oplist2)):
assert op1.getopnum() == op2.getopnum()
assert op1.numargs() == op2.numargs()
for i in range(op1.numargs()):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -601,19 +601,21 @@
# get some constants
vrefinfo = self.optimizer.metainterp_sd.virtualref_info
c_cls = vrefinfo.jit_virtual_ref_const_class
+ vref_descr = vrefinfo.descr
descr_virtual_token = vrefinfo.descr_virtual_token
descr_forced = vrefinfo.descr_forced
#
# Replace the VIRTUAL_REF operation with a virtual structure of type
# 'jit_virtual_ref'. The jit_virtual_ref structure may be forced soon,
# but the point is that doing so does not force the original structure.
- newop = ResOperation(rop.NEW_WITH_VTABLE, [c_cls])
- vrefvalue = self.make_virtual(c_cls, newop)
- self.optimizer.values[op] = vrefvalue
+ newop = ResOperation(rop.NEW_WITH_VTABLE, [], descr=vref_descr)
+ vrefvalue = self.make_virtual(c_cls, newop, vref_descr)
+ op.set_forwarded(newop)
+ newop.set_forwarded(vrefvalue)
token = ResOperation(rop.FORCE_TOKEN, [])
self.emit_operation(token)
- vrefvalue.setfield(descr_virtual_token, self.getvalue(token))
- vrefvalue.setfield(descr_forced, self.optimizer.cpu.ts.CVAL_NULLREF)
+ vrefvalue.setfield(descr_virtual_token, token)
+ vrefvalue.setfield(descr_forced, self.optimizer.cpu.ts.CONST_NULLREF)
def optimize_VIRTUAL_REF_FINISH(self, op):
# This operation is used in two cases. In normal cases, it
diff --git a/rpython/jit/metainterp/virtualref.py b/rpython/jit/metainterp/virtualref.py
--- a/rpython/jit/metainterp/virtualref.py
+++ b/rpython/jit/metainterp/virtualref.py
@@ -30,6 +30,7 @@
self.descr_virtual_token = fielddescrof(self.JIT_VIRTUAL_REF,
'virtual_token')
self.descr_forced = fielddescrof(self.JIT_VIRTUAL_REF, 'forced')
+ self.descr = self.cpu.sizeof(self.JIT_VIRTUAL_REF, False)
#
# record the type JIT_VIRTUAL_REF explicitly in the rtyper, too
if hasattr(self.warmrunnerdesc, 'rtyper'): # <-- for tests
More information about the pypy-commit
mailing list