[pypy-commit] pypy stmgc-c8: Fix unexpected becomes-inevitable from some math functions
arigo
noreply at buildbot.pypy.org
Wed Jun 24 14:22:56 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8
Changeset: r78293:fbdf4df6f63e
Date: 2015-06-24 14:22 +0200
http://bitbucket.org/pypy/pypy/changeset/fbdf4df6f63e/
Log: Fix unexpected becomes-inevitable from some math functions
diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,8 +1,3 @@
-------------------------------------------------------------
-
-ll_math_modf(), say, causes stm_become_inevitable()
-because of the raw array read "intpart_p[0]"
-
------------------------------------------------------------
fuse the two 32bit setfield_gc for stmflags & tid in the jit
diff --git a/rpython/rtyper/lltypesystem/module/ll_math.py b/rpython/rtyper/lltypesystem/module/ll_math.py
--- a/rpython/rtyper/lltypesystem/module/ll_math.py
+++ b/rpython/rtyper/lltypesystem/module/ll_math.py
@@ -58,8 +58,10 @@
[rffi.DOUBLE, rffi.DOUBLE], rffi.DOUBLE,
elidable_function=True)
math_atan2 = llexternal('atan2', [rffi.DOUBLE, rffi.DOUBLE], rffi.DOUBLE)
-math_frexp = llexternal('frexp', [rffi.DOUBLE, rffi.INTP], rffi.DOUBLE)
-math_modf = llexternal('modf', [rffi.DOUBLE, rffi.DOUBLEP], rffi.DOUBLE)
+math_frexp = llexternal('frexp', [rffi.DOUBLE, rffi.INTP_STM_NOTRACK],
+ rffi.DOUBLE)
+math_modf = llexternal('modf', [rffi.DOUBLE, rffi.DOUBLEP_STM_NOTRACK],
+ rffi.DOUBLE)
math_ldexp = llexternal('ldexp', [rffi.DOUBLE, rffi.INT], rffi.DOUBLE,
save_err=rffi.RFFI_FULL_ERRNO_ZERO)
math_pow = llexternal('pow', [rffi.DOUBLE, rffi.DOUBLE], rffi.DOUBLE,
@@ -188,7 +190,7 @@
mantissa = x
exponent = 0
else:
- exp_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
+ exp_p = lltype.malloc(rffi.INTP_STM_NOTRACK.TO, 1, flavor='raw')
try:
mantissa = math_frexp(x, exp_p)
exponent = rffi.cast(lltype.Signed, exp_p[0])
@@ -229,7 +231,7 @@
return (x, x)
else: # isinf(x)
return (math_copysign(0.0, x), x)
- intpart_p = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw')
+ intpart_p = lltype.malloc(rffi.DOUBLEP_STM_NOTRACK.TO, 1, flavor='raw')
try:
fracpart = math_modf(x, intpart_p)
intpart = intpart_p[0]
diff --git a/rpython/rtyper/lltypesystem/rffi.py b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -584,6 +584,9 @@
globals()[name.upper()] = tp
tpp = lltype.Ptr(lltype.Array(tp, hints={'nolength': True}))
globals()[name.upper()+'P'] = tpp
+ tppstm = lltype.Ptr(lltype.Array(tp, hints={'nolength': True,
+ 'stm_dont_track_raw_accesses': True}))
+ globals()[name.upper()+'P_STM_NOTRACK'] = tppstm
result.append(tp)
return result
@@ -772,16 +775,25 @@
# double *
DOUBLEP = lltype.Ptr(lltype.Array(DOUBLE, hints={'nolength': True}))
+DOUBLEP_STM_NOTRACK = lltype.Ptr(lltype.Array(DOUBLE, hints={'nolength': True,
+ 'stm_dont_track_raw_accesses': True}))
# float *
FLOATP = lltype.Ptr(lltype.Array(FLOAT, hints={'nolength': True}))
+FLOATP_STM_NOTRACK = lltype.Ptr(lltype.Array(FLOAT, hints={'nolength': True,
+ 'stm_dont_track_raw_accesses': True}))
# long double *
LONGDOUBLEP = lltype.Ptr(lltype.Array(LONGDOUBLE, hints={'nolength': True}))
+LONGDOUBLEP_STM_NOTRACK = lltype.Ptr(lltype.Array(LONGDOUBLE, hints={
+ 'nolength': True,
+ 'stm_dont_track_raw_accesses': True}))
# Signed, Signed *
SIGNED = lltype.Signed
SIGNEDP = lltype.Ptr(lltype.Array(SIGNED, hints={'nolength': True}))
+SIGNEDP_STM_NOTRACK = lltype.Ptr(lltype.Array(SIGNED, hints={'nolength': True,
+ 'stm_dont_track_raw_accesses': True}))
# various type mapping
More information about the pypy-commit
mailing list