Author: Maciej Fijalkowski <fij...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit