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

Reply via email to