Author: Armin Rigo <[email protected]>
Branch: stackroot-speedup
Changeset: r51934:81fa07721a43
Date: 2012-01-28 20:43 +0100
http://bitbucket.org/pypy/pypy/changeset/81fa07721a43/

Log:    (fijal, arigo) Performance tweak, maybe

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -2,7 +2,7 @@
 from pypy.rlib import rgc
 from pypy.rlib.objectmodel import we_are_translated, specialize
 from pypy.rlib.debug import fatalerror
-from pypy.rlib.rarithmetic import ovfcheck
+from pypy.rlib.rarithmetic import ovfcheck, r_uint
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rclass, rstr
 from pypy.rpython.lltypesystem import llgroup
 from pypy.rpython.lltypesystem.lloperation import llop
@@ -396,6 +396,7 @@
     is_shadow_stack = True
     MARKER_FRAME        = 8     # this marker now *follows* the frame addr
     MARKER_FRAME_TRACED = 32
+    MARKER_MAX          = 32
 
     # The "shadowstack" is a portable way in which the GC finds the
     # roots that live in the stack.  Normally it is just a list of
@@ -460,20 +461,25 @@
                             value = llmemory.cast_adr_to_int(prev.address[0])
                             # this logic is directly copied from RootIterator
                             # in shadowstack.py, consult comments there
-                            if value == shadowstack.MARKER_TRACED:
-                                if is_minor:
-                                    return llmemory.NULL
-                                continue
-                            if value == shadowstack.MARKER_NOT_TRACED:
-                                prev.address[0] = rffi.cast(llmemory.Address,
-                                                    shadowstack.MARKER_TRACED)
-                                continue
-                            if value == self.MARKER_FRAME_TRACED:
-                                break
-                            if value == self.MARKER_FRAME:
-                                prev.address[0] = rffi.cast(llmemory.Address,
-                                                    self.MARKER_FRAME_TRACED)
-                                break
+                            if r_uint(value) <= r_uint(self.MARKER_MAX):
+                                if value == 0: #performance only: shortcut 
NULLs
+                                    continue
+                                if value == shadowstack.MARKER_TRACED:
+                                    if is_minor:
+                                        return llmemory.NULL
+                                    continue
+                                if value == shadowstack.MARKER_NOT_TRACED:
+                                    prev.address[0] = rffi.cast(
+                                        llmemory.Address,
+                                        shadowstack.MARKER_TRACED)
+                                    continue
+                                if value == self.MARKER_FRAME_TRACED:
+                                    break
+                                if value == self.MARKER_FRAME:
+                                    prev.address[0] = rffi.cast(
+                                        llmemory.Address,
+                                        self.MARKER_FRAME_TRACED)
+                                    break
                             if gc.points_to_valid_gc_object(prev):
                                 return prev
                         else:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to