Author: Squeaky <squeaky...@gmx.com> Branch: array-propagate-len Changeset: r69154:17003c30fe47 Date: 2014-02-14 19:23 +0100 http://bitbucket.org/pypy/pypy/changeset/17003c30fe47/
Log: add optimization, move stuff around 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 @@ -1,10 +1,12 @@ import py, weakref from rpython.jit.backend import model from rpython.jit.backend.llgraph import support +from rpython.jit.backend.llsupport import symbolic from rpython.jit.metainterp.history import AbstractDescr from rpython.jit.metainterp.history import Const, getkind from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID from rpython.jit.metainterp.resoperation import rop +from rpython.jit.metainterp.optimizeopt import intbounds from rpython.jit.codewriter import longlong, heaptracker from rpython.jit.codewriter.effectinfo import EffectInfo @@ -119,6 +121,24 @@ def is_field_signed(self): return _is_signed_kind(self.FIELD) + 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)) + def _is_signed_kind(TYPE): return (TYPE is not lltype.Bool and isinstance(TYPE, lltype.Number) and rffi.cast(TYPE, -1) == -1) 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 @@ -6,6 +6,7 @@ from rpython.jit.metainterp import history from rpython.jit.codewriter import heaptracker, longlong from rpython.jit.codewriter.longlong import is_longlong +from rpython.jit.metainterp.optimizeopt import intbounds class GcCache(object): @@ -109,17 +110,17 @@ def get_integer_min(self): if self.flag == FLAG_UNSIGNED: - return 0 + return intbounds.get_integer_min(True, self.field_size) elif self.flag == FLAG_SIGNED: - return -(1 << ((self.field_size << 3) - 1)) + return intbounds.get_integer_min(False, self.field_size) assert False def get_integer_max(self): if self.flag == FLAG_UNSIGNED: - return (1 << (self.field_size << 3)) - 1 + return intbounds.get_integer_max(True, self.field_size) elif self.flag == FLAG_SIGNED: - return (1 << ((self.field_size << 3) - 1)) - 1 + return intbounds.get_integer_max(False, self.field_size) assert False 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 @@ -9,6 +9,20 @@ from rpython.jit.metainterp.resoperation import rop +def get_integer_min(is_unsigned, byte_size): + if is_unsigned: + return 0 + else: + return -(1 << ((byte_size << 3) - 1)) + + +def get_integer_max(is_unsigned, byte_size): + if is_unsigned: + return (1 << (byte_size << 3)) - 1 + else: + return (1 << ((byte_size << 3) - 1)) - 1 + + class OptIntBounds(Optimization): """Keeps track of the bounds placed on integers by guards and remove redundant guards""" @@ -322,6 +336,14 @@ v1.intbound.make_ge(IntLowerBound(0)) v1.intbound.make_lt(IntUpperBound(256)) + def optimize_GETFIELD_GC(self, op): + self.emit_operation(op) + descr = op.getdescr() + if descr.is_integer_bounded(): + v1 = self.getvalue(op.result) + v1.intbound.make_ge(IntLowerBound(descr.get_integer_min())) + v1.intbound.make_lt(IntUpperBound(descr.get_integer_max() + 1)) + def optimize_UNICODEGETITEM(self, op): self.emit_operation(op) v1 = self.getvalue(op.result) 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 @@ -5200,7 +5200,7 @@ """ self.optimize_loop(ops, ops) - def test_cmp_outside_intbounds(self): + def test_getfield_cmp_outside_intbounds(self): ops = """ [p0] i0 = getfield_gc(p0, descr=chardescr) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit