Author: Hakan Ardo <ha...@debian.org> Branch: jit-duplicated_short_boxes Changeset: r46916:d8a4678476e8 Date: 2011-08-30 09:23 +0200 http://bitbucket.org/pypy/pypy/changeset/d8a4678476e8/
Log: ensure values are imported when accessed from optimizer.values 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 @@ -40,7 +40,7 @@ # Hack to ensure constants are imported from the preamble if cached_fieldvalue and fieldvalue.is_constant(): - optheap.getvalue(cached_fieldvalue.get_key_box()) + optheap.optimizer.ensure_imported(cached_fieldvalue) cached_fieldvalue = self._cached_fields.get(structvalue, None) if cached_fieldvalue is not fieldvalue: 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 @@ -415,17 +415,21 @@ value = self.values[box] except KeyError: value = self.values[box] = OptValue(box) + self.ensure_imported(value) + return value + + def ensure_imported(self, value): if not self.emitting_dissabled and value in self.importable_values: imp = self.importable_values[value] del self.importable_values[value] - imp.import_value(box, value) - return value + imp.import_value(value) def get_constant_box(self, box): if isinstance(box, Const): return box try: value = self.values[box] + self.ensure_imported(value) except KeyError: return None if value.is_constant(): @@ -561,7 +565,7 @@ for i in range(n): arg = op.getarg(i) try: - value = self.values[arg] + value = self.getvalue(arg) except KeyError: pass else: 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 @@ -7111,7 +7111,21 @@ """ self.optimize_loop(ops, expected) - + def test_import_constants_when_folding_pure_operations(self): + ops = """ + [p0] + f1 = getfield_gc(p0, descr=valuedescr) + f2 = float_abs(f1) + call(7.0, descr=nonwritedescr) + setfield_gc(p0, -7.0, descr=valuedescr) + jump(p0) + """ + expected = """ + [p0] + call(7.0, descr=nonwritedescr) + jump(p0) + """ + self.optimize_loop(ops, expected) class TestLLtype(OptimizeOptTest, LLtypeMixin): pass 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 @@ -425,7 +425,7 @@ inputargs.append(box) box = newresult if box in self.optimizer.values: - box = self.optimizer.values[box].force_box() + box = self.optimizer.getvalue(box).force_box() jumpargs.append(box) @@ -531,7 +531,7 @@ self.preamble_value = value self.op = op - def import_value(self, box, value): + def import_value(self, value): value.import_from(self.preamble_value, self.unroll.optimizer) self.unroll.add_op_to_short(self.op, self.unroll.short, self.unroll.short_seen, False, True) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit