Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: Changeset: r95981:9d4fe930924e Date: 2019-02-12 20:11 +0100 http://bitbucket.org/pypy/pypy/changeset/9d4fe930924e/
Log: merge promote-unicode mostly for completeness sake: support for rlib.jit.promote_unicode, which behaves like promote_string, but for rpython unicode objects. diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -28,3 +28,8 @@ .. branch: regalloc-playground Improve register allocation in the JIT. + + +.. branch: promote-unicode + +Implement rlib.jit.promote_unicode to complement promote_string diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -596,6 +596,23 @@ op1 = SpaceOperation('str_guard_value', [op.args[0], c, descr], op.result) return [SpaceOperation('-live-', [], None), op1, None] + if (hints.get('promote_unicode') and + op.args[0].concretetype is not lltype.Void): + U = lltype.Ptr(rstr.UNICODE) + assert op.args[0].concretetype == U + self._register_extra_helper(EffectInfo.OS_UNIEQ_NONNULL, + "str.eq_nonnull", + [U, U], + lltype.Signed, + EffectInfo.EF_ELIDABLE_CANNOT_RAISE) + descr, p = self.callcontrol.callinfocollection.callinfo_for_oopspec( + EffectInfo.OS_UNIEQ_NONNULL) + # XXX this is fairly ugly way of creating a constant, + # however, callinfocollection has no better interface + c = Constant(p.adr.ptr, lltype.typeOf(p.adr.ptr)) + op1 = SpaceOperation('str_guard_value', [op.args[0], c, descr], + op.result) + return [SpaceOperation('-live-', [], None), op1, None] if hints.get('force_virtualizable'): return SpaceOperation('hint_force_virtualizable', [op.args[0]], None) if hints.get('force_no_const'): # for tests only diff --git a/rpython/jit/codewriter/test/test_jtransform.py b/rpython/jit/codewriter/test/test_jtransform.py --- a/rpython/jit/codewriter/test/test_jtransform.py +++ b/rpython/jit/codewriter/test/test_jtransform.py @@ -94,7 +94,7 @@ return True return False def callinfo_for_oopspec(self, oopspecindex): - assert oopspecindex == effectinfo.EffectInfo.OS_STREQ_NONNULL + # assert oopspecindex == effectinfo.EffectInfo.OS_STREQ_NONNULL class c: class adr: ptr = 1 @@ -1129,6 +1129,21 @@ assert op1.result == v2 assert op0.opname == '-live-' +def test_unicode_promote(): + PUNICODE = lltype.Ptr(rstr.UNICODE) + v1 = varoftype(PUNICODE) + v2 = varoftype(PUNICODE) + op = SpaceOperation('hint', + [v1, Constant({'promote_unicode': True}, lltype.Void)], + v2) + tr = Transformer(FakeCPU(), FakeBuiltinCallControl()) + op0, op1, _ = tr.rewrite_operation(op) + assert op1.opname == 'str_guard_value' + assert op1.args[0] == v1 + assert op1.args[2] == 'calldescr' + assert op1.result == v2 + assert op0.opname == '-live-' + def test_double_promote_str(): PSTR = lltype.Ptr(rstr.STR) v1 = varoftype(PSTR) diff --git a/rpython/jit/metainterp/test/test_string.py b/rpython/jit/metainterp/test/test_string.py --- a/rpython/jit/metainterp/test/test_string.py +++ b/rpython/jit/metainterp/test/test_string.py @@ -3,7 +3,7 @@ from rpython.jit.metainterp.test.support import LLJitMixin from rpython.rlib.debug import debug_print from rpython.rlib.jit import (JitDriver, dont_look_inside, we_are_jitted, - promote_string) + promote_string, promote_unicode) from rpython.rlib.rstring import StringBuilder, UnicodeBuilder @@ -518,6 +518,19 @@ self.meta_interp(f, [0]) self.check_resops(call_r=2, call_i=5) + def test_promote_unicode(self): + driver = JitDriver(greens = [], reds = ['n']) + + def f(n): + while n < 21: + driver.jit_merge_point(n=n) + promote_unicode(unicode(str(n % 3))) + n += 1 + return 0 + + self.meta_interp(f, [0]) + self.check_resops(call_r=4, call_i=5) + def test_join_chars(self): jitdriver = JitDriver(reds=['a', 'b', 'c', 'i'], greens=[]) _str = self._str diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py --- a/rpython/rlib/jit.py +++ b/rpython/rlib/jit.py @@ -84,6 +84,7 @@ * promote - promote the argument from a variable into a constant * promote_string - same, but promote string by *value* + * promote_unicode - same, but promote unicode string by *value* * access_directly - directly access a virtualizable, as a structure and don't treat it as a virtualizable * fresh_virtualizable - means that virtualizable was just allocated. @@ -126,6 +127,9 @@ def promote_string(x): return hint(x, promote_string=True) +def promote_unicode(x): + return hint(x, promote_unicode=True) + def dont_look_inside(func): """ Make sure the JIT does not trace inside decorated function (it becomes a call instead) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit