Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r90984:aeca854b1b83
Date: 2017-04-06 15:39 +0200
http://bitbucket.org/pypy/pypy/changeset/aeca854b1b83/

Log:    Allow propagating the known value of r11 a bit more often

diff --git a/rpython/jit/backend/llsupport/asmmemmgr.py 
b/rpython/jit/backend/llsupport/asmmemmgr.py
--- a/rpython/jit/backend/llsupport/asmmemmgr.py
+++ b/rpython/jit/backend/llsupport/asmmemmgr.py
@@ -250,7 +250,7 @@
         return self.rawstart
 
     def overwrite(self, index, char):
-        assert 0 <= index < self.get_relative_pos()
+        assert 0 <= index < self.get_relative_pos(break_basic_block=False)
         block = self._cursubblock
         index -= self._baserelpos
         while index < 0:
@@ -264,7 +264,8 @@
         self.overwrite(index + 2, chr((val >> 16) & 0xff))
         self.overwrite(index + 3, chr((val >> 24) & 0xff))
 
-    def get_relative_pos(self):
+    def get_relative_pos(self, break_basic_block=True):
+        # 'break_basic_block' is only used in x86
         return self._baserelpos + self._cursubindex
 
     def copy_to_raw_memory(self, addr):
@@ -288,7 +289,7 @@
         HEX = '0123456789ABCDEF'
         dump = []
         src = rffi.cast(rffi.CCHARP, addr)
-        end = self.get_relative_pos()
+        end = self.get_relative_pos(break_basic_block=False)
         if count != -1:
             end = offset + count
         for p in range(offset, end):
@@ -336,17 +337,20 @@
 
     def _become_a_plain_block_builder(self):
         # hack purely for speed of tests
-        self._data = []
-        self.writechar = self._data.append
-        self.overwrite = self._data.__setitem__
-        self.get_relative_pos = self._data.__len__
+        self._data = _data = []
+        self.writechar = _data.append
+        self.overwrite = _data.__setitem__
+        def get_relative_pos(break_basic_block=True):
+            return len(_data)
+        self.get_relative_pos = get_relative_pos
         def plain_copy_to_raw_memory(addr):
             dst = rffi.cast(rffi.CCHARP, addr)
-            for i, c in enumerate(self._data):
+            for i, c in enumerate(_data):
                 dst[i] = c
         self._copy_to_raw_memory = plain_copy_to_raw_memory
 
     def insert_gcroot_marker(self, mark):
         if self.gcroot_markers is None:
             self.gcroot_markers = []
-        self.gcroot_markers.append((self.get_relative_pos(), mark))
+        self.gcroot_markers.append(
+            (self.get_relative_pos(break_basic_block=False), mark))
diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -265,14 +265,16 @@
 
     def enter_portal_frame(self, op):
         if self.cpu.HAS_CODEMAP:
+            pos = self.mc.get_relative_pos(break_basic_block=False)
             self.codemap_builder.enter_portal_frame(op.getarg(0).getint(),
                                                     op.getarg(1).getint(),
-                                                    self.mc.get_relative_pos())
+                                                    pos)
 
     def leave_portal_frame(self, op):
         if self.cpu.HAS_CODEMAP:
+            pos = self.mc.get_relative_pos(break_basic_block=False)
             self.codemap_builder.leave_portal_frame(op.getarg(0).getint(),
-                                                    self.mc.get_relative_pos())
+                                                    pos)
 
     def call_assembler(self, op, argloc, vloc, result_loc, tmploc):
         """
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1713,6 +1713,8 @@
         pos = self.mc.get_relative_pos(break_basic_block=False)
         pos += 1   # after potential jmp
         guard_token.pos_jump_offset = pos
+        saved = self.mc.get_scratch_register_known_value()
+        guard_token.known_scratch_value = saved
         self.pending_guard_tokens.append(guard_token)
 
     def genop_guard_guard_exception(self, guard_op, guard_token, locs, resloc):
@@ -1908,6 +1910,8 @@
         """
         self.mc.force_frame_size(DEFAULT_FRAME_BYTES)
         startpos = self.mc.get_relative_pos()
+        self.mc.restore_scratch_register_known_value(
+                                         guardtok.known_scratch_value)
         #
         self._update_at_exit(guardtok.fail_locs, guardtok.failargs,
                              guardtok.faildescr, regalloc)
@@ -2069,6 +2073,8 @@
         self.guard_success_cc = rx86.cond_none
         pos = self.mc.get_relative_pos(break_basic_block=False)
         guard_token.pos_jump_offset = pos - 4
+        saved = self.mc.get_scratch_register_known_value()
+        guard_token.known_scratch_value = saved
         self.pending_guard_tokens.append(guard_token)
 
     def _genop_real_call(self, op, arglocs, resloc):
diff --git a/rpython/jit/backend/x86/regloc.py 
b/rpython/jit/backend/x86/regloc.py
--- a/rpython/jit/backend/x86/regloc.py
+++ b/rpython/jit/backend/x86/regloc.py
@@ -621,6 +621,12 @@
     def forget_scratch_register(self):
         self._scratch_register_value = 0
 
+    def get_scratch_register_known_value(self):
+        return self._scratch_register_value
+
+    def restore_scratch_register_known_value(self, saved_value):
+        self._scratch_register_value = saved_value
+
     def trap(self):
         self.INT3()
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to