Author: Richard Plangger <[email protected]>
Branch: 
Changeset: r83735:99bd59dfb2dd
Date: 2016-04-18 10:50 +0200
http://bitbucket.org/pypy/pypy/changeset/99bd59dfb2dd/

Log:    (s390x) overwrote already defined variable, lead to wrong assignment

diff --git a/rpython/jit/backend/zarch/regalloc.py 
b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -310,34 +310,26 @@
             # uff! in this case, we need to move a forbidden var to another 
register
             assert len(forbidden_vars) <= 8 # otherwise it is NOT possible to 
complete
             even, odd = r.r2, r.r3
-            even_var = reverse_mapping.get(even, None)
-            odd_var = reverse_mapping.get(odd, None)
-            if even_var:
-                if even_var in forbidden_vars:
-                    self._relocate_forbidden_variable(even, even_var, 
reverse_mapping,
+            old_even_var = reverse_mapping.get(even, None)
+            old_odd_var = reverse_mapping.get(odd, None)
+            if old_even_var:
+                if old_even_var in forbidden_vars:
+                    self._relocate_forbidden_variable(even, old_even_var, 
reverse_mapping,
                                                       forbidden_vars, odd)
                 else:
-                    self._sync_var(even_var)
-            if odd_var:
-                if odd_var in forbidden_vars:
-                    self._relocate_forbidden_variable(odd, odd_var, 
reverse_mapping,
+                    self._sync_var(old_even_var)
+                    del self.reg_bindings[old_even_var]
+            if old_odd_var:
+                if old_odd_var in forbidden_vars:
+                    self._relocate_forbidden_variable(odd, old_odd_var, 
reverse_mapping,
                                                       forbidden_vars, even)
                 else:
-                    self._sync_var(odd_var)
+                    self._sync_var(old_odd_var)
+                    del self.reg_bindings[old_odd_var]
 
             self.free_regs = [fr for fr in self.free_regs \
                               if fr is not even and \
                                  fr is not odd]
-            if not even_var:
-                even_var = TempVar()
-                self.longevity[even_var] = (self.position, self.position)
-                self.temp_boxes.append(even_var)
-            if not odd_var:
-                odd_var = TempVar()
-                self.longevity[odd_var] = (self.position, self.position)
-                self.temp_boxes.append(odd_var)
-            assert even_var is not None
-            assert odd_var is not None
             self.reg_bindings[even_var] = even
             self.reg_bindings[odd_var] = odd
             return even, odd
@@ -345,6 +337,12 @@
         return even, odd
 
     def _relocate_forbidden_variable(self, reg, var, reverse_mapping, 
forbidden_vars, forbidden_reg):
+        if len(self.free_regs) > 0:
+            candidate = self.free_regs.pop()
+            self.assembler.regalloc_mov(reg, candidate)
+            self.reg_bindings[var] = candidate
+            reverse_mapping[candidate] = var
+
         for candidate in r.MANAGED_REGS:
             # move register of var to another register
             # thus it is not allowed to bei either reg or forbidden_reg
@@ -355,10 +353,11 @@
             if not candidate_var or candidate_var not in forbidden_vars:
                 if candidate_var is not None:
                     self._sync_var(candidate_var)
+                    del self.reg_bindings[candidate_var]
                 self.assembler.regalloc_mov(reg, candidate)
                 assert var is not None
                 self.reg_bindings[var] = candidate
-                reverse_mapping[reg] = var
+                reverse_mapping[candidate] = var
                 self.free_regs.append(reg)
                 break
         else:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to