[pypy-commit] pypy optresult: implement some parts of varray
fijal
noreply at buildbot.pypy.org
Mon Mar 9 09:41:49 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76288:bb7065b9e03c
Date: 2015-03-09 10:41 +0200
http://bitbucket.org/pypy/pypy/changeset/bb7065b9e03c/
Log: implement some parts of varray
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
@@ -113,6 +113,20 @@
class ArrayPtrInfo(AbstractVirtualPtrInfo):
_attrs_ = ('_is_virtual', 'length', '_items', '_descr')
+ def __init__(self, descr, const, size, clear, is_virtual):
+ self._is_virtual = is_virtual
+ self.length = size
+ if clear:
+ self._items = [const] * size
+ else:
+ self._items = [None] * size
+
+ def setitem_virtual(self, index, item):
+ self._items[index] = item
+
+ def getitem_virtual(self, index):
+ return self._items[index]
+
def getlength(self):
return self.length
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -567,49 +567,29 @@
def make_nonnull(self, op):
op = self.get_box_replacement(op)
+ if op.is_constant():
+ return
opinfo = op.get_forwarded()
if opinfo is not None:
assert opinfo.is_nonnull()
return
op.set_forwarded(info.NonNullPtrInfo())
- def new_ptr_box(self):
- xxx
- return self.cpu.ts.BoxRef()
-
- def new_box(self, fieldofs):
- xxx
- if fieldofs.is_pointer_field():
- return self.new_ptr_box()
- elif fieldofs.is_float_field():
- return BoxFloat()
- else:
- return BoxInt()
-
def new_const(self, fieldofs):
if fieldofs.is_pointer_field():
- return self.cpu.ts.CVAL_NULLREF
+ return self.cpu.ts.CONST_NULL
elif fieldofs.is_float_field():
- return CVAL_ZERO_FLOAT
+ return CONST_ZERO_FLOAT
else:
- return CVAL_ZERO
-
- def new_box_item(self, arraydescr):
- xxx
- if arraydescr.is_array_of_pointers():
- return self.new_ptr_box()
- elif arraydescr.is_array_of_floats():
- return BoxFloat()
- else:
- return BoxInt()
+ return CONST_0
def new_const_item(self, arraydescr):
if arraydescr.is_array_of_pointers():
- return self.cpu.ts.CVAL_NULLREF
+ return self.cpu.ts.CONST_NULL
elif arraydescr.is_array_of_floats():
- return CVAL_ZERO_FLOAT
+ return CONST_ZERO_FLOAT
else:
- return CVAL_ZERO
+ return CONST_0
def propagate_all_forward(self, clear=True):
if clear:
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -7,7 +7,8 @@
from rpython.jit.metainterp.optimizeopt.intutils import IntBound
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
CONST_0, CONST_1)
-from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL
+from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL,\
+ ArrayPtrInfo
from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
OpHelpers
@@ -502,22 +503,25 @@
if length and length.getint() == 0:
return True # 0-length arraycopy
- source_value = self.getvalue(op.getarg(1))
- dest_value = self.getvalue(op.getarg(2))
+ source_info = self.getptrinfo(op.getarg(1))
+ dest_info = self.getptrinfo(op.getarg(2))
source_start_box = self.get_constant_box(op.getarg(3))
dest_start_box = self.get_constant_box(op.getarg(4))
extrainfo = op.getdescr().get_extra_info()
if (source_start_box and dest_start_box
- and length and (dest_value.is_virtual() or length.getint() <= 8) and
- (source_value.is_virtual() or length.getint() <= 8) and
- len(extrainfo.write_descrs_arrays) == 1): # <-sanity check
- from rpython.jit.metainterp.optimizeopt.virtualize import VArrayValue
+ and length and ((dest_info and dest_info.is_virtual()) or
+ length.getint() <= 8) and
+ ((source_info and source_info.is_virtual()) or length.getint() <= 8)
+ and len(extrainfo.write_descrs_arrays) == 1): # <-sanity check
source_start = source_start_box.getint()
dest_start = dest_start_box.getint()
- # XXX fish fish fish
arraydescr = extrainfo.write_descrs_arrays[0]
if arraydescr.is_array_of_structs():
return False # not supported right now
+
+ xxx
+ from rpython.jit.metainterp.optimizeopt.virtualize import VArrayValue
+ # XXX fish fish fish
for index in range(length.getint()):
if source_value.is_virtual():
assert isinstance(source_value, VArrayValue)
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
@@ -987,8 +987,8 @@
ops = """
[f0, f1]
p0 = new_array_clear(3, descr=complexarraydescr)
+ setinteriorfield_gc(p0, 0, f1, descr=complexrealdescr)
setinteriorfield_gc(p0, 0, f0, descr=compleximagdescr)
- setinteriorfield_gc(p0, 0, f1, descr=complexrealdescr)
call_n(0, p0, p0, 0, 2, 1, descr=complexarraycopydescr)
f2 = getinteriorfield_gc_f(p0, 2, descr=complexrealdescr)
f3 = getinteriorfield_gc_f(p0, 2, descr=compleximagdescr)
@@ -1020,7 +1020,7 @@
def test_nonvirtual_1(self):
ops = """
[i]
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i, descr=valuedescr)
i0 = getfield_gc_i(p1, descr=valuedescr)
i1 = int_add(i0, 1)
@@ -1031,7 +1031,7 @@
expected = """
[i]
i1 = int_add(i, 1)
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i, descr=valuedescr)
escape_n(p1)
escape_n(p1)
@@ -1045,7 +1045,7 @@
i0 = getfield_gc_i(p0, descr=valuedescr)
escape_n(p0)
i1 = int_add(i0, i)
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i1, descr=valuedescr)
jump(i, p1)
"""
@@ -1055,7 +1055,7 @@
def test_nonvirtual_later(self):
ops = """
[i]
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i, descr=valuedescr)
i1 = getfield_gc_i(p1, descr=valuedescr)
escape_n(p1)
@@ -1065,7 +1065,7 @@
"""
expected = """
[i]
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i, descr=valuedescr)
escape_n(p1)
i2 = getfield_gc_i(p1, descr=valuedescr)
@@ -1077,7 +1077,7 @@
def test_nonvirtual_write_null_fields_on_force(self):
ops = """
[i]
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i, descr=valuedescr)
i1 = getfield_gc_i(p1, descr=valuedescr)
setfield_gc(p1, 0, descr=valuedescr)
@@ -1087,7 +1087,7 @@
"""
expected = """
[i]
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, 0, descr=valuedescr)
escape_n(p1)
i2 = getfield_gc_i(p1, descr=valuedescr)
@@ -1098,7 +1098,7 @@
def test_getfield_gc_pure_1(self):
ops = """
[i]
- p1 = new_with_vtable(ConstClass(node_vtable))
+ p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
setfield_gc(p1, i, descr=valuedescr)
i1 = getfield_gc_pure_i(p1, descr=valuedescr)
jump(i1)
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
@@ -532,15 +532,11 @@
if arraydescr.is_array_of_structs():
assert clear
opinfo = info.ArrayStructInfo(arraydescr, size, True)
- source_op.set_forwarded(opinfo)
- return opinfo
- vvalue = VArrayStructValue(arraydescr, size, source_op)
else:
- constvalue = self.new_const_item(arraydescr)
- vvalue = VArrayValue(arraydescr, constvalue, size, source_op,
- clear=clear)
- self.make_equal_to(source_op, vvalue)
- return vvalue
+ const = self.new_const_item(arraydescr)
+ opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear, True)
+ source_op.set_forwarded(opinfo)
+ return opinfo
def make_vstruct(self, structdescr, source_op):
vvalue = VStructValue(self.optimizer.cpu, structdescr, source_op)
@@ -670,15 +666,17 @@
def optimize_GETFIELD_GC_I(self, op):
opinfo = self.getptrinfo(op.getarg(0))
+ # XXX dealt with by heapcache
# If this is an immutable field (as indicated by op.is_always_pure())
# then it's safe to reuse the virtual's field, even if it has been
# forced, because it should never be written to again.
- if op.is_always_pure():
- if value.is_forced_virtual() and op.is_always_pure():
- fieldvalue = value.getfield(op.getdescr(), None)
- if fieldvalue is not None:
- self.make_equal_to(op, fieldvalue)
- return
+ #if op.is_always_pure():
+ #
+ # if value.is_forced_virtual() and op.is_always_pure():
+ # fieldvalue = value.getfield(op.getdescr(), None)
+ # if fieldvalue is not None:
+ # self.make_equal_to(op, fieldvalue)
+ # return
if opinfo and opinfo.is_virtual():
fieldop = opinfo.getfield_virtual(op.getdescr())
if fieldop is None:
@@ -785,17 +783,17 @@
self.emit_operation(op)
def optimize_GETARRAYITEM_GC_I(self, op):
- value = self.getvalue(op.getarg(0))
- if value.is_virtual():
- assert isinstance(value, VArrayValue)
+ opinfo = self.getptrinfo(op.getarg(0))
+ if opinfo and opinfo.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
if indexbox is not None:
- itemvalue = value.getitem(indexbox.getint())
- if itemvalue is None: # reading uninitialized array items?
+ item = opinfo.getitem_virtual(indexbox.getint())
+ if item is None: # reading uninitialized array items?
+ assert False, "can't read uninitialized items"
itemvalue = value.constvalue # bah, just return 0
- self.make_equal_to(op, itemvalue)
+ self.make_equal_to(op, item)
return
- value.ensure_nonnull()
+ self.make_nonnull(op.getarg(0))
self.emit_operation(op)
optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I
optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I
@@ -807,13 +805,14 @@
optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_I
def optimize_SETARRAYITEM_GC(self, op):
- value = self.getvalue(op.getarg(0))
- if value.is_virtual():
+ opinfo = self.getptrinfo(op.getarg(0))
+ if opinfo and opinfo.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
if indexbox is not None:
- value.setitem(indexbox.getint(), self.getvalue(op.getarg(2)))
+ opinfo.setitem_virtual(indexbox.getint(),
+ self.get_box_replacement(op.getarg(2)))
return
- value.ensure_nonnull()
+ self.make_nonnull(op.getarg(0))
self.emit_operation(op)
def _unpack_arrayitem_raw_op(self, op, indexbox):
@@ -907,8 +906,7 @@
fieldvalue = self.new_const(descr)
self.make_equal_to(op, fld)
return
- xxx
- value.ensure_nonnull()
+ self.make_nonnull(op.getarg(0))
self.emit_operation(op)
optimize_GETINTERIORFIELD_GC_R = optimize_GETINTERIORFIELD_GC_I
optimize_GETINTERIORFIELD_GC_F = optimize_GETINTERIORFIELD_GC_I
diff --git a/rpython/jit/metainterp/typesystem.py b/rpython/jit/metainterp/typesystem.py
--- a/rpython/jit/metainterp/typesystem.py
+++ b/rpython/jit/metainterp/typesystem.py
@@ -38,7 +38,6 @@
loops_done_with_this_frame_ref = None # patched by compile.py
NULLREF = history.ConstPtr.value
CONST_NULL = history.ConstPtr(NULLREF)
- CVAL_NULLREF = None # patched by optimizeopt.py
def new_ConstRef(self, x):
ptrval = lltype.cast_opaque_ptr(llmemory.GCREF, x)
More information about the pypy-commit
mailing list