Author: Carl Friedrich Bolz <[email protected]>
Branch: guard-compatible
Changeset: r85188:a48045cfa46a
Date: 2016-06-15 14:12 +0200
http://bitbucket.org/pypy/pypy/changeset/a48045cfa46a/
Log: seems there is still a case where a condition with a non-constant is
made
diff --git a/rpython/jit/metainterp/compatible.py
b/rpython/jit/metainterp/compatible.py
--- a/rpython/jit/metainterp/compatible.py
+++ b/rpython/jit/metainterp/compatible.py
@@ -58,11 +58,14 @@
from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr
# replace further arguments by constants, if the optimizer knows them
# already
+ last_nonconst_index = -1
for i in range(2, op.numargs()):
arg = op.getarg(i)
constarg = optimizer.get_constant_box(arg)
if constarg is not None:
op.setarg(i, constarg)
+ else:
+ last_nonconst_index = i
copied_op = op.copy()
copied_op.setarg(1, self.known_valid)
if op.numargs() == 2:
@@ -70,7 +73,11 @@
arg2 = copied_op.getarg(2)
if arg2.is_constant():
# already a constant, can just use PureCallCondition
+ if last_nonconst_index != -1:
+ return None, None # a non-constant argument, can't optimize
return copied_op, PureCallCondition(op, optimizer)
+ if last_nonconst_index != 2:
+ return None, None
# really simple-minded pattern matching
# the order of things is like this:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
b/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_compatible.py
@@ -157,6 +157,34 @@
assert
descr._compatibility_conditions.known_valid.same_constant(ConstPtr(self.myptr))
assert len(descr._compatibility_conditions.conditions) == 2
+ def test_guard_compatible_call_pure_not_const(self):
+ call_pure_results = {
+ (ConstInt(123), ConstPtr(self.myptr), ConstInt(5), ConstInt(5)):
ConstInt(5),
+ (ConstInt(124), ConstPtr(self.myptr), ConstInt(5), ConstInt(5)):
ConstInt(7),
+ }
+ ops = """
+ [p1, i2]
+ pvirtual = new_with_vtable(descr=nodesize)
+ setfield_gc(pvirtual, 5, descr=valuedescr)
+ i1 = getfield_gc_i(pvirtual, descr=valuedescr)
+ guard_compatible(p1, ConstPtr(myptr)) []
+ i3 = call_pure_i(123, p1, i1, i2, descr=plaincalldescr)
+ escape_n(i3)
+ i5 = call_pure_i(124, p1, i1, i2, descr=plaincalldescr)
+ escape_n(i5)
+ jump(ConstPtr(myptr), 5)
+ """
+ expected = """
+ [p1, i2]
+ guard_compatible(p1, ConstPtr(myptr)) []
+ i3 = call_i(123, p1, 5, i2, descr=plaincalldescr)
+ escape_n(i3)
+ i5 = call_i(124, p1, 5, i2, descr=plaincalldescr)
+ escape_n(i5)
+ jump(ConstPtr(myptr), 5)
+ """
+ self.optimize_loop(ops, expected, call_pure_results=call_pure_results)
+
def test_deduplicate_conditions(self):
call_pure_results = {
(ConstInt(123), ConstPtr(self.myptr)): ConstInt(5),
@@ -222,3 +250,31 @@
assert descr._compatibility_conditions is not None
assert
descr._compatibility_conditions.known_valid.same_constant(ConstPtr(self.quasiptr))
assert len(descr._compatibility_conditions.conditions) == 1
+
+ def test_quasiimmut_nonconst(self):
+ ops = """
+ [p1, i5]
+ guard_compatible(p1, ConstPtr(quasiptr)) []
+ quasiimmut_field(p1, descr=quasiimmutdescr)
+ guard_not_invalidated() []
+ i0 = getfield_gc_i(p1, descr=quasifielddescr)
+ i1 = call_pure_i(123, p1, i0, i5, descr=nonwritedescr)
+ i4 = call_pure_i(123, p1, i0, i5, descr=nonwritedescr)
+ escape_n(i1)
+ escape_n(i4)
+ jump(p1, i5)
+ """
+ expected = """
+ [p1, i5]
+ guard_compatible(p1, ConstPtr(quasiptr)) []
+ guard_not_invalidated() []
+ i0 = getfield_gc_i(p1, descr=quasifielddescr) # will be removed by the
backend
+ i1 = call_i(123, p1, i0, i5, descr=nonwritedescr)
+ escape_n(i1)
+ escape_n(i1)
+ jump(p1, i5)
+ """
+ call_pure_results = {
+ (ConstInt(123), ConstPtr(self.quasiptr), ConstInt(-4247)):
ConstInt(5),
+ }
+ self.optimize_loop(ops, expected, call_pure_results)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit