Author: Armin Rigo <ar...@tunes.org>
Branch: shadowstack-perf
Changeset: r46029:bbb57672167a
Date: 2011-07-27 21:20 +0200
http://bitbucket.org/pypy/pypy/changeset/bbb57672167a/

Log:    Tentative tweak. Will measure.

diff --git a/pypy/rpython/memory/gctransform/shadowstack.py 
b/pypy/rpython/memory/gctransform/shadowstack.py
--- a/pypy/rpython/memory/gctransform/shadowstack.py
+++ b/pypy/rpython/memory/gctransform/shadowstack.py
@@ -268,12 +268,17 @@
             topaddrs_v[block] = (firstuse, v_topaddr)
             return v_topaddr
         #
+        # Handling of v_topaddr: the idea is that a gc_push_roots should try
+        # to reuse the v_topaddr already loaded for the current block, but
+        # not a gc_pop_roots, because that would force it to be in one of the
+        # relatively few callee-saved registers.
         negnumcolors = 0
         c_type = rmodel.inputconst(lltype.Void, llmemory.Address)
         for block in graph.iterblocks():
             if block.operations == ():
                 continue
             llops = LowLevelOpList()
+            v_topaddr = None
             for op in block.operations:
                 if op.opname not in ("gc_push_roots", "gc_pop_roots"):
                     llops.append(op)
@@ -281,16 +286,19 @@
                 for v in op.args:
                     if isinstance(v, Constant):
                         continue
-                    v_topaddr = get_v_topaddr(block, firstuse=len(llops))
                     k = ~regalloc.getcolor(v)
                     negnumcolors = min(negnumcolors, k)
                     c_k = rmodel.inputconst(lltype.Signed, k)
                     if op.opname == "gc_push_roots":
+                        v_topaddr = (v_topaddr or
+                                     get_v_topaddr(block, firstuse=len(llops)))
                         blocks_push_roots.setdefault(block, len(llops))
                         if (block, op, v) not in useless_stores:
                             llops.genop("raw_store", [v_topaddr, c_type,
                                                       c_k, v])
                     else:
+                        v_topaddr = llops.genop("direct_call",
+                                                [gct.get_stack_top_ptr])
                         v_newaddr = llops.genop("raw_load",
                                                 [v_topaddr, c_type, c_k],
                                                 resulttype=llmemory.Address)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to