[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