Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit