[pypy-commit] pypy optresult: (arigo, fijal) hack until we pass test_constant_propagate
fijal
noreply at buildbot.pypy.org
Tue Feb 24 17:37:07 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76108:67f401e16660
Date: 2015-02-24 18:33 +0200
http://bitbucket.org/pypy/pypy/changeset/67f401e16660/
Log: (arigo, fijal) hack until we pass test_constant_propagate
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
@@ -110,20 +110,20 @@
def optimize_INT_SUB(self, op):
self.emit_operation(op)
- v1 = self.getintbound(op.getarg(0))
- v2 = self.getintbound(op.getarg(1))
- b = v1.sub_bound(v2)
+ b1 = self.getintbound(op.getarg(0))
+ b2 = self.getintbound(op.getarg(1))
+ b = b1.sub_bound(b2)
if b.bounded():
self.getintbound(op).intersect(b)
def optimize_INT_ADD(self, op):
- v1 = self.getvalue(op.getarg(0))
- v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op)
- b = v1.getintbound().add_bound(v2.getintbound())
+ b1 = self.getintbound(op.getarg(0))
+ b2 = self.getintbound(op.getarg(1))
+ r = self.getintbound(op)
+ b = b1.add_bound(b2)
if b.bounded():
- r.getintbound().intersect(b)
+ r.intersect(b)
def optimize_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -499,18 +499,19 @@
self.propagate_bounds_backward(op.getarg(1), v2)
def propagate_bounds_INT_IS_TRUE(self, op):
- r = self.getvalue(op)
+ r = self.get_box_replacement(op)
if r.is_constant():
- if r.box.same_constant(CONST_1):
- v1 = self.getvalue(op.getarg(0))
- if v1.getintbound().known_ge(IntBound(0, 0)):
- v1.getintbound().make_gt(IntBound(0, 0))
- self.propagate_bounds_backward(op.getarg(0), v1)
+ if r.getint() == 1:
+ b1 = self.getintbound(op.getarg(0))
+ if b1.known_ge(IntBound(0, 0)):
+ b1.make_gt(IntBound(0, 0))
+ self.propagate_bounds_backward(op.getarg(0))
def propagate_bounds_INT_IS_ZERO(self, op):
- r = self.getvalue(op)
+ r = self.get_box_replacement(op)
if r.is_constant():
- if r.box.same_constant(CONST_1):
+ if r.getint() == 1:
+ xxx
v1 = self.getvalue(op.getarg(0))
# 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
@@ -520,15 +521,15 @@
self.propagate_bounds_backward(op.getarg(0), v1)
def propagate_bounds_INT_ADD(self, op):
- v1 = self.getvalue(op.getarg(0))
- v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op)
- b = r.getintbound().sub_bound(v2.getintbound())
- if v1.getintbound().intersect(b):
- self.propagate_bounds_backward(op.getarg(0), v1)
- b = r.getintbound().sub_bound(v1.getintbound())
- if v2.getintbound().intersect(b):
- self.propagate_bounds_backward(op.getarg(1), v2)
+ b1 = self.getintbound(op.getarg(0))
+ b2 = self.getintbound(op.getarg(1))
+ r = self.getintbound(op)
+ b = r.sub_bound(b2)
+ if b1.intersect(b):
+ self.propagate_bounds_backward(op.getarg(0))
+ b = r.sub_bound(b1)
+ if b2.intersect(b):
+ self.propagate_bounds_backward(op.getarg(1))
def propagate_bounds_INT_SUB(self, op):
b1 = self.getintbound(op.getarg(0))
diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py b/rpython/jit/metainterp/optimizeopt/intutils.py
--- a/rpython/jit/metainterp/optimizeopt/intutils.py
+++ b/rpython/jit/metainterp/optimizeopt/intutils.py
@@ -252,6 +252,20 @@
op = ResOperation(rop.GUARD_TRUE, [op])
guards.append(op)
+ def is_bool(self):
+ return (self.bounded() and self.known_ge(ConstIntBound(0)) and
+ self.known_le(ConstIntBound(1)))
+
+ def getnullness(self):
+ from rpython.jit.metainterp.optimizeopt import optimizer
+
+ if self.known_gt(IntBound(0, 0)) or \
+ self.known_lt(IntBound(0, 0)):
+ return optimizer.INFO_NONNULL
+ if self.known_ge(IntBound(0, 0)) and \
+ self.known_le(IntBound(0, 0)):
+ return optimizer.INFO_NULL
+ return optimizer.INFO_UNKNOWN
def IntUpperBound(upper):
b = IntBound(lower=0, upper=upper)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -393,6 +393,9 @@
llhelper.CONST_NULLREF = llhelper.CONST_NULL
REMOVED = AbstractResOp()
+INFO_NULL = 0
+INFO_NONNULL = 1
+INFO_UNKNOWN = 2
class Optimization(object):
next_optimization = None
@@ -420,6 +423,11 @@
op.set_forwarded(intbound)
return intbound
+ def getnullness(self, op):
+ if op.type == 'i':
+ return self.getintbound(op).getnullness()
+ xxxx
+
def get_box_replacement(self, op):
return self.optimizer.get_box_replacement(op)
@@ -512,7 +520,6 @@
self.interned_refs = self.cpu.ts.new_ref_dict()
self.interned_ints = {}
self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
- self.bool_boxes = {}
self.pendingfields = None # set temporarily to a list, normally by
# heap.py, as we're about to generate a guard
self.quasi_immutable_deps = None
@@ -721,7 +728,7 @@
def emit_operation(self, op):
if op.returns_bool_result():
- self.bool_boxes[self.getvalue(op)] = None
+ self.getintbound(op).make_bool()
self._emit_operation(op)
@specialize.argtype(0)
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -6,7 +6,7 @@
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.optimizeopt.intutils import IntBound
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
- CONST_0, CONST_1, PtrOptInfo)
+ CONST_0, CONST_1, PtrOptInfo, INFO_NONNULL, INFO_NULL)
from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
OpHelpers
@@ -124,13 +124,13 @@
self.optimizer.pure_reverse(op)
def optimize_INT_ADD(self, op):
- v1 = self.getvalue(op.getarg(0))
- v2 = self.getvalue(op.getarg(1))
+ arg1 = self.get_box_replacement(op.getarg(0))
+ arg2 = self.get_box_replacement(op.getarg(1))
# If one side of the op is 0 the result is the other side.
- if v1.is_constant() and v1.box.getint() == 0:
+ if arg1.is_constant() and arg1.getint() == 0:
self.make_equal_to(op, v2)
- elif v2.is_constant() and v2.box.getint() == 0:
+ elif arg2.is_constant() and arg2.getint() == 0:
self.make_equal_to(op, v1)
else:
self.emit_operation(op)
@@ -427,16 +427,17 @@
self.emit_operation(op)
def _optimize_nullness(self, op, box, expect_nonnull):
- value = self.getvalue(box)
- if value.is_nonnull():
+ info = self.getnullness(box)
+ if info == INFO_NONNULL:
self.make_constant_int(op, expect_nonnull)
- elif value.is_null():
+ elif info == INFO_NULL:
self.make_constant_int(op, not expect_nonnull)
else:
self.emit_operation(op)
def optimize_INT_IS_TRUE(self, op):
- if self.getvalue(op.getarg(0)) in self.optimizer.bool_boxes:
+ if self.getintbound(op.getarg(0)).is_bool():
+ xxx
self.make_equal_to(op, self.getvalue(op.getarg(0)))
return
self._optimize_nullness(op, op.getarg(0), True)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -759,21 +759,23 @@
self.emit_operation(op)
def optimize_INT_ADD(self, op):
- value = self.getvalue(op.getarg(0))
- offsetbox = self.get_constant_box(op.getarg(1))
- if value.is_virtual() and offsetbox is not None:
- offset = offsetbox.getint()
- # the following check is constant-folded to False if the
- # translation occurs without any VRawXxxValue instance around
- if value.is_about_raw:
- if isinstance(value, VRawBufferValue):
- self.make_virtual_raw_slice(value, offset, op)
- return
- elif isinstance(value, VRawSliceValue):
- offset = offset + value.offset
- self.make_virtual_raw_slice(value.rawbuffer_value, offset,
- op)
- return
+ if 0:
+ XXX
+ value = self.getvalue(op.getarg(0))
+ offsetbox = self.get_constant_box(op.getarg(1))
+ if value.is_virtual() and offsetbox is not None:
+ offset = offsetbox.getint()
+ # the following check is constant-folded to False if the
+ # translation occurs without any VRawXxxValue instance around
+ if value.is_about_raw:
+ if isinstance(value, VRawBufferValue):
+ self.make_virtual_raw_slice(value, offset, op)
+ return
+ elif isinstance(value, VRawSliceValue):
+ offset = offset + value.offset
+ self.make_virtual_raw_slice(value.rawbuffer_value, offset,
+ op)
+ return
self.emit_operation(op)
def optimize_ARRAYLEN_GC(self, op):
More information about the pypy-commit
mailing list