Author: Armin Rigo <ar...@tunes.org> Branch: conditional_call_value_3 Changeset: r87020:7c6e114509d2 Date: 2016-09-12 11:05 +0200 http://bitbucket.org/pypy/pypy/changeset/7c6e114509d2/
Log: a runner_test for cond_call_value 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 @@ -1334,6 +1334,16 @@ # cond_call can't have a return value self.execute_call_n(calldescr, func, *args) + def execute_cond_call_value_i(self, calldescr, value, func, *args): + if not value: + value = self.execute_call_i(calldescr, func, *args) + return value + + def execute_cond_call_value_r(self, calldescr, value, func, *args): + if not value: + value = self.execute_call_r(calldescr, func, *args) + return value + def _execute_call(self, calldescr, func, *args): effectinfo = calldescr.get_extra_info() if effectinfo is not None and hasattr(effectinfo, 'oopspecindex'): diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py --- a/rpython/jit/backend/test/runner_test.py +++ b/rpython/jit/backend/test/runner_test.py @@ -2389,7 +2389,7 @@ f2 = longlong.getfloatstorage(3.4) frame = self.cpu.execute_token(looptoken, 1, 0, 1, 2, 3, 4, 5, f1, f2) assert not called - for j in range(5): + for j in range(6): assert self.cpu.get_int_value(frame, j) == j assert longlong.getrealfloat(self.cpu.get_float_value(frame, 6)) == 1.2 assert longlong.getrealfloat(self.cpu.get_float_value(frame, 7)) == 3.4 @@ -2447,6 +2447,51 @@ 67, 89) assert called == [(67, 89)] + def test_cond_call_value(self): + def func_int(*args): + called.append(args) + return len(args) * 100 + 1000 + + for i in range(5): + called = [] + + FUNC = self.FuncType([lltype.Signed] * i, lltype.Signed) + func_ptr = llhelper(lltype.Ptr(FUNC), func_int) + calldescr = self.cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, + EffectInfo.MOST_GENERAL) + + ops = ''' + [i0, i1, i2, i3, i4, i5, i6, f0, f1] + i15 = cond_call_value_i(i1, ConstClass(func_ptr), %s) + guard_false(i0, descr=faildescr) [i1,i2,i3,i4,i5,i6,i15, f0,f1] + finish(i15) + ''' % ', '.join(['i%d' % (j + 2) for j in range(i)] + + ["descr=calldescr"]) + loop = parse(ops, namespace={'faildescr': BasicFailDescr(), + 'func_ptr': func_ptr, + 'calldescr': calldescr}) + looptoken = JitCellToken() + self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken) + f1 = longlong.getfloatstorage(1.2) + f2 = longlong.getfloatstorage(3.4) + frame = self.cpu.execute_token(looptoken, 1, 50, 1, 2, 3, 4, 5, + f1, f2) + assert not called + assert [self.cpu.get_int_value(frame, j) for j in range(7)] == [ + 50, 1, 2, 3, 4, 5, 50] + assert longlong.getrealfloat( + self.cpu.get_float_value(frame, 7)) == 1.2 + assert longlong.getrealfloat( + self.cpu.get_float_value(frame, 8)) == 3.4 + # + frame = self.cpu.execute_token(looptoken, 1, 0, 1, 2, 3, 4, 5, + f1, f2) + assert called == [(1, 2, 3, 4)[:i]] + assert [self.cpu.get_int_value(frame, j) for j in range(7)] == [ + 0, 1, 2, 3, 4, 5, i * 100 + 1000] + assert longlong.getrealfloat(self.cpu.get_float_value(frame, 7)) == 1.2 + assert longlong.getrealfloat(self.cpu.get_float_value(frame, 8)) == 3.4 + def test_force_operations_returning_void(self): values = [] def maybe_force(token, flag): 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 @@ -1149,9 +1149,8 @@ '_CANRAISE_FIRST', # ----- start of can_raise operations ----- '_CALL_FIRST', 'CALL/*d/rfin', - 'COND_CALL/*d/n', - 'COND_CALL_VALUE/*d/ri', - # a conditional call, with first argument as a condition + 'COND_CALL/*d/n', # a conditional call, with first argument as a condition + 'COND_CALL_VALUE/*d/ri', # same but returns a result; emitted by rewrite 'CALL_ASSEMBLER/*d/rfin', # call already compiled assembler 'CALL_MAY_FORCE/*d/rfin', 'CALL_LOOPINVARIANT/*d/rfin', _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit