Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79502:0798578f25bc
Date: 2015-09-07 12:31 +0200
http://bitbucket.org/pypy/pypy/changeset/0798578f25bc/

Log:    a test and a fix for constant-folding away strange guards

diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py 
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -296,6 +296,13 @@
 
     def optimize_GUARD_IS_OBJECT(self, op):
         info = self.getptrinfo(op.getarg(0))
+        if info and info.is_constant():
+            if info.is_null():
+                raise InvalidLoop("A GUARD_IS_OBJECT(NULL) found")
+            c = self.get_box_replacement(op.getarg(0))
+            if self.optimizer.cpu.check_is_object(c.getref_base()):
+                return
+            raise InvalidLoop("A GUARD_IS_OBJECT(not-an-object) found")
         if info is not None:
             if info.is_about_object():
                 return
@@ -305,6 +312,12 @@
 
     def optimize_GUARD_GC_TYPE(self, op):
         info = self.getptrinfo(op.getarg(0))
+        if info and info.is_constant():
+            c = self.get_box_replacement(op.getarg(0))
+            tid = self.optimizer.cpu.get_actual_typeid(c.getref_base())
+            if tid != op.getarg(1).getint():
+                raise InvalidLoop("wrong GC type ID found on a constant")
+            return
         if info is not None and info.get_descr() is not None:
             if info.get_descr().get_type_id() != op.getarg(1).getint():
                 raise InvalidLoop("wrong GC types passed around!")
@@ -327,6 +340,12 @@
 
     def optimize_GUARD_SUBCLASS(self, op):
         info = self.getptrinfo(op.getarg(0))
+        if info and info.is_constant():
+            c = self.get_box_replacement(op.getarg(0))
+            vtable = self.optimizer.cpu.ts.cls_of_box(c).getint()
+            if self._check_subclass(vtable, op.getarg(1).getint()):
+                return
+            raise InvalidLoop("GUARD_SUBCLASS(const) proven to always fail")
         if info is not None and info.is_about_object():
             known_class = info.get_known_class(self.optimizer.cpu)
             if known_class:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5933,5 +5933,21 @@
         """
         self.optimize_loop(ops, ops)
 
+    def test_random_strange_guards_on_consts(self):
+        ops = """
+        [p0]
+        guard_value(p0, ConstPtr(nodeaddr)) []
+        guard_is_object(p0) []
+        guard_subclass(p0, ConstClass(node_vtable)) []
+        guard_gc_type(p0, ConstInt(node_tid)) []
+        jump(p0)
+        """
+        expected = """
+        [p0]
+        guard_value(p0, ConstPtr(nodeaddr)) []
+        jump(ConstPtr(nodeaddr))
+        """
+        self.optimize_loop(ops, expected)
+
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -140,6 +140,7 @@
     nullptr = lltype.nullptr(llmemory.GCREF.TO)
     #nodebox2 = InputArgRef(lltype.cast_opaque_ptr(llmemory.GCREF, node2))
     nodesize = cpu.sizeof(NODE, node_vtable)
+    node_tid = nodesize.get_type_id()
     nodesize2 = cpu.sizeof(NODE2, node_vtable2)
     nodesize3 = cpu.sizeof(NODE3, node_vtable3)
     valuedescr = cpu.fielddescrof(NODE, 'value')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to