Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r74520:6dfe20d64577
Date: 2014-11-14 10:44 +0200
http://bitbucket.org/pypy/pypy/changeset/6dfe20d64577/
Log: hack enough to make the first test from optimizebasic pass
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
@@ -6,7 +6,7 @@
from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization,
CONST_1,
CONST_0, MODE_ARRAY, MODE_STR, MODE_UNICODE)
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop
+from rpython.jit.metainterp.resoperation import rop, AbstractResOp
from rpython.jit.backend.llsupport import symbolic
@@ -58,11 +58,8 @@
if b.has_lower and b.has_upper and b.lower == b.upper:
v.make_constant(ConstInt(b.lower))
- try:
- op = self.optimizer.producer[box]
- except KeyError:
- return
- dispatch_bounds_ops(self, op)
+ if isinstance(box, AbstractResOp):
+ dispatch_bounds_ops(self, box)
def optimize_GUARD_TRUE(self, op):
self.emit_operation(op)
@@ -83,7 +80,7 @@
self.emit_operation(op)
if v1.intbound.known_ge(IntBound(0, 0)) and \
v2.intbound.known_ge(IntBound(0, 0)):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
mostsignificant = v1.intbound.upper | v2.intbound.upper
r.intbound.intersect(IntBound(0, next_pow2_m1(mostsignificant)))
@@ -95,7 +92,7 @@
v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if v2.is_constant():
val = v2.box.getint()
if val >= 0:
@@ -113,7 +110,7 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = v1.intbound.sub_bound(v2.intbound)
if b.bounded():
r.intbound.intersect(b)
@@ -122,7 +119,7 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = v1.intbound.add_bound(v2.intbound)
if b.bounded():
r.intbound.intersect(b)
@@ -131,7 +128,7 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = v1.intbound.mul_bound(v2.intbound)
if b.bounded():
r.intbound.intersect(b)
@@ -140,7 +137,7 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
r.intbound.intersect(v1.intbound.div_bound(v2.intbound))
def optimize_INT_MOD(self, op):
@@ -158,7 +155,7 @@
self.emit_operation(op)
if v2.is_constant():
val = v2.box.getint()
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if val < 0:
if val == -sys.maxint-1:
return # give up
@@ -173,7 +170,7 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = v1.intbound.lshift_bound(v2.intbound)
r.intbound.intersect(b)
# intbound.lshift_bound checks for an overflow and if the
@@ -192,7 +189,7 @@
self.make_constant_int(op.result, b.lower)
else:
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
r.intbound.intersect(b)
def optimize_GUARD_NO_OVERFLOW(self, op):
@@ -245,7 +242,7 @@
# optimize_GUARD_OVERFLOW, then InvalidLoop.
op = op.copy_and_change(rop.INT_ADD)
self.emit_operation(op) # emit the op
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
r.intbound.intersect(resbound)
def optimize_INT_SUB_OVF(self, op):
@@ -258,7 +255,7 @@
if resbound.bounded():
op = op.copy_and_change(rop.INT_SUB)
self.emit_operation(op) # emit the op
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
r.intbound.intersect(resbound)
def optimize_INT_MUL_OVF(self, op):
@@ -268,7 +265,7 @@
if resbound.bounded():
op = op.copy_and_change(rop.INT_MUL)
self.emit_operation(op)
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
r.intbound.intersect(resbound)
def optimize_INT_LT(self, op):
@@ -345,7 +342,7 @@
def optimize_ARRAYLEN_GC(self, op):
self.emit_operation(op)
array = self.getvalue(op.getarg(0))
- result = self.getvalue(op.result)
+ result = self.getvalue(op)
array.make_len_gt(MODE_ARRAY, op.getdescr(), -1)
array.lenbound.bound.intersect(result.intbound)
result.intbound = array.lenbound.bound
@@ -353,7 +350,7 @@
def optimize_STRLEN(self, op):
self.emit_operation(op)
array = self.getvalue(op.getarg(0))
- result = self.getvalue(op.result)
+ result = self.getvalue(op)
array.make_len_gt(MODE_STR, op.getdescr(), -1)
array.lenbound.bound.intersect(result.intbound)
result.intbound = array.lenbound.bound
@@ -361,14 +358,14 @@
def optimize_UNICODELEN(self, op):
self.emit_operation(op)
array = self.getvalue(op.getarg(0))
- result = self.getvalue(op.result)
+ result = self.getvalue(op)
array.make_len_gt(MODE_UNICODE, op.getdescr(), -1)
array.lenbound.bound.intersect(result.intbound)
result.intbound = array.lenbound.bound
def optimize_STRGETITEM(self, op):
self.emit_operation(op)
- v1 = self.getvalue(op.result)
+ v1 = self.getvalue(op)
v1.intbound.make_ge(IntLowerBound(0))
v1.intbound.make_lt(IntUpperBound(256))
@@ -376,7 +373,7 @@
self.emit_operation(op)
descr = op.getdescr()
if descr.is_integer_bounded():
- v1 = self.getvalue(op.result)
+ v1 = self.getvalue(op)
v1.intbound.make_ge(IntLowerBound(descr.get_integer_min()))
v1.intbound.make_le(IntUpperBound(descr.get_integer_max()))
@@ -393,7 +390,7 @@
self.emit_operation(op)
descr = op.getdescr()
if descr and descr.is_item_integer_bounded():
- v1 = self.getvalue(op.result)
+ v1 = self.getvalue(op)
v1.intbound.make_ge(IntLowerBound(descr.get_item_integer_min()))
v1.intbound.make_le(IntUpperBound(descr.get_item_integer_max()))
@@ -404,7 +401,7 @@
def optimize_UNICODEGETITEM(self, op):
self.emit_operation(op)
- v1 = self.getvalue(op.result)
+ v1 = self.getvalue(op)
v1.intbound.make_ge(IntLowerBound(0))
def make_int_lt(self, box1, box2):
@@ -430,7 +427,7 @@
self.make_int_le(box2, box1)
def propagate_bounds_INT_LT(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
self.make_int_lt(op.getarg(0), op.getarg(1))
@@ -438,7 +435,7 @@
self.make_int_ge(op.getarg(0), op.getarg(1))
def propagate_bounds_INT_GT(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
self.make_int_gt(op.getarg(0), op.getarg(1))
@@ -446,7 +443,7 @@
self.make_int_le(op.getarg(0), op.getarg(1))
def propagate_bounds_INT_LE(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
self.make_int_le(op.getarg(0), op.getarg(1))
@@ -454,7 +451,7 @@
self.make_int_gt(op.getarg(0), op.getarg(1))
def propagate_bounds_INT_GE(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
self.make_int_ge(op.getarg(0), op.getarg(1))
@@ -462,7 +459,7 @@
self.make_int_lt(op.getarg(0), op.getarg(1))
def propagate_bounds_INT_EQ(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
v1 = self.getvalue(op.getarg(0))
@@ -473,7 +470,7 @@
self.propagate_bounds_backward(op.getarg(1))
def propagate_bounds_INT_NE(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_0):
v1 = self.getvalue(op.getarg(0))
@@ -484,7 +481,7 @@
self.propagate_bounds_backward(op.getarg(1))
def propagate_bounds_INT_IS_TRUE(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
v1 = self.getvalue(op.getarg(0))
@@ -493,7 +490,7 @@
self.propagate_bounds_backward(op.getarg(0))
def propagate_bounds_INT_IS_ZERO(self, op):
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
if r.is_constant():
if r.box.same_constant(CONST_1):
v1 = self.getvalue(op.getarg(0))
@@ -507,7 +504,7 @@
def propagate_bounds_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.intbound.sub_bound(v2.intbound)
if v1.intbound.intersect(b):
self.propagate_bounds_backward(op.getarg(0))
@@ -518,7 +515,7 @@
def propagate_bounds_INT_SUB(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.intbound.add_bound(v2.intbound)
if v1.intbound.intersect(b):
self.propagate_bounds_backward(op.getarg(0))
@@ -529,7 +526,7 @@
def propagate_bounds_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.intbound.div_bound(v2.intbound)
if v1.intbound.intersect(b):
self.propagate_bounds_backward(op.getarg(0))
@@ -540,7 +537,7 @@
def propagate_bounds_INT_LSHIFT(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.intbound.rshift_bound(v2.intbound)
if v1.intbound.intersect(b):
self.propagate_bounds_backward(op.getarg(0))
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
@@ -273,7 +273,7 @@
CVAL_ZERO = ConstantValue(CONST_0)
CVAL_ZERO_FLOAT = ConstantValue(Const._new(0.0))
llhelper.CVAL_NULLREF = ConstantValue(llhelper.CONST_NULL)
-REMOVED = AbstractResOp(None)
+REMOVED = AbstractResOp()
class Optimization(object):
@@ -377,14 +377,12 @@
self.interned_ints = {}
self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
self.bool_boxes = {}
- self.producer = {}
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
self.opaque_pointers = {}
self.replaces_guard = {}
self._newoperations = []
- self.seen_results = {}
self.optimizer = self
self.optpure = None
self.optearlyforce = None
@@ -479,7 +477,6 @@
def clear_newoperations(self):
self._newoperations = []
- self.seen_results = {}
def make_equal_to(self, box, value, replace=False):
assert isinstance(value, OptValue)
@@ -541,7 +538,6 @@
self.first_optimization.propagate_forward(op)
def propagate_forward(self, op):
- self.producer[op.result] = op
dispatch_opt(self, op)
def emit_operation(self, op):
@@ -574,10 +570,6 @@
op = self.store_final_boxes_in_guard(op, pendingfields)
elif op.can_raise():
self.exception_might_have_happened = True
- if op.result:
- if op.result in self.seen_results:
- raise ValueError, "invalid optimization"
- self.seen_results[op.result] = None
self._newoperations.append(op)
def replace_op(self, old_op, new_op):
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -38,7 +38,8 @@
return
# did we do the exact same operation already?
- args = self.optimizer.make_args_key(op)
+ args = self.optimizer.make_args_key(op.getopnum(),
+ op.getarglist(), op.getdescr())
oldop = self.pure_operations.get(args, None)
if oldop is not None and oldop.getdescr() is op.getdescr():
assert oldop.getopnum() == op.getopnum()
@@ -102,8 +103,7 @@
self.optimizer.optpure = self
def pure(self, opnum, args, result):
- op = ResOperation(opnum, args, result)
- key = self.optimizer.make_args_key(op)
+ key = self.optimizer.make_args_key(opnum, args, None)
if key not in self.pure_operations:
self.pure_operations[key] = result
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
@@ -119,8 +119,8 @@
else:
self.emit_operation(op)
# Synthesize the reverse ops for optimize_default to reuse
- self.pure(rop.INT_ADD, [op.result, op.getarg(1)], op.getarg(0))
- self.pure(rop.INT_SUB, [op.getarg(0), op.result], op.getarg(1))
+ self.pure(rop.INT_ADD, [op, op.getarg(1)], op.getarg(0))
+ self.pure(rop.INT_SUB, [op.getarg(0), op], op.getarg(1))
def optimize_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
@@ -133,10 +133,10 @@
self.make_equal_to(op.result, v1)
else:
self.emit_operation(op)
- self.pure(rop.INT_ADD, [op.getarg(1), op.getarg(0)], op.result)
+ self.pure(rop.INT_ADD, [op.getarg(1), op.getarg(0)], op)
# Synthesize the reverse op for optimize_default to reuse
- self.pure(rop.INT_SUB, [op.result, op.getarg(1)], op.getarg(0))
- self.pure(rop.INT_SUB, [op.result, op.getarg(0)], op.getarg(1))
+ self.pure(rop.INT_SUB, [op, op.getarg(1)], op.getarg(0))
+ self.pure(rop.INT_SUB, [op, op.getarg(0)], op.getarg(1))
def optimize_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
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
@@ -105,7 +105,7 @@
loop.operations[-1].setdescr(token)
expected = convert_old_style_to_targets(self.parse(optops), jump=True)
self._do_optimize_loop(loop, call_pure_results)
- print '\n'.join([str(o) for o in loop.operations])
+ #print '\n'.join([str(o) for o in loop.operations])
self.assert_equal(loop, expected)
def setup_method(self, meth=None):
diff --git a/rpython/jit/metainterp/optimizeopt/util.py
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -157,32 +157,11 @@
x = op1.getarg(i)
y = op2.getarg(i)
assert x.same_box(remap.get(y, y))
- if op2.result in remap:
- if op2.result is None:
- assert op1.result == remap[op2.result]
- else:
- assert op1.result.same_box(remap[op2.result])
+ if op2 in remap:
+ assert op1.same_box(remap[op2])
else:
- remap[op2.result] = op1.result
- if op1.getopnum() not in (rop.JUMP, rop.LABEL): # xxx obscure
+ remap[op2] = op1
+ if op1.getopnum() not in (rop.JUMP, rop.LABEL) and not op1.is_guard():
# xxx obscure
assert op1.getdescr() == op2.getdescr()
- if op1.getfailargs() or op2.getfailargs():
- assert len(op1.getfailargs()) == len(op2.getfailargs())
- if strict_fail_args:
- for x, y in zip(op1.getfailargs(), op2.getfailargs()):
- if x is None:
- assert remap.get(y, y) is None
- else:
- assert x.same_box(remap.get(y, y))
- else:
- fail_args1 = set(op1.getfailargs())
- fail_args2 = set([remap.get(y, y) for y in op2.getfailargs()])
- for x in fail_args1:
- for y in fail_args2:
- if x.same_box(y):
- fail_args2.remove(y)
- break
- else:
- assert False
assert len(oplist1) == len(oplist2)
return True
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -5,10 +5,13 @@
def _get_hash_(self):
return compute_identity_hash(self)
+ def same_box(self, other):
+ return self is other
+
@specialize.argtype(2)
def ResOperation(opnum, args, result, descr=None):
cls = opclasses[opnum]
- op = cls(result)
+ op = cls()
op.initarglist(args)
if descr is not None:
assert isinstance(op, ResOpWithDescr)
@@ -44,9 +47,6 @@
_attrs_ = ()
- def __init__(self, result):
- self.result = result
-
def getopnum(self):
return self.opnum
@@ -115,14 +115,9 @@
op.pc = self.pc
return op
- def __repr__(self):
- try:
- return self.repr()
- except NotImplementedError:
- return object.__repr__(self)
-
- def repr(self, graytext=False):
+ def repr(self, memo, graytext=False):
# RPython-friendly version
+ XXX
if self.result is not None:
sres = '%s = ' % (self.result,)
else:
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -23,7 +23,7 @@
return 'escape'
def clone(self):
- op = ESCAPE_OP(0)
+ op = ESCAPE_OP()
op.initarglist(self.getarglist()[:])
return op
@@ -38,7 +38,7 @@
return 'force_spill'
def clone(self):
- op = FORCE_SPILL(0)
+ op = FORCE_SPILL()
op.initarglist(self.getarglist()[:])
return op
@@ -265,12 +265,12 @@
def create_op(self, opnum, args, descr):
if opnum == ESCAPE_OP.OPNUM:
- op = ESCAPE_OP(0)
+ op = ESCAPE_OP()
op.initarglist(args)
assert descr is None
return op
if opnum == FORCE_SPILL.OPNUM:
- op = FORCE_SPILL(0)
+ op = FORCE_SPILL()
op.initarglist(args)
assert descr is None
return op
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit