Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit