[pypy-svn] r69089 - in pypy/branch/guard-nonnull/pypy/jit/metainterp: . test

fijal at codespeak.net fijal at codespeak.net
Mon Nov 9 13:57:21 CET 2009


Author: fijal
Date: Mon Nov  9 13:57:21 2009
New Revision: 69089

Modified:
   pypy/branch/guard-nonnull/pypy/jit/metainterp/codewriter.py
   pypy/branch/guard-nonnull/pypy/jit/metainterp/test/test_codewriter.py
Log:
(arigo, fijal)
Optimize away ptr_eq(stuff, NULL) on codewriter level


Modified: pypy/branch/guard-nonnull/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/guard-nonnull/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/guard-nonnull/pypy/jit/metainterp/codewriter.py	Mon Nov  9 13:57:21 2009
@@ -808,6 +808,29 @@
 
     serialize_op_uint_is_true = serialize_op_int_is_true
 
+    def _serialize_op_ptr_eq(self, op, opname):
+        arg0, arg1 = op.args
+        if isinstance(arg0, Constant) and not arg0.value:
+            self.emit(opname, self.var_position(arg1))
+            self.register_var(op.result)
+        elif isinstance(arg1, Constant) and not arg1.value:
+            self.emit(opname, self.var_position(arg0))
+            self.register_var(op.result)
+        else:
+            self.default_serialize_op(op)
+
+    def serialize_op_ptr_eq(self, op):
+        self._serialize_op_ptr_eq(op, 'ptr_iszero')
+
+    def serialize_op_ptr_ne(self, op):
+        self._serialize_op_ptr_eq(op, 'ptr_nonzero')
+
+    def serialize_op_oois(self, op):
+        self._serialize_op_ptr_eq(op, 'ooisnull')
+
+    def serialize_op_ooisnot(self, op):
+        self._serialize_op_ptr_eq(op, 'oononnull')
+
     def serialize_op_malloc(self, op):
         assert op.args[1].value == {'flavor': 'gc'}
         STRUCT = op.args[0].value

Modified: pypy/branch/guard-nonnull/pypy/jit/metainterp/test/test_codewriter.py
==============================================================================
--- pypy/branch/guard-nonnull/pypy/jit/metainterp/test/test_codewriter.py	(original)
+++ pypy/branch/guard-nonnull/pypy/jit/metainterp/test/test_codewriter.py	Mon Nov  9 13:57:21 2009
@@ -363,6 +363,8 @@
         jitcode = cw.make_one_bytecode((graphs[0], None), False)
         assert 'ptr_eq' not in jitcode._source
         assert 'ptr_ne' not in jitcode._source
+        assert jitcode._source.count('ptr_iszero') == 2
+        assert jitcode._source.count('ptr_nonzero') == 2
 
 class ImmutableFieldsTests:
 



More information about the Pypy-commit mailing list