aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'rpython/jit/metainterp/optimizeopt/intbounds.py')
-rw-r--r--rpython/jit/metainterp/optimizeopt/intbounds.py76
1 files changed, 32 insertions, 44 deletions
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
index a9445a5f8e..f19989c52d 100644
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -223,7 +223,7 @@ class OptIntBounds(Optimization):
b1 = self.getintbound(op.getarg(0))
b2 = self.getintbound(op.getarg(1))
b = b1.rshift_bound(b2)
- if b.has_lower and b.has_upper and b.lower == b.upper:
+ if b.is_constant():
# constant result (likely 0, for rshifts that kill all bits)
self.make_constant_int(op, b.lower)
return None
@@ -489,9 +489,8 @@ class OptIntBounds(Optimization):
numbits = op.getarg(1).getint() * 8
start = -(1 << (numbits - 1))
stop = 1 << (numbits - 1)
- bounds = IntBound(start, stop - 1)
bres = self.getintbound(op)
- bres.intersect(bounds)
+ bres.intersect_const(start, stop - 1)
def optimize_ARRAYLEN_GC(self, op):
return self.emit(op)
@@ -523,12 +522,11 @@ class OptIntBounds(Optimization):
v1 = self.getintbound(op)
v2 = getptrinfo(op.getarg(0))
intbound = self.getintbound(op.getarg(1))
- if (intbound.has_lower and v2 is not None and
- v2.getlenbound(vstring.mode_string) is not None):
- lb = IntLowerBound(intbound.lower + 1)
- v2.getlenbound(vstring.mode_string).make_ge(lb)
- v1.make_ge(IntLowerBound(0))
- v1.make_lt(IntUpperBound(256))
+ if intbound.has_lower and v2 is not None:
+ lenbound = v2.getlenbound(vstring.mode_string)
+ if lenbound is not None:
+ lenbound.make_gt_const(intbound.lower)
+ v1.intersect_const(0, 255)
def optimize_GETFIELD_RAW_I(self, op):
return self.emit(op)
@@ -537,8 +535,7 @@ class OptIntBounds(Optimization):
descr = op.getdescr()
if descr.is_integer_bounded():
b1 = self.getintbound(op)
- b1.make_ge(IntLowerBound(descr.get_integer_min()))
- b1.make_le(IntUpperBound(descr.get_integer_max()))
+ b1.intersect_const(descr.get_integer_min(), descr.get_integer_max())
optimize_GETFIELD_RAW_F = optimize_GETFIELD_RAW_I
optimize_GETFIELD_RAW_R = optimize_GETFIELD_RAW_I
@@ -567,8 +564,7 @@ class OptIntBounds(Optimization):
descr = op.getdescr()
if descr and descr.is_item_integer_bounded():
intbound = self.getintbound(op)
- intbound.make_ge(IntLowerBound(descr.get_item_integer_min()))
- intbound.make_le(IntUpperBound(descr.get_item_integer_max()))
+ intbound.intersect_const(descr.get_item_integer_min(), descr.get_item_integer_max())
optimize_GETARRAYITEM_RAW_F = optimize_GETARRAYITEM_RAW_I
optimize_GETARRAYITEM_GC_I = optimize_GETARRAYITEM_RAW_I
@@ -585,13 +581,13 @@ class OptIntBounds(Optimization):
def postprocess_UNICODEGETITEM(self, op):
b1 = self.getintbound(op)
- b1.make_ge(IntLowerBound(0))
+ b1.make_ge_const(0)
v2 = getptrinfo(op.getarg(0))
intbound = self.getintbound(op.getarg(1))
- if (intbound.has_lower and v2 is not None and
- v2.getlenbound(vstring.mode_unicode) is not None):
- lb = IntLowerBound(intbound.lower + 1)
- v2.getlenbound(vstring.mode_unicode).make_ge(lb)
+ if intbound.has_lower and v2 is not None:
+ lenbound = v2.getlenbound(vstring.mode_unicode)
+ if lenbound is not None:
+ lenbound.make_gt_const(intbound.lower)
def make_int_lt(self, box1, box2):
b1 = self.getintbound(box1)
@@ -655,7 +651,7 @@ class OptIntBounds(Optimization):
b2 = self.getintbound(box2)
if b2.known_nonnegative:
b1 = self.getintbound(box1)
- if b1.make_lt(b2) | b1.make_ge(IntBound(0, 0)):
+ if b1.make_lt(b2) | b1.make_ge_const(0):
self.propagate_bounds_backward(box1)
#if b2.make_gt(b1):
# ^^ probably correct but I fail to see a case where it is helpful
@@ -666,7 +662,7 @@ class OptIntBounds(Optimization):
b2 = self.getintbound(box2)
if b2.known_nonnegative:
b1 = self.getintbound(box1)
- if b1.make_le(b2) | b1.make_ge(IntBound(0, 0)):
+ if b1.make_le(b2) | b1.make_ge_const(0):
self.propagate_bounds_backward(box1)
#if b2.make_ge(b1):
# ^^ probably correct but I fail to see a case where it is helpful
@@ -718,25 +714,23 @@ class OptIntBounds(Optimization):
def propagate_bounds_INT_EQ(self, op):
r = self.getintbound(op)
- if r.is_constant():
- if r.equal(1):
- b1 = self.getintbound(op.getarg(0))
- b2 = self.getintbound(op.getarg(1))
- if b1.intersect(b2):
- self.propagate_bounds_backward(op.getarg(0))
- if b2.intersect(b1):
- self.propagate_bounds_backward(op.getarg(1))
+ if r.equal(1):
+ b1 = self.getintbound(op.getarg(0))
+ b2 = self.getintbound(op.getarg(1))
+ if b1.intersect(b2):
+ self.propagate_bounds_backward(op.getarg(0))
+ if b2.intersect(b1):
+ self.propagate_bounds_backward(op.getarg(1))
def propagate_bounds_INT_NE(self, op):
r = self.getintbound(op)
- if r.is_constant():
- if r.equal(0):
- b1 = self.getintbound(op.getarg(0))
- b2 = self.getintbound(op.getarg(1))
- if b1.intersect(b2):
- self.propagate_bounds_backward(op.getarg(0))
- if b2.intersect(b1):
- self.propagate_bounds_backward(op.getarg(1))
+ if r.equal(0):
+ b1 = self.getintbound(op.getarg(0))
+ b2 = self.getintbound(op.getarg(1))
+ if b1.intersect(b2):
+ self.propagate_bounds_backward(op.getarg(0))
+ if b2.intersect(b1):
+ self.propagate_bounds_backward(op.getarg(1))
def _propagate_int_is_true_or_zero(self, op, valnonzero, valzero):
if self.is_raw_ptr(op.getarg(0)):
@@ -746,16 +740,10 @@ class OptIntBounds(Optimization):
if r.getint() == valnonzero:
b1 = self.getintbound(op.getarg(0))
if b1.known_nonnegative():
- b1.make_gt(IntBound(0, 0))
+ b1.make_gt_const(0)
self.propagate_bounds_backward(op.getarg(0))
elif r.getint() == valzero:
- b1 = self.getintbound(op.getarg(0))
- # XXX remove this hack maybe?
- # Clever hack, we can't use self.make_constant_int yet because
- # the args aren't in the values dictionary yet so it runs into
- # an assert, this is a clever way of expressing the same thing.
- b1.make_ge(IntBound(0, 0))
- b1.make_lt(IntBound(1, 1))
+ self.make_constant_int(op.getarg(0), 0)
self.propagate_bounds_backward(op.getarg(0))
def propagate_bounds_INT_IS_TRUE(self, op):