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