Author: Hakan Ardo <[email protected]>
Branch:
Changeset: r48691:d9708bf78c40
Date: 2011-11-03 11:46 +0100
http://bitbucket.org/pypy/pypy/changeset/d9708bf78c40/
Log: break up circular dependencies among short_boxes and give up
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py
b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -146,8 +146,6 @@
newresult = result.clonebox()
optimizer.make_constant(newresult, result)
result = newresult
- if result is op.getarg(0): # FIXME: Unsupported corner
case??
- continue
getop = ResOperation(rop.GETARRAYITEM_GC, [op.getarg(0),
op.getarg(1)],
result, op.getdescr())
shortboxes.add_potential(getop, synthetic=True)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -7450,6 +7450,55 @@
"""
self.optimize_loop(ops, expected)
+ def test_setarrayitem_p0_p0(self):
+ ops = """
+ [i0, i1]
+ p0 = escape()
+ setarrayitem_gc(p0, 2, p0, descr=arraydescr)
+ jump(i0, i1)
+ """
+ expected = """
+ [i0, i1]
+ p0 = escape()
+ setarrayitem_gc(p0, 2, p0, descr=arraydescr)
+ jump(i0, i1)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_setfield_p0_p0(self):
+ ops = """
+ [i0, i1]
+ p0 = escape()
+ setfield_gc(p0, p0, descr=arraydescr)
+ jump(i0, i1)
+ """
+ expected = """
+ [i0, i1]
+ p0 = escape()
+ setfield_gc(p0, p0, descr=arraydescr)
+ jump(i0, i1)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_setfield_p0_p1_p0(self):
+ ops = """
+ [i0, i1]
+ p0 = escape()
+ p1 = escape()
+ setfield_gc(p0, p1, descr=adescr)
+ setfield_gc(p1, p0, descr=bdescr)
+ jump(i0, i1)
+ """
+ expected = """
+ [i0, i1]
+ p0 = escape()
+ p1 = escape()
+ setfield_gc(p0, p1, descr=adescr)
+ setfield_gc(p1, p0, descr=bdescr)
+ jump(i0, i1)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -551,6 +551,7 @@
optimizer.produce_potential_short_preamble_ops(self)
self.short_boxes = {}
+ self.short_boxes_in_production = {}
for box in self.potential_ops.keys():
try:
@@ -606,6 +607,10 @@
return
if isinstance(box, Const):
return
+ if box in self.short_boxes_in_production:
+ raise BoxNotProducable
+ self.short_boxes_in_production[box] = True
+
if box in self.potential_ops:
ops = self.prioritized_alternatives(box)
produced_one = False
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit