Author: Maciej Fijalkowski <fij...@gmail.com> Branch: string-promote-2 Changeset: r47930:b2a87ed6e142 Date: 2011-10-09 22:23 +0200 http://bitbucket.org/pypy/pypy/changeset/b2a87ed6e142/
Log: codewriter support for promoting strings diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py --- a/pypy/jit/codewriter/jtransform.py +++ b/pypy/jit/codewriter/jtransform.py @@ -455,12 +455,20 @@ # the special return value None forces op.result to be considered # equal to op.args[0] return [op0, op1, None] - if (hints.get('string_promote') and + if (hints.get('promote_string') and op.args[0].concretetype is not lltype.Void): - assert op.args[0].concretetype == lltype.Ptr(rstr.STR) - op0 = SpaceOperation('-live-', [], None) - op1 = SpaceOperation('str_guard_value', [op.args[0]], op.result) - return [op0, op1, None] + S = lltype.Ptr(rstr.STR) + assert op.args[0].concretetype == S + self._register_extra_helper(EffectInfo.OS_STREQ_NONNULL, + "str.eq_nonnull", + [S, S], + lltype.Signed, + EffectInfo.EF_ELIDABLE_CANNOT_RAISE) + descr = self.callcontrol.callinfo_for_oopspec( + EffectInfo.OS_STREQ_NONNULL) + op1 = SpaceOperation('str_guard_value', [op.args[0], descr], + op.result) + return op1 else: log.WARNING('ignoring hint %r at %r' % (hints, self.graph)) @@ -1431,6 +1439,7 @@ func = heaptracker.adr2int( llmemory.cast_ptr_to_adr(c_func.value)) self.callcontrol.callinfocollection.add(oopspecindex, calldescr, func) + return calldescr def _handle_stroruni_call(self, op, oopspec_name, args): SoU = args[0].concretetype # Ptr(STR) or Ptr(UNICODE) diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py --- a/pypy/jit/codewriter/test/test_jtransform.py +++ b/pypy/jit/codewriter/test/test_jtransform.py @@ -119,6 +119,7 @@ EI.OS_STR2UNICODE:([PSTR], PUNICODE), EI.OS_STR_CONCAT: ([PSTR, PSTR], PSTR), EI.OS_STR_SLICE: ([PSTR, INT, INT], PSTR), + EI.OS_STREQ_NONNULL: ([PSTR, PSTR], INT), EI.OS_UNI_CONCAT: ([PUNICODE, PUNICODE], PUNICODE), EI.OS_UNI_SLICE: ([PUNICODE, INT, INT], PUNICODE), EI.OS_UNI_EQUAL: ([PUNICODE, PUNICODE], lltype.Bool), @@ -140,6 +141,9 @@ return 'calldescr-%d' % oopspecindex def calldescr_canraise(self, calldescr): return False + def callinfo_for_oopspec(self, oopspecindex): + assert oopspecindex == effectinfo.EffectInfo.OS_STREQ_NONNULL + return 'calldescr' def test_optimize_goto_if_not(): @@ -849,14 +853,13 @@ v1 = varoftype(PSTR) v2 = varoftype(PSTR) op = SpaceOperation('hint', - [v1, Constant({'string_promote': True}, lltype.Void)], + [v1, Constant({'promote_string': True}, lltype.Void)], v2) tr = Transformer(FakeCPU(), FakeBuiltinCallControl()) - op0, op1, _ = tr.rewrite_operation(op) - assert op0.opname == '-live-' - assert op1.opname == 'str_guard_value' - assert op1.args == [v1] - assert op1.result == v2 + op0 = tr.rewrite_operation(op) + assert op0.opname == 'str_guard_value' + assert op0.args == [v1, 'calldescr'] + assert op0.result == v2 def test_unicode_concat(): # test that the oopspec is present and correctly transformed _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit