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

Reply via email to