Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r44415:290f86a86129
Date: 2011-05-25 09:01 +0200
http://bitbucket.org/pypy/pypy/changeset/290f86a86129/
Log: better handling of constants
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
@@ -4,7 +4,7 @@
from pypy.rlib.objectmodel import we_are_translated
from pypy.jit.metainterp.jitexc import JitException
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
-from pypy.jit.metainterp.history import ConstInt
+from pypy.jit.metainterp.history import ConstInt, Const
class CachedField(object):
def __init__(self):
@@ -111,7 +111,6 @@
for structvalue, op in self._cached_fields_getfield_op.iteritems():
if op and structvalue in self._cached_fields:
potential_ops[op.result] = op
-
class CachedArrayItems(object):
def __init__(self):
@@ -317,7 +316,14 @@
if value is not newvalue:
for cf in self.cached_fields.itervalues():
if value in cf._cached_fields:
- cf._cached_fields[newvalue] = cf._cached_fields[value]
+ if newvalue not in cf._cached_fields:
+ cf._cached_fields[newvalue] = cf._cached_fields[value]
+ op = cf._cached_fields_getfield_op[value].clone()
+ constbox = value.box
+ assert isinstance(constbox, Const)
+ op.setarg(0, constbox)
+ cf._cached_fields_getfield_op[newvalue] = op
+
def force_lazy_setfield(self, descr):
try:
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
@@ -401,12 +401,12 @@
for opt in self.optimizations:
opt.produce_potential_short_preamble_ops(potential_ops)
- def produce_short_preamble_ops(self, inputargs):
+ def produce_short_preamble_ops(self, surviving_boxes):
potential_ops = {}
self.produce_potential_short_preamble_ops(potential_ops)
short_boxes = {}
- for box in inputargs:
+ for box in surviving_boxes:
short_boxes[box] = None
for box in potential_ops.keys():
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py
b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -163,19 +163,20 @@
values = [self.getvalue(arg) for arg in jump_args]
inputargs = virtual_state.make_inputargs(values)
- sb = self.optimizer.produce_short_preamble_ops(inputargs)
+ self.constant_inputargs = {}
+ for box in jump_args:
+ const = self.get_constant_box(box)
+ if const:
+ self.constant_inputargs[box] = const
+
+ sb = self.optimizer.produce_short_preamble_ops(inputargs +
+
self.constant_inputargs.keys())
self.short_boxes = sb
preamble_optimizer = self.optimizer
loop.preamble.quasi_immutable_deps = (
self.optimizer.quasi_immutable_deps)
self.optimizer = self.optimizer.reconstruct_for_next_iteration(sb,
jump_args)
-
- self.constant_inputargs = {}
- loop.quasi_immutable_deps = self.optimizer.quasi_immutable_deps
- for box in jump_args:
- const = self.get_constant_box(box)
- if const:
- self.constant_inputargs[box] = const
+ loop.quasi_immutable_deps = self.optimizer.quasi_immutable_deps
initial_inputargs_len = len(inputargs)
self.inliner = Inliner(loop.inputargs, jump_args)
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
@@ -265,12 +265,10 @@
assert not isinstance(box, Const)
inputargs.append(box)
- if not we_are_translated():
- assert len(set(inputargs)) == len(inputargs)
assert None not in inputargs
return inputargs
-
+
class VirtualStateAdder(resume.ResumeDataVirtualAdder):
def __init__(self, optimizer):
diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py
b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -6256,7 +6256,7 @@
"""
self.optimize_loop(ops, expected)
- def test_constant_getfield(self):
+ def test_constant_getfield1(self):
ops = """
[p1, p187, i184]
p188 = getarrayitem_gc(p187, i184, descr=<GcPtrArrayDescr>)
@@ -6270,3 +6270,68 @@
"""
self.optimize_loop(ops, expected, ops)
# FIXME: check jumparg 0 == getfield_gc()
+
+ def test_constant_getfield2(self):
+ ops = """
+ [p19]
+ p22 = getfield_gc(p19, descr=otherdescr)
+ guard_value(p19, ConstPtr(myptr)) []
+ jump(p19)
+ """
+ expected = """
+ []
+ jump()
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_constant_getfield3(self):
+ ops = """
+ [p19, p20, p21]
+ p22 = getfield_gc(p19, descr=otherdescr)
+ guard_value(p19, ConstPtr(myptr)) []
+ p23 = getfield_gc(ConstPtr(myptr), descr=otherdescr)
+ jump(p20, p21, p21)
+ """
+ expected = """
+ [p20, p21]
+ p22 = getfield_gc(p20, descr=otherdescr)
+ guard_value(p20, ConstPtr(myptr)) []
+ jump(p21, p21)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_constant_getfield4(self):
+ ops = """
+ [p19, p20, p21]
+ p22 = getfield_gc(p19, descr=otherdescr)
+ p23 = getfield_gc(ConstPtr(myptr), descr=otherdescr)
+ guard_value(p19, ConstPtr(myptr)) []
+ jump(p20, p21, p21)
+ """
+ expected = """
+ [p20, p21]
+ p22 = getfield_gc(p20, descr=otherdescr)
+ guard_value(p20, ConstPtr(myptr)) []
+ jump(p21, p21)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_constnats_among_virtual_fileds(self):
+ ops = """
+ [p19, p20, p21]
+ p1 = getfield_gc(p20, descr=valuedescr)
+ p2 = getfield_gc(p1, descr=otherdescr)
+ pv = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(pv, p19, descr=valuedescr)
+ p22 = getfield_gc(p19, descr=otherdescr)
+ guard_value(p19, ConstPtr(myptr)) []
+ p23 = getfield_gc(ConstPtr(myptr), descr=otherdescr)
+ jump(p21, pv, p21)
+ """
+ expected = """
+ [p20]
+ p22 = getfield_gc(p20, descr=otherdescr)
+ guard_value(p20, ConstPtr(myptr)) []
+ jump(ConstPtr(myptr))
+ """
+ self.optimize_loop(ops, expected)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit