[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