[pypy-commit] pypy ec-threadlocal: jit-transform threadlocalref_get
arigo
noreply at buildbot.pypy.org
Sun Jun 22 22:00:50 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: ec-threadlocal
Changeset: r72141:c7e0b0352700
Date: 2014-06-22 22:00 +0200
http://bitbucket.org/pypy/pypy/changeset/c7e0b0352700/
Log: jit-transform threadlocalref_get
diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -22,6 +22,7 @@
OS_STR2UNICODE = 2 # "str.str2unicode"
OS_SHRINK_ARRAY = 3 # rgc.ll_shrink_array
OS_DICT_LOOKUP = 4 # ll_dict_lookup
+ OS_THREADLOCALREF_GET = 5 # llop.threadlocalref_get
#
OS_STR_CONCAT = 22 # "stroruni.concat"
OS_STR_SLICE = 23 # "stroruni.slice"
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
@@ -1903,6 +1903,14 @@
None)
return [op0, op1]
+ def rewrite_op_threadlocalref_get(self, op):
+ opaqueid = op.args[0].value
+ op1 = self.prepare_builtin_call(op, 'threadlocalref_getter', [],
+ extra=(opaqueid,),
+ extrakey=opaqueid._obj)
+ return self.handle_residual_call(op1,
+ oopspecindex=EffectInfo.OS_THREADLOCALREF_GET)
+
# ____________________________________________________________
class NotSupported(Exception):
diff --git a/rpython/jit/codewriter/support.py b/rpython/jit/codewriter/support.py
--- a/rpython/jit/codewriter/support.py
+++ b/rpython/jit/codewriter/support.py
@@ -712,6 +712,11 @@
build_ll_1_raw_free_no_track_allocation = (
build_raw_free_builder(track_allocation=False))
+ def build_ll_0_threadlocalref_getter(opaqueid):
+ def _ll_0_threadlocalref_getter():
+ return llop.threadlocalref_get(rclass.OBJECTPTR, opaqueid)
+ return _ll_0_threadlocalref_getter
+
def _ll_1_weakref_create(obj):
return llop.weakref_create(llmemory.WeakRefPtr, obj)
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
@@ -147,6 +147,7 @@
EI.OS_UNIEQ_LENGTHOK: ([PUNICODE, PUNICODE], INT),
EI.OS_RAW_MALLOC_VARSIZE_CHAR: ([INT], ARRAYPTR),
EI.OS_RAW_FREE: ([ARRAYPTR], lltype.Void),
+ EI.OS_THREADLOCALREF_GET: ([], rclass.OBJECTPTR),
}
argtypes = argtypes[oopspecindex]
assert argtypes[0] == [v.concretetype for v in op.args[1:]]
@@ -157,6 +158,8 @@
assert extraeffect == EI.EF_CAN_RAISE
elif oopspecindex == EI.OS_RAW_FREE:
assert extraeffect == EI.EF_CANNOT_RAISE
+ elif oopspecindex == EI.OS_THREADLOCALREF_GET:
+ assert extraeffect == None
else:
assert extraeffect == EI.EF_ELIDABLE_CANNOT_RAISE
return 'calldescr-%d' % oopspecindex
@@ -1300,6 +1303,23 @@
assert op1.result is None
assert op2 is None
+def test_threadlocalref_get():
+ from rpython.rtyper.lltypesystem import rclass
+ from rpython.rlib.rthread import ThreadLocalReference
+ OS_THREADLOCALREF_GET = effectinfo.EffectInfo.OS_THREADLOCALREF_GET
+ class Foo: pass
+ t = ThreadLocalReference(Foo)
+ v2 = varoftype(rclass.OBJECTPTR)
+ c_opaqueid = const(t.opaque_id)
+ op = SpaceOperation('threadlocalref_get', [c_opaqueid], v2)
+ tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+ op0 = tr.rewrite_operation(op)
+ assert op0.opname == 'residual_call_r_r'
+ assert op0.args[0].value == 'threadlocalref_getter' # pseudo-function as str
+ assert op0.args[1] == ListOfKind("ref", [])
+ assert op0.args[2] == 'calldescr-%d' % OS_THREADLOCALREF_GET
+ assert op0.result == v2
+
def test_unknown_operation():
op = SpaceOperation('foobar', [], varoftype(lltype.Void))
tr = Transformer()
More information about the pypy-commit
mailing list