Author: Squeaky <[email protected]>
Branch: array-propagate-len
Changeset: r69156:6717c9190ff4
Date: 2014-02-14 23:57 +0100
http://bitbucket.org/pypy/pypy/changeset/6717c9190ff4/
Log: optimize array raw, make test pass
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
@@ -164,6 +164,25 @@
def is_array_of_structs(self):
return isinstance(self.A.OF, lltype.Struct)
+ def is_item_integer_bounded(self):
+ return getkind(self.A.OF) == 'int' \
+ and rffi.sizeof(self.A.OF) < symbolic.WORD
+
+ def get_item_integer_min(self):
+ if getkind(self.A.OF) != 'int':
+ assert False
+
+ return intbounds.get_integer_min(
+ not _is_signed_kind(self.A.OF), rffi.sizeof(self.A.OF))
+
+ def get_item_integer_max(self):
+ if getkind(self.A.OF) != 'int':
+ assert False
+
+ return intbounds.get_integer_max(
+ not _is_signed_kind(self.A.OF), rffi.sizeof(self.A.OF))
+
+
class InteriorFieldDescr(AbstractDescr):
def __init__(self, A, fieldname):
self.A = A
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
@@ -203,6 +203,28 @@
def is_array_of_structs(self):
return self.flag == FLAG_STRUCT
+ def is_item_integer_bounded(self):
+ return self.flag in (FLAG_SIGNED, FLAG_UNSIGNED) \
+ and self.itemsize < symbolic.WORD
+
+ def get_item_integer_min(self):
+ if self.flag == FLAG_UNSIGNED:
+ return intbounds.get_integer_min(True, self.itemsize)
+ elif self.flag == FLAG_SIGNED:
+ return intbounds.get_integer_min(False, self.itemsize)
+
+ assert False
+
+ def get_item_integer_max(self):
+ if self.flag == FLAG_UNSIGNED:
+ return intbounds.get_integer_max(True, self.itemsize)
+ elif self.flag == FLAG_SIGNED:
+ return intbounds.get_integer_max(False, self.itemsize)
+
+ assert False
+
+
+
def repr_of_descr(self):
return '<Array%s %s>' % (self.flag, self.itemsize)
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py
b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -344,6 +344,15 @@
v1.intbound.make_ge(IntLowerBound(descr.get_integer_min()))
v1.intbound.make_lt(IntUpperBound(descr.get_integer_max() + 1))
+ def optimize_GETARRAYITEM_RAW(self, op):
+ self.emit_operation(op)
+ descr = op.getdescr()
+ if descr.is_item_integer_bounded():
+ v1 = self.getvalue(op.result)
+ v1.intbound.make_ge(IntLowerBound(descr.get_item_integer_min()))
+ v1.intbound.make_lt(
+ IntUpperBound(descr.get_item_integer_max() + 1))
+
def optimize_UNICODEGETITEM(self, op):
self.emit_operation(op)
v1 = self.getvalue(op.result)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit