Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79394:de93952a28cf
Date: 2015-09-03 18:34 +0200
http://bitbucket.org/pypy/pypy/changeset/de93952a28cf/

Log:    continue whacking, next step is fighting with symbolic comparison

diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -33,6 +33,12 @@
     def is_nonnull(self):
         return False
 
+    def is_about_object(self):
+        return False
+
+    def get_descr(self):
+        return None
+
     def is_null(self):
         return False
 
@@ -110,6 +116,9 @@
     _cached_vinfo = None
     descr = None
 
+    def get_descr(self):
+        return self.descr
+
     def force_box(self, op, optforce):
         if self.is_virtual():
             optforce.forget_numberings()
@@ -281,6 +290,9 @@
     def get_known_class(self, cpu):
         return self._known_class
 
+    def is_about_object(self):
+        return True
+
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
         fielddescrs = self.descr.get_all_fielddescrs()
@@ -298,7 +310,8 @@
             short.extend([
                 ResOperation(rop.GUARD_NONNULL, [op], None),
                 ResOperation(rop.GUARD_IS_OBJECT, [op], None),
-                xx
+                ResOperation(rop.GUARD_SUBCLASS, [op,
+                            ConstInt(self.descr.get_vtable())], None)
                 ])
         else:
             AbstractStructPtrInfo.make_guards(self, op, short)
@@ -309,7 +322,12 @@
         self._is_virtual = is_virtual
 
     def make_guards(self, op, short):
-        xxx
+        if self.descr is not None:
+            c_typeid = ConstInt(self.descr.get_type_id())
+            short.extend([
+                ResOperation(rop.GUARD_NONNULL, [op], None),
+                ResOperation(rop.GUARD_GC_TYPE, [op, c_typeid], None)
+            ])
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
@@ -536,6 +554,8 @@
 
     def make_guards(self, op, short):
         AbstractVirtualPtrInfo.make_guards(self, op, short)
+        c_type_id = ConstInt(self.descr.get_type_id())
+        short.append(ResOperation(rop.GUARD_GC_TYPE, [op, c_type_id], None))
         if self.lenbound is not None:
             lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.descr)
             short.append(lenop)
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
@@ -292,6 +292,34 @@
         self.emit_operation(op)
         self.make_constant(op.getarg(0), self.optimizer.cpu.ts.CONST_NULL)
 
+    def optimize_GUARD_IS_OBJECT(self, op):
+        info = self.getptrinfo(op.getarg(0))
+        if info is not None and info.is_about_object():
+            return
+        self.emit_operation(op)
+
+    def optimize_GUARD_GC_TYPE(self, op):
+        info = self.getptrinfo(op.getarg(0))
+        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!")
+            return
+        self.emit_operation(op)
+
+    def optimize_GUARD_SUBCLASS(self, op):
+        info = self.getptrinfo(op.getarg(0))
+        if info is not None and info.is_about_object():
+            known_class = info.get_known_class(self.optimizer.cpu)
+            if known_class:
+                if known_class.getint() == op.getarg(1).getint():
+                    # XXX subclass check
+                    return
+            elif info.get_descr() is not None:
+                if info.get_descr().get_vtable() == op.getarg(1).getint():
+                    # XXX check for actual subclass?
+                    return
+        self.emit_operation(op)
+
     def optimize_GUARD_NONNULL(self, op):
         opinfo = self.getptrinfo(op.getarg(0))
         if opinfo is not None:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -886,6 +886,8 @@
         short = """
         [p1, p2]
         guard_nonnull(p1) []
+        guard_is_object(p1) []
+        guard_subclass(p1, ConstClass(node_vtable)) []
         i1 = getfield_gc_i(p1, descr=valuedescr)
         jump(i1)
         """
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -54,7 +54,7 @@
             if known_class:
                 self.make_constant_class(op, known_class, False)
             if isinstance(preamble_info, info.ArrayPtrInfo):
-                arr_info = info.ArrayPtrInfo(preamble_info.arraydescr)
+                arr_info = info.ArrayPtrInfo(preamble_info.descr)
                 bound = preamble_info.getlenbound(None).clone()
                 assert isinstance(bound, intutils.IntBound)
                 arr_info.lenbound = bound
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to