[pypy-commit] pypy conditional_call_value_4: progress
arigo
pypy.commits at gmail.com
Wed Nov 23 05:46:31 EST 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: conditional_call_value_4
Changeset: r88575:330341af61ab
Date: 2016-11-23 11:45 +0100
http://bitbucket.org/pypy/pypy/changeset/330341af61ab/
Log: progress
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
@@ -261,9 +261,9 @@
def produce_potential_short_preamble_ops(self, potential_ops):
pass
- def _can_optimize_call_pure(self, op):
+ def _can_optimize_call_pure(self, op, start_index=0):
arg_consts = []
- for i in range(op.numargs()):
+ for i in range(start_index, op.numargs()):
arg = op.getarg(i)
const = self.optimizer.get_constant_box(arg)
if const is None:
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
@@ -597,6 +597,14 @@
return self.emit(op)
def optimize_COND_CALL_VALUE_I(self, op):
+ # this removes a COND_CALL_VALUE with all constant arguments
+ # (ignoring the 'value' in arg0)
+ result = self._can_optimize_call_pure(op, start_index=1)
+ if result is not None:
+ self.make_constant(op, result)
+ self.last_emitted_operation = REMOVED
+ return
+ # otherwise, look if we know the nullness of the first argument
info = self.getnullness(op.getarg(0))
if info == INFO_NONNULL:
self.make_equal_to(op, op.getarg(0))
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -4,6 +4,7 @@
from rpython.rtyper.lltypesystem import lltype
from rpython.jit.metainterp import compile, resume
from rpython.jit.metainterp.history import AbstractDescr, ConstInt, TreeLoop
+from rpython.jit.metainterp.history import ConstPtr
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.optimizeopt import build_opt_chain
from rpython.jit.metainterp.optimizeopt.test.test_util import (
@@ -8727,6 +8728,22 @@
"""
self.optimize_loop(ops, expected)
+ def test_cond_call_r3(self):
+ arg_consts = [ConstInt(i) for i in (123, 4, 5, 6)]
+ call_pure_results = {tuple(arg_consts): ConstPtr(self.myptr)}
+ ops = """
+ [p1]
+ p2 = cond_call_value_r(p1, 123, 4, 5, 6, descr=plain_r_calldescr)
+ p3 = escape_r(p2)
+ jump(p3)
+ """
+ expected = """
+ [p1]
+ p3 = escape_r(ConstPtr(myptr))
+ jump(p3)
+ """
+ self.optimize_loop(ops, expected, call_pure_results=call_pure_results)
+
def test_hippyvm_unroll_bug(self):
ops = """
[p0, i1, i2]
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -3098,7 +3098,7 @@
return resbox_as_const
# not all constants (so far): turn CALL into CALL_PURE, which might
# be either removed later by optimizeopt or turned back into CALL.
- arg_consts = [executor.constant_from_op(a) for a in argboxes]
+ arg_consts = [executor.constant_from_op(a) for a in normargboxes]
self.call_pure_results[arg_consts] = resbox_as_const
if is_cond_value:
return op # but COND_CALL_VALUE remains
More information about the pypy-commit
mailing list