[pypy-commit] pypy optresult-unroll: only emit guard_is_object if we need it

fijal noreply at buildbot.pypy.org
Fri Sep 4 13:28:35 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79416:bd8b6b4b646a
Date: 2015-09-04 13:22 +0200
http://bitbucket.org/pypy/pypy/changeset/bd8b6b4b646a/

Log:	only emit guard_is_object if we need it

diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -37,6 +37,7 @@
         self.translate_support_code = translate_support_code
         if translate_support_code and rtyper is not None:
             translator = rtyper.annotator.translator
+            self.remove_gctypeptr = translator.config.translation.gcremovetypeptr
         else:
             translator = None
         self.gc_ll_descr = get_ll_description(gcdescr, translator, rtyper)
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -19,6 +19,8 @@
 
     propagate_exception_descr = None
 
+    remove_gctypeptr = False
+
     def __init__(self):
         self.tracker = CPUTotalTracker()
 
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
@@ -75,7 +75,7 @@
     def copy_fields_to_const(self, constinfo, optheap):
         pass
 
-    def make_guards(self, op, short):
+    def make_guards(self, op, short, optimizer):
         pass
     
 class NonNullPtrInfo(PtrInfo):
@@ -108,7 +108,7 @@
             return
         return self._visitor_walk_recursive(instbox, visitor, optimizer)
 
-    def make_guards(self, op, short):
+    def make_guards(self, op, short, optimizer):
         op = ResOperation(rop.GUARD_NONNULL, [op], None)
         short.append(op)
 
@@ -307,29 +307,28 @@
         assert self.is_virtual()
         return visitor.visit_virtual(self.descr, fielddescrs)
 
-    def make_guards(self, op, short):
+    def make_guards(self, op, short, optimizer):
         if self._known_class is not None:
-            short.extend([
-                ResOperation(rop.GUARD_NONNULL, [op], None),
-                ResOperation(rop.GUARD_IS_OBJECT, [op], None),
-                ResOperation(rop.GUARD_CLASS, [op, self._known_class], None)
-                ])
+            short.append(ResOperation(rop.GUARD_NONNULL, [op], None))
+            if not optimizer.cpu.remove_gctypeptr:
+                short.append(ResOperation(rop.GUARD_IS_OBJECT, [op], None))
+            short.append(ResOperation(rop.GUARD_CLASS,
+                                      [op, self._known_class], None))
         elif self.descr is not None:
-            short.extend([
-                ResOperation(rop.GUARD_NONNULL, [op], None),
-                ResOperation(rop.GUARD_IS_OBJECT, [op], None),
-                ResOperation(rop.GUARD_SUBCLASS, [op,
-                            ConstInt(self.descr.get_vtable())], None)
-                ])
+            short.append(ResOperation(rop.GUARD_NONNULL, [op], None))
+            if not optimizer.cpu.remove_gctypeptr:
+                short.append(ResOperation(rop.GUARD_IS_OBJECT, [op], None))
+            short.append(ResOperation(rop.GUARD_SUBCLASS, [op,
+                            ConstInt(self.descr.get_vtable())], None))
         else:
-            AbstractStructPtrInfo.make_guards(self, op, short)
+            AbstractStructPtrInfo.make_guards(self, op, short, optimizer)
 
 class StructPtrInfo(AbstractStructPtrInfo):
     def __init__(self, descr, is_virtual=False):
         self.descr = descr
         self._is_virtual = is_virtual
 
-    def make_guards(self, op, short):
+    def make_guards(self, op, short, optimizer):
         if self.descr is not None:
             c_typeid = ConstInt(self.descr.get_type_id())
             short.extend([
@@ -565,14 +564,14 @@
                     self._items[i] = fldbox
         return op
 
-    def make_guards(self, op, short):
-        AbstractVirtualPtrInfo.make_guards(self, op, short)
+    def make_guards(self, op, short, optimizer):
+        AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer)
         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)
-            self.lenbound.make_guards(lenop, short)
+            self.lenbound.make_guards(lenop, short, optimizer)
 
 class ArrayStructInfo(ArrayPtrInfo):
     def __init__(self, descr, size, is_virtual=False):
@@ -648,7 +647,7 @@
     def getconst(self):
         return self._const
 
-    def make_guards(self, op, short):
+    def make_guards(self, op, short, optimizer):
         short.append(ResOperation(rop.GUARD_VALUE, [op, self._const]))
 
     def _get_info(self, descr, optheap):
@@ -758,5 +757,5 @@
     def __init__(self, const):
         self._const = const
 
-    def make_guards(self, op, short):
+    def make_guards(self, op, short, optimizer):
         short.append(ResOperation(rop.GUARD_VALUE, [op, self._const]))
diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py b/rpython/jit/metainterp/optimizeopt/intutils.py
--- a/rpython/jit/metainterp/optimizeopt/intutils.py
+++ b/rpython/jit/metainterp/optimizeopt/intutils.py
@@ -257,7 +257,7 @@
         res.has_upper = self.has_upper
         return res
 
-    def make_guards(self, box, guards):
+    def make_guards(self, box, guards, optimizer):
         if self.is_constant():
             guards.append(ResOperation(rop.GUARD_VALUE,
                                        [box, ConstInt(self.upper)]))
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -355,14 +355,14 @@
             if isinstance(arg, AbstractInputArg):
                 info = arg.get_forwarded()
                 if info is not None and info is not empty_info:
-                    info.make_guards(arg, self.short)
+                    info.make_guards(arg, self.short, optimizer)
             elif arg.get_forwarded() is None:
                 pass
             else:
                 self.short.append(arg)
                 info = arg.get_forwarded()
                 if info is not empty_info:
-                    info.make_guards(arg, self.short)
+                    info.make_guards(arg, self.short, optimizer)
                 arg.set_forwarded(None)
         self.short.append(preamble_op)
         if preamble_op.is_ovf():
@@ -372,7 +372,7 @@
         if optimizer is not None:
             optimizer.setinfo_from_preamble(box, info, None)
         if info is not empty_info:
-            info.make_guards(preamble_op, self.short)
+            info.make_guards(preamble_op, self.short, optimizer)
         return preamble_op
 
 class ShortPreambleBuilder(AbstractShortPreambleBuilder):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -404,7 +404,8 @@
             # confusingly enough, this is done also for pointers
             # which have the full range as the "bound", so it always works
             return self._generate_guards_intbounds(other, box, runtime_box,
-                                                   extra_guards)
+                                                   extra_guards,
+                                                   state.optimizer)
 
         # the following conditions often peek into the runtime value that the
         # box had when tracing. This value is only used as an educated guess.
@@ -473,7 +474,8 @@
                 raise VirtualStatesCantMatch("other not constant")
         assert 0, "unreachable"
 
-    def _generate_guards_intbounds(self, other, box, runtime_box, extra_guards):
+    def _generate_guards_intbounds(self, other, box, runtime_box, extra_guards,
+                                   optimizer):
         if self.intbound is None:
             return
         if self.intbound.contains_bound(other.intbound):
@@ -482,7 +484,7 @@
             self.intbound.contains(runtime_box.getint())):
             # this may generate a few more guards than needed, but they are
             # optimized away when emitting them
-            self.intbound.make_guards(box, extra_guards)
+            self.intbound.make_guards(box, extra_guards, optimizer)
             return
         raise VirtualStatesCantMatch("intbounds don't match")
 
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -122,8 +122,8 @@
         string_optimizer.emit_operation(lengthop)
         return lengthop
 
-    def make_guards(self, op, short):
-        info.AbstractVirtualPtrInfo.make_guards(self, op, short)
+    def make_guards(self, op, short, optimizer):
+        info.AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer)
         if self.lenbound and self.lenbound.lower >= 1:
             if self.mode is mode_string:
                 lenop = ResOperation(rop.STRLEN, [op])
@@ -131,7 +131,7 @@
                 assert self.mode is mode_unicode
                 lenop = ResOperation(rop.UNICODELEN, [op])
             short.append(lenop)
-            self.lenbound.make_guards(lenop, short)
+            self.lenbound.make_guards(lenop, short, optimizer)
 
     def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox,
                           mode):


More information about the pypy-commit mailing list