[pypy-commit] pypy result-in-resops: go for full replacement, so we can chain them
fijal
noreply at buildbot.pypy.org
Tue Sep 25 23:39:50 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57587:44551643eed7
Date: 2012-09-25 17:31 +0200
http://bitbucket.org/pypy/pypy/changeset/44551643eed7/
Log: go for full replacement, so we can chain them
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -213,8 +213,7 @@
v2 = self.getvalue(op.getarg(1))
resbound = v1.intbound.sub_bound(v2.intbound)
if resbound.bounded():
- xxx
- op = op.copy_and_change(rop.INT_SUB)
+ op = self.optimizer.copy_and_change(op, rop.INT_SUB)
self.emit_operation(op) # emit the op
r = self.getvalue(op)
r.intbound.intersect(resbound)
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -426,6 +426,11 @@
self.resumedata_memo.forget_numberings(virtualbox)
def getvalue(self, box):
+ try:
+ while True:
+ box = box.get_extra("optimize_replace")
+ except KeyError:
+ pass
if box.is_constant():
if box.type == REF:
if not box.getref_base():
@@ -447,7 +452,7 @@
def setvalue(self, box, value):
assert not box.is_constant()
- assert not box.has_extra("optimize_value")
+ assert not box.has_extra("optimize_value")
box.set_extra("optimize_value", value)
def copy_op_if_modified_by_optimization(self, op):
@@ -471,7 +476,7 @@
if isinstance(box, Const):
return box
try:
- value = box.get_extra("optimize_value")
+ value = self.getvalue(box)
self.ensure_imported(value)
except KeyError:
return None
@@ -491,9 +496,9 @@
def replace(self, what, with_):
assert isinstance(what, AbstractValue)
assert isinstance(with_, AbstractValue)
- val = self.getvalue(with_)
- # completely remove the old optimize value
- what.set_extra("optimize_value", val)
+ assert not what.has_extra("optimize_replace")
+ assert not what.is_constant()
+ what.set_extra("optimize_replace", with_)
def make_constant(self, box, constbox):
self.getvalue(box).make_constant(constbox)
@@ -543,8 +548,10 @@
self.first_optimization.propagate_forward(op)
for arg in self.loop.inputargs:
arg.del_extra("optimize_value")
+ arg.del_extra("optimize_replace")
for op in self.loop.operations:
op.del_extra("optimize_value")
+ op.del_extra("optimize_replace")
self.loop.operations = self.get_newoperations()
self.loop.quasi_immutable_deps = self.quasi_immutable_deps
# accumulate counters
@@ -561,17 +568,17 @@
self.getvalue(op).is_bool_box = True
self._emit_operation(op)
- def get_value_replacement(self, v):
+ def get_value_replacement(self, box):
try:
- value = v.get_extra("optimize_value")
+ value = self.getvalue(box)
except KeyError:
return None
else:
self.ensure_imported(value)
- value = value.force_box(self)
- if value is v:
+ forced_box = value.force_box(self)
+ if forced_box is box:
return None
- return value
+ return forced_box
@specialize.argtype(0)
def _emit_operation(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -80,17 +80,16 @@
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
if v1.is_null():
- self.make_equal_to(op, v2)
+ self.replace(op, op.getarg(1))
elif v2.is_null():
- self.make_equal_to(op, v1)
+ self.replace(op, op.getarg(0))
else:
self.emit_operation(op)
def optimize_INT_SUB(self, op):
- v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
if v2.is_constant() and v2.op.getint() == 0:
- self.make_equal_to(op, v1)
+ self.replace(op, op.getarg(0))
else:
self.emit_operation(op)
# Synthesize the reverse ops for optimize_default to reuse
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -2294,13 +2294,13 @@
ops = """
[f0]
f1 = float_mul(f0, 1.0)
- f2 = escape(f1)
- jump(f2)
+ escape(f1)
+ jump(f1)
"""
expected = """
[f0]
- f2 = escape(f0)
- jump(f2)
+ escape(f0)
+ jump(f0)
"""
self.optimize_loop(ops, expected)
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -658,6 +658,8 @@
'llgraph_var2index': 'llgraph internal attribute',
'optimize_value': 'value replacement for the optimizer. only valid for'
' the length of optimization pass',
+ 'optimize_replace': 'replacement for the op by another op, can be '
+ 'chained',
}
extras = None
More information about the pypy-commit
mailing list