[pypy-commit] pypy optresult-unroll: write support for varraystruct virtual info
fijal
noreply at buildbot.pypy.org
Thu Aug 27 14:18:45 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79254:ad90619d3fce
Date: 2015-08-27 14:18 +0200
http://bitbucket.org/pypy/pypy/changeset/ad90619d3fce/
Log: write support for varraystruct virtual info
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -231,6 +231,9 @@
self.arraydescr = runner.arraydescrof(A)
self.fielddescr = runner.fielddescrof(A.OF, fieldname)
+ def get_index(self):
+ return self.fielddescr.get_index()
+
def get_arraydescr(self):
return self.arraydescr
diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -320,6 +320,9 @@
self.arraydescr = arraydescr
self.fielddescr = fielddescr
+ def get_index(self):
+ return self.fielddescr.get_index()
+
def get_arraydescr(self):
return self.arraydescr
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -1,6 +1,7 @@
from rpython.jit.metainterp.walkvirtual import VirtualVisitor
from rpython.jit.metainterp.history import ConstInt, ConstPtr, ConstFloat
-from rpython.jit.metainterp.optimizeopt import info
+from rpython.jit.metainterp.optimizeopt.info import ArrayPtrInfo,\
+ ArrayStructInfo
from rpython.jit.metainterp.optimizeopt.intutils import \
MININT, MAXINT, IntBound
from rpython.jit.metainterp.resoperation import rop, ResOperation,\
@@ -53,6 +54,18 @@
else:
return InputArgInt(self.cpu.bh_getfield_gc_i(struct, descr))
+ def get_runtime_interiorfield(self, box, descr, i):
+ struct = box.getref_base()
+ if descr.is_pointer_field():
+ return InputArgRef(self.cpu.bh_getinteriorfield_gc_r(struct, i,
+ descr))
+ elif descr.is_float_field():
+ return InputArgFloat(self.cpu.bh_getinteriorfield_gc_f(struct, i,
+ descr))
+ else:
+ return InputArgInt(self.cpu.bh_getinteriorfield_gc_i(struct, i,
+ descr))
+
class AbstractVirtualStateInfo(object):
position = -1
@@ -92,7 +105,7 @@
'Generating guards for making the VirtualStates ' +
'at hand match have not been implemented')
- def enum_forced_boxes(self, boxes, value, optimizer):
+ def enum_forced_boxes(self, boxes, structbox, optimizer, force_boxes=False):
raise NotImplementedError
def enum(self, virtual_state):
@@ -225,7 +238,7 @@
for i in range(len(self.fieldstate)):
if runtime_box is not None:
opinfo = state.optimizer.getptrinfo(box)
- assert isinstance(opinfo, info.ArrayPtrInfo)
+ assert isinstance(opinfo, ArrayPtrInfo)
fieldbox = opinfo._items[i]
fieldbox_runtime = state.get_runtime_item(runtime_box,
self.arraydescr, i)
@@ -257,12 +270,12 @@
class VArrayStructStateInfo(AbstractVirtualStateInfo):
- def __init__(self, arraydescr, fielddescrs):
+ def __init__(self, arraydescr, fielddescrs, length):
self.arraydescr = arraydescr
self.fielddescrs = fielddescrs
+ self.length = length
- def _generate_guards(self, other, box, opinfo, state):
- xxxx
+ def _generate_guards(self, other, box, runtime_box, state):
if not isinstance(other, VArrayStructStateInfo):
raise VirtualStatesCantMatch("other is not an VArrayStructStateInfo")
if self.arraydescr is not other.arraydescr:
@@ -271,48 +284,54 @@
if len(self.fielddescrs) != len(other.fielddescrs):
raise VirtualStatesCantMatch("other has a different length")
- p = 0
+ if len(self.fielddescrs) != len(other.fielddescrs):
+ raise VirtualStatesCantMatch("other has a different length")
+ for j, descr in enumerate(self.fielddescrs):
+ if descr is not other.fielddescrs[j]:
+ raise VirtualStatesCantMatch("other is a different kind of array")
fieldbox = None
- fieldinfo = None
- for i in range(len(self.fielddescrs)):
- if len(self.fielddescrs[i]) != len(other.fielddescrs[i]):
- raise VirtualStatesCantMatch("other has a different length")
- for j in range(len(self.fielddescrs[i])):
- descr = self.fielddescrs[i][j]
- if descr is not other.fielddescrs[i][j]:
- raise VirtualStatesCantMatch("other is a different kind of array")
+ fieldbox_runtime = None
+ opinfo = state.optimizer.getptrinfo(box)
+ for i in range(self.length):
+ for descr in self.fielddescrs:
+ index = i * len(self.fielddescrs) + descr.get_index()
+ fieldstate = self.fieldstate[index]
+ if fieldstate is None:
+ continue
if box is not None:
- xxx
- assert isinstance(value, virtualize.VArrayStructValue)
- v = value._items[i][descr]
- self.fieldstate[p].generate_guards(other.fieldstate[p],
- fieldbox, fieldinfo,
- state)
- p += 1
+ fieldbox = opinfo._items[index]
+ fieldbox_runtime = state.get_runtime_interiorfield(
+ runtime_box, descr, i)
+ self.fieldstate[index].generate_guards(other.fieldstate[index],
+ fieldbox, fieldbox_runtime, state)
def _enum(self, virtual_state):
for s in self.fieldstate:
- s.enum(virtual_state)
+ if s is not None:
+ s.enum(virtual_state)
- def enum_forced_boxes(self, boxes, value, optimizer):
- xxx
- if not isinstance(value, virtualize.VArrayStructValue):
+ def enum_forced_boxes(self, boxes, structbox, optimizer, force_boxes=False):
+ opinfo = optimizer.getptrinfo(structbox)
+ if not isinstance(opinfo, ArrayStructInfo):
raise BadVirtualState
- if not value.is_virtual():
+ if not opinfo.is_virtual():
raise BadVirtualState
- if len(self.fielddescrs) > len(value._items):
- raise BadVirtualState
- p = 0
- for i in range(len(self.fielddescrs)):
- for j in range(len(self.fielddescrs[i])):
- try:
- v = value._items[i][self.fielddescrs[i][j]]
- except KeyError:
- raise BadVirtualState
- s = self.fieldstate[p]
- if s.position > self.position:
- s.enum_forced_boxes(boxes, v, optimizer)
- p += 1
+ #if len(self.fielddescrs) > len(value._items):
+ # raise BadVirtualState
+ for i in range(self.length):
+ for descr in self.fielddescrs:
+ index = i * len(self.fielddescrs) + descr.get_index()
+ fieldstate = self.fieldstate[index]
+ itembox = opinfo._items[i * len(self.fielddescrs) +
+ descr.get_index()]
+ if fieldstate is None:
+ if itembox is not None:
+ raise BadVirtualState
+ continue
+ # I think itembox must be present here
+ if fieldstate.position > self.position:
+ fieldstate.enum_forced_boxes(boxes, itembox, optimizer,
+ force_boxes)
def debug_header(self, indent):
debug_print(indent + 'VArrayStructStateInfo(%d):' % self.position)
@@ -652,4 +671,4 @@
return VArrayStateInfo(arraydescr)
def visit_varraystruct(self, arraydescr, length, fielddescrs):
- return VArrayStructStateInfo(arraydescr, fielddescrs)
+ return VArrayStructStateInfo(arraydescr, fielddescrs, length)
More information about the pypy-commit
mailing list