Author: Squeaky <[email protected]>
Branch: array-propagate-len
Changeset: r69161:41e8eb67d110
Date: 2014-02-15 13:38 +0100
http://bitbucket.org/pypy/pypy/changeset/41e8eb67d110/
Log: test and implement optimization for interior fields
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
@@ -201,6 +201,24 @@
def is_float_field(self):
return getkind(self.FIELD) == 'float'
+ def is_integer_bounded(self):
+ return getkind(self.FIELD) == 'int' \
+ and rffi.sizeof(self.FIELD) < symbolic.WORD
+
+ def get_integer_min(self):
+ if getkind(self.FIELD) != 'int':
+ assert False
+
+ return intbounds.get_integer_min(
+ not _is_signed_kind(self.FIELD), rffi.sizeof(self.FIELD))
+
+ def get_integer_max(self):
+ if getkind(self.FIELD) != 'int':
+ assert False
+
+ return intbounds.get_integer_max(
+ not _is_signed_kind(self.FIELD), rffi.sizeof(self.FIELD))
+
_example_res = {'v': None,
'r': lltype.nullptr(llmemory.GCREF.TO),
'i': 0,
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
@@ -273,6 +273,15 @@
def is_float_field(self):
return self.fielddescr.is_float_field()
+ def is_integer_bounded(self):
+ return self.fielddescr.is_integer_bounded()
+
+ def get_integer_min(self):
+ return self.fielddescr.get_integer_min()
+
+ def get_integer_max(self):
+ return self.fielddescr.get_integer_max()
+
def repr_of_descr(self):
return '<InteriorFieldDescr %s>' % self.fielddescr.repr_of_descr()
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
@@ -346,6 +346,8 @@
optimize_GETFIELD_GC = optimize_GETFIELD_RAW
+ optimize_GETINTERIORFIELD_GC = optimize_GETFIELD_RAW
+
def optimize_GETARRAYITEM_RAW(self, op):
self.emit_operation(op)
descr = op.getdescr()
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
@@ -5282,6 +5282,22 @@
"""
self.optimize_loop(ops, expected)
+ def test_getinterior_outside_intbounds(self):
+ ops = """
+ [p0]
+ f0 = getinteriorfield_gc(p0, 0, descr=fc_array_floatdescr)
+ i0 = getinteriorfield_gc(p0, 0, descr=fc_array_chardescr)
+ i1 = int_lt(i0, 256)
+ guard_true(i1) []
+ """
+
+ expected = """
+ [p0]
+ f0 = getinteriorfield_gc(p0, 0, descr=fc_array_floatdescr)
+ i0 = getinteriorfield_gc(p0, 0, descr=fc_array_chardescr)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
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
@@ -225,6 +225,12 @@
rawarraydescr_char = cpu.arraydescrof(lltype.Array(lltype.Char,
hints={'nolength':
True}))
+ fc_array = lltype.GcArray(
+ lltype.Struct(
+ "floatchar", ("float", lltype.Float), ("char", lltype.Char)))
+ fc_array_descr = cpu.arraydescrof(fc_array)
+ fc_array_floatdescr = cpu.interiorfielddescrof(fc_array, "float")
+ fc_array_chardescr = cpu.interiorfielddescrof(fc_array, "char")
for _name, _os in [
('strconcatdescr', 'OS_STR_CONCAT'),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit