Author: Armin Rigo <[email protected]>
Branch: ec-threadlocal
Changeset: r72144:4775e5fb74cb
Date: 2014-06-22 22:17 +0200
http://bitbucket.org/pypy/pypy/changeset/4775e5fb74cb/
Log: jtransform it as a EF_LOOPINVARIANT, for now.
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
@@ -390,11 +390,13 @@
lst.append(v)
def handle_residual_call(self, op, extraargs=[], may_call_jitcodes=False,
- oopspecindex=EffectInfo.OS_NONE):
+ oopspecindex=EffectInfo.OS_NONE,
+ extraeffect=None):
"""A direct_call turns into the operation 'residual_call_xxx' if it
is calling a function that we don't want to JIT. The initial args
of 'residual_call_xxx' are the function to call, and its calldescr."""
- calldescr = self.callcontrol.getcalldescr(op,
oopspecindex=oopspecindex)
+ calldescr = self.callcontrol.getcalldescr(op,
oopspecindex=oopspecindex,
+ extraeffect=extraeffect)
op1 = self.rewrite_call(op, 'residual_call',
[op.args[0]] + extraargs, calldescr=calldescr)
if may_call_jitcodes or self.callcontrol.calldescr_canraise(calldescr):
@@ -1909,7 +1911,8 @@
extra=(opaqueid,),
extrakey=opaqueid._obj)
return self.handle_residual_call(op1,
- oopspecindex=EffectInfo.OS_THREADLOCALREF_GET)
+ oopspecindex=EffectInfo.OS_THREADLOCALREF_GET,
+ extraeffect=EffectInfo.EF_LOOPINVARIANT)
# ____________________________________________________________
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
@@ -159,7 +159,7 @@
elif oopspecindex == EI.OS_RAW_FREE:
assert extraeffect == EI.EF_CANNOT_RAISE
elif oopspecindex == EI.OS_THREADLOCALREF_GET:
- assert extraeffect == None
+ assert extraeffect == EI.EF_LOOPINVARIANT
else:
assert extraeffect == EI.EF_ELIDABLE_CANNOT_RAISE
return 'calldescr-%d' % oopspecindex
diff --git a/rpython/rlib/rthread.py b/rpython/rlib/rthread.py
--- a/rpython/rlib/rthread.py
+++ b/rpython/rlib/rthread.py
@@ -275,7 +275,9 @@
# ____________________________________________________________
#
-# Thread-locals. Only for references that are not changed often.
+# Thread-locals. Only for references that change "not too often" --
+# for now, the JIT compiles get() as a loop-invariant, so basically
+# don't change them.
# KEEP THE REFERENCE ALIVE, THE GC DOES NOT FOLLOW THEM SO FAR!
# We use _make_sure_does_not_move() to make sure the pointer will not move.
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit