[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