[pypy-svn] r70502 - pypy/branch/loop-invariant-decorator/pypy/jit/metainterp

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Jan 11 15:15:16 CET 2010


Author: cfbolz
Date: Mon Jan 11 15:15:16 2010
New Revision: 70502

Modified:
   pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/codewriter.py
   pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/pyjitpl.py
Log:
Make the codewriter produce a new opcode, "residual_call_loopinvariant" and
implement it in the metainterp.


Modified: pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/codewriter.py	Mon Jan 11 15:15:16 2010
@@ -1224,9 +1224,11 @@
         calldescr, non_void_args = self.codewriter.getcalldescr(
             op.args[0], args, op.result, consider_effects_of=op)
         pure = False
+        loopinvariant = False
         if op.opname == "direct_call":
             func = getattr(get_funcobj(op.args[0].value), '_callable', None)
             pure = getattr(func, "_pure_function_", False)
+            loopinvariant = getattr(func, "_jit_loop_invariant_", False)
             all_promoted_args = getattr(func,
                                "_pure_function_with_all_promoted_args_", False)
             if pure and not all_promoted_args:
@@ -1238,7 +1240,10 @@
         except lltype.DelayedPointer:
             canraise = True  # if we need to look into the delayed ptr that is
                              # the portal, then it's certainly going to raise
-        if pure:
+        if loopinvariant:
+            self.emit("residual_call_loopinvariant")
+            assert not non_void_args, "arguments not supported for loop-invariant function!"
+        elif pure:
             # XXX check what to do about exceptions (also MemoryError?)
             self.emit('residual_call_pure')
         elif canraise:

Modified: pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/loop-invariant-decorator/pypy/jit/metainterp/pyjitpl.py	Mon Jan 11 15:15:16 2010
@@ -654,6 +654,10 @@
     def opimpl_residual_call(self, calldescr, varargs):
         return self.do_residual_call(varargs, descr=calldescr, exc=True)
 
+    @arguments("descr", "varargs")
+    def opimpl_residual_call_loopinvariant(self, calldescr, varargs):
+        return self.execute_varargs(rop.CALL_LOOPINVARIANT, varargs, calldescr, exc=True)
+
     @arguments("varargs")
     def opimpl_recursion_leave_prep(self, varargs):
         warmrunnerstate = self.metainterp.staticdata.state



More information about the Pypy-commit mailing list