Author: Maciej Fijalkowski <[email protected]>
Branch: conditional_call_value
Changeset: r77045:4979e7d24bd5
Date: 2015-05-04 18:09 +0200
http://bitbucket.org/pypy/pypy/changeset/4979e7d24bd5/
Log: A very simple test to add a conditional_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
@@ -910,6 +910,11 @@
# cond_call can't have a return value
self.execute_call(calldescr, func, *args)
+ def execute_cond_call_value(self, calldescr, cond, defval, func, *args):
+ if not cond:
+ return defval
+ return self.execute_call(calldescr, func, *args)
+
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/codewriter/jtransform.py
b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1500,8 +1500,6 @@
break
if len(op.args) > 4 + 2 or have_floats:
raise Exception("Conditional call does not support floats or more
than 4 arguments")
- import pdb
- pdb.set_trace()
if op.opname == 'jit_conditional_call':
callop = SpaceOperation('direct_call', op.args[1:], op.result)
cutoff = 2
diff --git a/rpython/jit/metainterp/blackhole.py
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1102,12 +1102,16 @@
def bhimpl_residual_call_irf_v(cpu, func, args_i,args_r,args_f,calldescr):
return cpu.bh_call_v(func, args_i, args_r, args_f, calldescr)
- # conditional calls - note that they cannot return stuff
@arguments("cpu", "i", "i", "I", "d")
def bhimpl_conditional_call_i_v(cpu, condition, func, args_i, calldescr):
if condition:
cpu.bh_call_v(func, args_i, None, None, calldescr)
+ @arguments("cpu", "i", "i", "i", "I", "d")
+ def bhimpl_conditional_call_ir_i(cpu, condition, func, default_v, args_i,
+ calldescr):
+ xxx
+
@arguments("cpu", "i", "i", "R", "d")
def bhimpl_conditional_call_r_v(cpu, condition, func, args_r, calldescr):
if condition:
diff --git a/rpython/jit/metainterp/executor.py
b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -83,6 +83,14 @@
if condbox.getint():
do_call(cpu, metainterp, argboxes[1:], descr)
+def do_cond_call_value(cpu, metainterp, argboxes, descr):
+ condbox = argboxes[0]
+ defbox = argboxes[1]
+ if condbox.getint():
+ return do_call(cpu, metainterp, argboxes[2:], descr)
+ else:
+ return defbox.nonconstbox()
+
def do_getarrayitem_gc(cpu, _, arraybox, indexbox, arraydescr):
array = arraybox.getref_base()
index = indexbox.getint()
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
@@ -950,6 +950,12 @@
pc):
self.do_conditional_call(condbox, funcbox, argboxes, calldescr, pc)
+ @arguments("box", "box", "box", "boxes2", "descr", "orgpc")
+ def opimpl_conditional_call_ir_i(self, condbox, funcbox, defbox, argboxes,
+ calldescr, pc):
+ return self.do_conditional_call_value(condbox, funcbox, defbox,
+ argboxes, calldescr, pc)
+
opimpl_conditional_call_r_v = opimpl_conditional_call_i_v
@arguments("box", "box", "boxes2", "descr", "orgpc")
@@ -1532,6 +1538,19 @@
return self.execute_varargs(rop.COND_CALL, [condbox] + allboxes, descr,
exc, pure)
+ def do_conditional_call_value(self, condbox, funcbox, defbox, argboxes,
+ descr, pc):
+ if isinstance(condbox, ConstInt) and condbox.value == 0:
+ return defbox # so that the heapcache can keep argboxes virtual
+ allboxes = self._build_allboxes(funcbox, argboxes, descr)
+ effectinfo = descr.get_extra_info()
+ assert not effectinfo.check_forces_virtual_or_virtualizable()
+ exc = effectinfo.check_can_raise()
+ pure = effectinfo.check_is_elidable()
+ return self.execute_varargs(rop.COND_CALL_VALUE, [condbox, defbox] +
+ allboxes,
+ descr, exc, pure)
+
def _do_jit_force_virtual(self, allboxes, descr, pc):
assert len(allboxes) == 2
if (self.metainterp.jitdriver_sd.virtualizable_info is None and
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
@@ -536,6 +536,8 @@
'_CALL_FIRST',
'CALL/*d',
'COND_CALL/*d', # a conditional call, with first argument as a condition
+ 'COND_CALL_VALUE/*d', # a conditional call that returns a value,
+ # with first argument as a condition and second as default
'CALL_ASSEMBLER/*d', # call already compiled assembler
'CALL_MAY_FORCE/*d',
'CALL_LOOPINVARIANT/*d',
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -1152,16 +1152,12 @@
_about_ = _jit_conditional_call_value
def compute_result_annotation(self, *args_s):
- import pdb
- pdb.set_trace()
s_result = self.bookkeeper.emulate_pbc_call(
self.bookkeeper.position_key, args_s[1], args_s[3:],
callback = self.bookkeeper.position_key)
return s_result
def specialize_call(self, hop):
- import pdb
- pdb.set_trace()
from rpython.rtyper.lltypesystem import lltype
args_v = hop.inputargs(lltype.Bool, lltype.Void, *hop.args_r[2:])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit