Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79502:0798578f25bc
Date: 2015-09-07 12:31 +0200
http://bitbucket.org/pypy/pypy/changeset/0798578f25bc/
Log: a test and a fix for constant-folding away strange guards
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
@@ -296,6 +296,13 @@
def optimize_GUARD_IS_OBJECT(self, op):
info = self.getptrinfo(op.getarg(0))
+ if info and info.is_constant():
+ if info.is_null():
+ raise InvalidLoop("A GUARD_IS_OBJECT(NULL) found")
+ c = self.get_box_replacement(op.getarg(0))
+ if self.optimizer.cpu.check_is_object(c.getref_base()):
+ return
+ raise InvalidLoop("A GUARD_IS_OBJECT(not-an-object) found")
if info is not None:
if info.is_about_object():
return
@@ -305,6 +312,12 @@
def optimize_GUARD_GC_TYPE(self, op):
info = self.getptrinfo(op.getarg(0))
+ if info and info.is_constant():
+ c = self.get_box_replacement(op.getarg(0))
+ tid = self.optimizer.cpu.get_actual_typeid(c.getref_base())
+ if tid != op.getarg(1).getint():
+ raise InvalidLoop("wrong GC type ID found on a constant")
+ return
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!")
@@ -327,6 +340,12 @@
def optimize_GUARD_SUBCLASS(self, op):
info = self.getptrinfo(op.getarg(0))
+ if info and info.is_constant():
+ c = self.get_box_replacement(op.getarg(0))
+ vtable = self.optimizer.cpu.ts.cls_of_box(c).getint()
+ if self._check_subclass(vtable, op.getarg(1).getint()):
+ return
+ raise InvalidLoop("GUARD_SUBCLASS(const) proven to always fail")
if info is not None and info.is_about_object():
known_class = info.get_known_class(self.optimizer.cpu)
if known_class:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5933,5 +5933,21 @@
"""
self.optimize_loop(ops, ops)
+ def test_random_strange_guards_on_consts(self):
+ ops = """
+ [p0]
+ guard_value(p0, ConstPtr(nodeaddr)) []
+ guard_is_object(p0) []
+ guard_subclass(p0, ConstClass(node_vtable)) []
+ guard_gc_type(p0, ConstInt(node_tid)) []
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ guard_value(p0, ConstPtr(nodeaddr)) []
+ jump(ConstPtr(nodeaddr))
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -140,6 +140,7 @@
nullptr = lltype.nullptr(llmemory.GCREF.TO)
#nodebox2 = InputArgRef(lltype.cast_opaque_ptr(llmemory.GCREF, node2))
nodesize = cpu.sizeof(NODE, node_vtable)
+ node_tid = nodesize.get_type_id()
nodesize2 = cpu.sizeof(NODE2, node_vtable2)
nodesize3 = cpu.sizeof(NODE3, node_vtable3)
valuedescr = cpu.fielddescrof(NODE, 'value')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit