[pypy-commit] pypy result-in-resops: progress on call_pure, enable operations without failargs
fijal
noreply at buildbot.pypy.org
Tue Sep 25 11:44:09 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57555:d889a377497c
Date: 2012-09-25 09:46 +0200
http://bitbucket.org/pypy/pypy/changeset/d889a377497c/
Log: progress on call_pure, enable operations without failargs
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -1,5 +1,5 @@
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED
-from pypy.jit.metainterp.resoperation import rop, create_resop_2
+from pypy.jit.metainterp.resoperation import rop, create_resop_2, create_resop
from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method,\
ArgsDict
@@ -54,27 +54,29 @@
if nextop:
self.emit_operation(nextop)
- def optimize_CALL_PURE_i(self, op):
- args = self.optimizer.make_args_key(op)
- oldop = self.pure_operations.get(args, None)
- if oldop is not None and oldop.getdescr() is op.getdescr():
- assert oldop.getopnum() == op.getopnum()
- # this removes a CALL_PURE that has the same (non-constant)
- # arguments as a previous CALL_PURE.
- self.make_equal_to(op.result, self.getvalue(oldop.result))
- self.last_emitted_operation = REMOVED
- return
- else:
- self.pure_operations[args] = op
- self.remember_emitting_pure(op)
+ def _new_optimize_call_pure(opnum):
+ def optimize_CALL_PURE(self, op):
+ oldop = self.pure_operations.get(op)
+ if oldop is not None and oldop.getdescr() is op.getdescr():
+ assert oldop.getopnum() == op.getopnum()
+ # this removes a CALL_PURE that has the same (non-constant)
+ # arguments as a previous CALL_PURE.
+ self.make_equal_to(op.result, self.getvalue(oldop.result))
+ self.last_emitted_operation = REMOVED
+ return
+ else:
+ self.pure_operations.add(op)
+ self.remember_emitting_pure(op)
- # replace CALL_PURE with just CALL
- args = op.getarglist()
- self.emit_operation(ResOperation(rop.CALL, args, op.result,
- op.getdescr()))
- optimize_CALL_PURE_f = optimize_CALL_PURE_i
- optimize_CALL_PURE_p = optimize_CALL_PURE_i
- optimize_CALL_PURE_N = optimize_CALL_PURE_i
+ # replace CALL_PURE with just CALL
+ args = op.getarglist()
+ self.emit_operation(create_resop(opnum, op.getresult(), args,
+ op.getdescr()))
+ return optimize_CALL_PURE
+ optimize_CALL_PURE_i = _new_optimize_call_pure(rop.CALL_i)
+ optimize_CALL_PURE_f = _new_optimize_call_pure(rop.CALL_f)
+ optimize_CALL_PURE_p = _new_optimize_call_pure(rop.CALL_p)
+ optimize_CALL_PURE_N = _new_optimize_call_pure(rop.CALL_N)
def optimize_GUARD_NO_EXCEPTION(self, op):
if self.last_emitted_operation is REMOVED:
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -384,6 +384,7 @@
boxkinds=boxkinds)
def invent_fail_descr(self, model, fail_args):
+ xxx
if fail_args is None:
return None
descr = Storage()
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -249,23 +249,26 @@
if rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST:
i = line.find('[', endnum) + 1
j = line.find(']', i)
- if (i <= 0 or j <= 0) and not self.nonstrict:
- raise ParseError("missing fail_args for guard operation")
- fail_args = []
- if i < j:
- for arg in line[i:j].split(','):
- arg = arg.strip()
- if arg == 'None':
- fail_arg = None
- else:
- try:
- fail_arg = self.vars[arg]
- except KeyError:
- raise ParseError(
- "Unknown var in fail_args: %s" % arg)
- fail_args.append(fail_arg)
- if hasattr(descr, '_oparser_uses_descr_of_guard'):
- descr._oparser_uses_descr_of_guard(self, fail_args)
+ if i <= 0 or j <= 0:
+ if not self.nonstrict:
+ raise ParseError("missing fail_args for guard operation")
+ fail_args = None
+ else:
+ fail_args = []
+ if i < j:
+ for arg in line[i:j].split(','):
+ arg = arg.strip()
+ if arg == 'None':
+ fail_arg = None
+ else:
+ try:
+ fail_arg = self.vars[arg]
+ except KeyError:
+ raise ParseError(
+ "Unknown var in fail_args: %s" % arg)
+ fail_args.append(fail_arg)
+ if hasattr(descr, '_oparser_uses_descr_of_guard'):
+ descr._oparser_uses_descr_of_guard(self, fail_args)
else:
fail_args = None
if opnum == rop.JUMP:
diff --git a/pypy/jit/tool/oparser_model.py b/pypy/jit/tool/oparser_model.py
--- a/pypy/jit/tool/oparser_model.py
+++ b/pypy/jit/tool/oparser_model.py
@@ -91,13 +91,13 @@
return True
class ConstInt(Const):
- pass
+ type = 'i'
class ConstPtr(Const):
- pass
+ type = 'p'
class ConstFloat(Const):
- pass
+ type = 'f'
@classmethod
def get_const_ptr_for_string(cls, s):
diff --git a/pypy/jit/tool/test/test_oparser.py b/pypy/jit/tool/test/test_oparser.py
--- a/pypy/jit/tool/test/test_oparser.py
+++ b/pypy/jit/tool/test/test_oparser.py
@@ -184,7 +184,7 @@
guard_true(i0, descr=<Guard0>)
'''
loop = self.parse(x, nonstrict=True)
- assert loop.operations[0].get_extra("failargs") == []
+ assert not loop.operations[0].has_extra("failargs")
def test_no_inputargs(self):
x = '''
More information about the pypy-commit
mailing list