Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r71136:c8e9da1478dc Date: 2014-05-01 17:01 +0200 http://bitbucket.org/pypy/pypy/changeset/c8e9da1478dc/
Log: Redo 3f8b9a32c444, this time more conservatively: try to constant- fold the CALL_PURE operation from *both* rewrite.py and pure.py. 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 @@ -347,6 +347,21 @@ def forget_numberings(self, box): self.optimizer.forget_numberings(box) + def _can_optimize_call_pure(self, op): + arg_consts = [] + for i in range(op.numargs()): + arg = op.getarg(i) + const = self.get_constant_box(arg) + if const is None: + return None + arg_consts.append(const) + else: + # all constant arguments: check if we already know the result + try: + return self.optimizer.call_pure_results[arg_consts] + except KeyError: + return None + class Optimizer(Optimization): 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 @@ -57,6 +57,16 @@ self.emit_operation(nextop) def optimize_CALL_PURE(self, op): + # Step 1: check if all arguments are constant + result = self._can_optimize_call_pure(op) + if result is not None: + # this removes a CALL_PURE with all constant arguments. + self.make_constant(op.result, result) + self.last_emitted_operation = REMOVED + return + + # Step 2: check if all arguments are the same as a previous + # CALL_PURE. args = self.optimizer.make_args_key(op) oldop = self.pure_operations.get(args, None) if oldop is not None and oldop.getdescr() is op.getdescr(): 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 @@ -516,24 +516,13 @@ return False def optimize_CALL_PURE(self, op): - arg_consts = [] - for i in range(op.numargs()): - arg = op.getarg(i) - const = self.get_constant_box(arg) - if const is None: - break - arg_consts.append(const) - else: - # all constant arguments: check if we already know the result - try: - result = self.optimizer.call_pure_results[arg_consts] - except KeyError: - pass - else: - # this removes a CALL_PURE with all constant arguments. - self.make_constant(op.result, result) - self.last_emitted_operation = REMOVED - return + # this removes a CALL_PURE with all constant arguments. + # Note that it's also done in pure.py. For now we need both... + result = self._can_optimize_call_pure(op) + if result is not None: + self.make_constant(op.result, result) + self.last_emitted_operation = REMOVED + return self.emit_operation(op) def optimize_GUARD_NO_EXCEPTION(self, op): 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 @@ -5164,7 +5164,6 @@ self.optimize_strunicode_loop(ops, expected) def test_call_pure_vstring_const(self): - py.test.skip("implement me") ops = """ [] p0 = newstr(3) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit