[pypy-commit] pypy optresult-unroll: implement proper subclass check
fijal
noreply at buildbot.pypy.org
Fri Sep 4 09:59:31 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79409:b16ba648cd4f
Date: 2015-09-04 09:59 +0200
http://bitbucket.org/pypy/pypy/changeset/b16ba648cd4f/
Log: implement proper subclass check
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
@@ -12,6 +12,8 @@
from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
OpHelpers
from rpython.rlib.rarithmetic import highest_bit
+from rpython.rtyper.lltypesystem import llmemory
+from rpython.rtyper import rclass
import math
class OptRewrite(Optimization):
@@ -309,17 +311,31 @@
return
self.emit_operation(op)
+ def _check_subclass(self, vtable1, vtable2):
+ # checks that vtable1 is a subclass of vtable2
+ known_class = llmemory.cast_adr_to_ptr(
+ llmemory.cast_int_to_adr(vtable1),
+ rclass.CLASSTYPE)
+ expected_class = llmemory.cast_adr_to_ptr(
+ llmemory.cast_int_to_adr(vtable2),
+ rclass.CLASSTYPE)
+ if (expected_class.subclassrange_min
+ <= known_class.subclassrange_min
+ <= expected_class.subclassrange_max):
+ return True
+ return False
+
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
+ if self._check_subclass(known_class.getint(),
+ op.getarg(1).getint()):
return
elif info.get_descr() is not None:
- if info.get_descr().get_vtable() == op.getarg(1).getint():
- # XXX check for actual subclass?
+ if self._check_subclass(info.get_descr().get_vtable(),
+ op.getarg(1).getint()):
return
self.emit_operation(op)
More information about the pypy-commit
mailing list