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