Author: Armin Rigo <ar...@tunes.org> Branch: conditional_call_value_2 Changeset: r86999:ae04add86453 Date: 2016-09-11 16:09 +0200 http://bitbucket.org/pypy/pypy/changeset/ae04add86453/
Log: in-progress diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -1328,17 +1328,17 @@ x = math.sqrt(y) return support.cast_to_floatstorage(x) - def execute_cond_call_i(self, calldescr, cond, specialval, func, *args): + def execute_cond_call_pure_i(self, calldescr, cond, specialval, func,*args): if cond == specialval: cond = self.execute_call_i(calldescr, func, *args) return cond - def execute_cond_call_r(self, calldescr, cond, specialval, func, *args): + def execute_cond_call_pure_r(self, calldescr, cond, specialval, func,*args): if cond == specialval: cond = self.execute_call_r(calldescr, func, *args) return cond - def execute_cond_call_n(self, calldescr, cond, specialval, func, *args): + def execute_cond_call(self, calldescr, cond, specialval, func, *args): assert specialval == 1 assert cond in (0, 1) if cond == specialval: diff --git a/rpython/jit/metainterp/heapcache.py b/rpython/jit/metainterp/heapcache.py --- a/rpython/jit/metainterp/heapcache.py +++ b/rpython/jit/metainterp/heapcache.py @@ -271,8 +271,7 @@ return if (OpHelpers.is_plain_call(opnum) or OpHelpers.is_call_loopinvariant(opnum) or - opnum == rop.COND_CALL_I or - opnum == rop.COND_CALL_R): + OpHelpers.is_cond_call_pure(opnum)): effectinfo = descr.get_extra_info() ef = effectinfo.extraeffect if (ef == effectinfo.EF_LOOPINVARIANT or 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 @@ -1076,7 +1076,7 @@ funcbox, argboxes, calldescr, pc): self.do_conditional_call(condbox, specialvalbox, funcbox, argboxes, calldescr, pc, - rop.COND_CALL_N) + rop.COND_CALL) @arguments("int", "boxes3", "boxes3", "orgpc") def _opimpl_recursive_call(self, jdindex, greenboxes, redboxes, pc): @@ -1554,8 +1554,8 @@ op = self.metainterp.execute_and_record_varargs(opnum, argboxes, descr=descr) if pure and not self.metainterp.last_exc_value and op: - op = self.metainterp.record_result_of_call_pure(op, argboxes, descr, - patch_pos) + op = self.metainterp.record_result_of_call_pure(op, opnum, + argboxes, descr, patch_pos) exc = exc and not isinstance(op, Const) if exc: if op is not None: @@ -1739,7 +1739,7 @@ assert not effectinfo.check_forces_virtual_or_virtualizable() exc = effectinfo.check_can_raise() pure = effectinfo.check_is_elidable() - assert pure == (opnum != rop.COND_CALL_N) + assert pure == (opnum != rop.COND_CALL) return self.execute_varargs(opnum, [condbox, specialvalbox] + allboxes, descr, exc, pure) @@ -3078,12 +3078,12 @@ debug_stop("jit-abort-longest-function") return max_jdsd, max_key - def record_result_of_call_pure(self, op, argboxes, descr, patch_pos): + def record_result_of_call_pure(self, op, opnum, argboxes, descr, patch_pos): """ Patch a CALL into a CALL_PURE. """ resbox_as_const = executor.constant_from_op(op) - is_cond = (op.opnum == rop.COND_CALL_PURE_I or - op.opnum == rop.COND_CALL_PURE_R) + is_cond = (opnum == rop.COND_CALL_PURE_I or + opnum == rop.COND_CALL_PURE_R) if is_cond: argboxes = argboxes[2:] for argbox in argboxes: @@ -3099,6 +3099,7 @@ arg_consts = [executor.constant_from_op(a) for a in argboxes] self.call_pure_results[arg_consts] = resbox_as_const if is_cond: + import pdb;pdb.set_trace() return op # there is no COND_CALL_I/R opnum = OpHelpers.call_pure_for_descr(descr) self.history.cut(patch_pos) diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -884,6 +884,8 @@ _args = None def initarglist(self, args): + if self.opnum == rop.CALL_PURE_I: + import pdb;pdb.set_trace() self._args = args if not we_are_translated() and \ self.__class__.__name__.startswith('FINISH'): # XXX remove me @@ -1439,6 +1441,11 @@ opnum == rop.CALL_RELEASE_GIL_N) @staticmethod + def is_cond_call_pure(opnum): + return (opnum == rop.COND_CALL_PURE_I or + opnum == rop.COND_CALL_PURE_R) + + @staticmethod def is_ovf(opnum): return rop._OVF_FIRST <= opnum <= rop._OVF_LAST diff --git a/rpython/jit/metainterp/test/test_call.py b/rpython/jit/metainterp/test/test_call.py --- a/rpython/jit/metainterp/test/test_call.py +++ b/rpython/jit/metainterp/test/test_call.py @@ -54,18 +54,15 @@ self.check_resops(guard_no_exception=0) def test_cond_call_i(self): - @jit.elidable # not really, for tests - def f(l, n): - l.append(n) - return 1000 + @jit.elidable + def f(n): + return n * 200 def main(n): - l = [] - x = jit.conditional_call_elidable(n, 10, f, l, n) - return x + len(l) + return jit.conditional_call_elidable(n, 10, f, n) - assert self.interp_operations(main, [10]) == 1001 - assert self.interp_operations(main, [5]) == 5 + assert self.interp_operations(main, [10]) == 2000 + assert self.interp_operations(main, [15]) == 15 def test_cond_call_r(self): @jit.elidable @@ -92,8 +89,11 @@ # to f() are constants. return jit.conditional_call_elidable(n, 23, f, 40, 2) - assert main(12) == 12 # because 12 != 23 - assert self.interp_operations(main, [12]) == 42 # == f(40, 2) + assert main(12) == 12 # because 12 != 23 + assert self.interp_operations(main, [12]) == 12 # because 12 != 23 + self.check_operations_history(finish=1) # empty history + assert self.interp_operations(main, [23]) == 42 # because 23 == 23 + self.check_operations_history(finish=1) # empty history class TestCall(LLJitMixin, CallTest): diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py --- a/rpython/rlib/jit.py +++ b/rpython/rlib/jit.py @@ -1236,14 +1236,14 @@ def compute_result_annotation(self, *args_s): from rpython.annotator import model as annmodel - self.bookkeeper.emulate_pbc_call(self.bookkeeper.position_key, - args_s[2], args_s[3:]) + s_res = self.bookkeeper.emulate_pbc_call(self.bookkeeper.position_key, + args_s[2], args_s[3:]) if self.instance is _jit_conditional_call_elidable: function = args_s[2].const assert getattr(function, '_elidable_function_', False), ( "jit.conditional_call_elidable() must call an elidable " "function, but got %r" % (function,)) - return args_s[0] + return annmodel.unionof(s_res, args_s[0]) def specialize_call(self, hop): from rpython.rtyper.lltypesystem import lltype _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit