Author: Armin Rigo <ar...@tunes.org>
Branch: conditional_call_value_3
Changeset: r87018:cdb2025d2457
Date: 2016-09-12 10:07 +0200
http://bitbucket.org/pypy/pypy/changeset/cdb2025d2457/

Log:    Fixes, more cases

diff --git a/rpython/jit/codewriter/call.py b/rpython/jit/codewriter/call.py
--- a/rpython/jit/codewriter/call.py
+++ b/rpython/jit/codewriter/call.py
@@ -10,6 +10,7 @@
     EffectInfo, CallInfoCollection, CallShortcut)
 from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.rtyper.lltypesystem.lltype import getfunctionptr
+from rpython.flowspace.model import Constant, Variable
 from rpython.rlib import rposix
 from rpython.translator.backendopt.canraise import RaiseAnalyzer
 from rpython.translator.backendopt.writeanalyze import ReadWriteAnalyzer
@@ -391,6 +392,8 @@
         if op.opname != 'getfield':
             return
         [v_inst, c_fieldname] = op.args
+        if not isinstance(v_inst, Variable):
+            return
         v_result = op.result
         if v_result.concretetype != graph.getreturnvar().concretetype:
             return
@@ -405,12 +408,19 @@
         v_check = v_result
         fastcase = True
         for op in block.operations[1:]:
-            if ((op.opname == 'int_is_true' or op.opname == 'ptr_nonzero')
+            if (op.opname in ('int_is_true', 'ptr_nonzero')
                     and v_check is op.args[0]):
                 v_check = op.result
             elif op.opname == 'ptr_iszero' and v_check is op.args[0]:
                 v_check = op.result
                 fastcase = not fastcase
+            elif (op.opname in ('int_eq', 'int_ne')
+                    and v_check is op.args[0]
+                    and isinstance(op.args[1], Constant)
+                    and op.args[1].value == 0):
+                v_check = op.result
+                if op.opname == 'int_eq':
+                    fastcase = not fastcase
             else:
                 return
         if v_check.concretetype is not lltype.Bool:
diff --git a/rpython/jit/codewriter/test/test_call.py 
b/rpython/jit/codewriter/test/test_call.py
--- a/rpython/jit/codewriter/test/test_call.py
+++ b/rpython/jit/codewriter/test/test_call.py
@@ -372,12 +372,14 @@
 def test_find_call_shortcut():
     class FakeCPU:
         def fielddescrof(self, TYPE, fieldname):
-            assert isinstance(TYPE, lltype.GcStruct)
-            if fieldname == 'inst_foobar':
-                return 'foobardescr'
-            if fieldname == 'inst_fooref':
-                return 'foorefdescr'
-            assert False, fieldname
+            if isinstance(TYPE, lltype.GcStruct):
+                if fieldname == 'inst_foobar':
+                    return 'foobardescr'
+                if fieldname == 'inst_fooref':
+                    return 'foorefdescr'
+            if TYPE == RAW and fieldname == 'x':
+                return 'xdescr'
+            assert False, (TYPE, fieldname)
     cc = CallControl(FakeCPU())
 
     class B(object):
@@ -408,11 +410,21 @@
             r = b.foobar = 123
         return r
 
+    def f4(raw):
+        r = raw.x
+        if r != 0:
+            return r
+        raw.x = 123
+        return 123
+    RAW = lltype.Struct('RAW', ('x', lltype.Signed))
+
     def f(a, c):
         b = B()
         f1(a, b, c)
         f2(a, c, a, b)
         f3(space, b)
+        r = lltype.malloc(RAW, flavor='raw')
+        f4(r)
 
     rtyper = support.annotate(f, [10, 20])
     f1_graph = rtyper.annotator.translator._graphof(f1)
@@ -421,6 +433,8 @@
     assert cc.find_call_shortcut(f2_graph) == CallShortcut(3, "foorefdescr")
     f3_graph = rtyper.annotator.translator._graphof(f3)
     assert cc.find_call_shortcut(f3_graph) == CallShortcut(0, "foobardescr")
+    f4_graph = rtyper.annotator.translator._graphof(f4)
+    assert cc.find_call_shortcut(f4_graph) == CallShortcut(0, "xdescr")
 
 def test_cant_find_call_shortcut():
     from rpython.jit.backend.llgraph.runner import LLGraphCPU
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to