[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