Author: Richard Plangger <planri...@gmail.com>
Branch: s390x-backend
Changeset: r81885:7ac200cdeecd
Date: 2016-01-21 11:24 +0100
http://bitbucket.org/pypy/pypy/changeset/7ac200cdeecd/

Log:    it can happen that longevity does not contain an entry for an
        operation (e.g. int_mul_ovf and result is not used), then when
        trying to spill a variable op can be in reg_bindings, but is not in
        longevity -> KeyError, fixed this by ensuring that the pair
        allocation happens at the latest point in the regalloc step

diff --git a/rpython/jit/backend/zarch/helper/regalloc.py 
b/rpython/jit/backend/zarch/helper/regalloc.py
--- a/rpython/jit/backend/zarch/helper/regalloc.py
+++ b/rpython/jit/backend/zarch/helper/regalloc.py
@@ -51,11 +51,11 @@
     a1 = op.getarg(1)
     if a0.is_constant():
         a0, a1 = a1, a0
-    lr,lq = self.rm.ensure_even_odd_pair(a0, op, bind_first=False)
     if check_imm32(a1):
         l1 = imm(a1.getint())
     else:
         l1 = self.ensure_reg(a1)
+    lr,lq = self.rm.ensure_even_odd_pair(a0, op, bind_first=False)
     self.free_op_vars()
     return [lr, lq, l1]
 
@@ -63,15 +63,14 @@
     def f(self, op):
         a0 = op.getarg(0)
         a1 = op.getarg(1)
+        l1 = self.ensure_reg(a1)
         if isinstance(a0, Const):
             poolloc = self.ensure_reg(a0)
             lr,lq = self.rm.ensure_even_odd_pair(a0, op, bind_first=modulus, 
must_exist=False)
             self.assembler.mc.LG(lq, poolloc)
         else:
             lr,lq = self.rm.ensure_even_odd_pair(a0, op, bind_first=modulus)
-        l1 = self.ensure_reg(a1)
         self.free_op_vars()
-        self.rm._check_invariants()
         return [lr, lq, l1]
     return f
 
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
@@ -952,19 +952,19 @@
 
     def prepare_zero_array(self, op):
         itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
+        startindex_loc = self.ensure_reg_or_16bit_imm(op.getarg(1))
+        tempvar = TempInt()
+        self.rm.temp_boxes.append(tempvar)
+        ofs_loc = self.ensure_reg_or_16bit_imm(ConstInt(ofs))
+        pad_byte, _ = self.rm.ensure_even_odd_pair(tempvar, tempvar,
+                              bind_first=True, must_exist=False, 
move_regs=False)
         base_loc, length_loc = self.rm.ensure_even_odd_pair(op.getarg(0), op,
               bind_first=True, must_exist=False, load_loc_odd=False)
-        tempvar = TempInt()
-        self.rm.temp_boxes.append(tempvar)
-        pad_byte, _ = self.rm.ensure_even_odd_pair(tempvar, tempvar,
-                              bind_first=True, must_exist=False, 
move_regs=False)
-        startindex_loc = self.ensure_reg_or_16bit_imm(op.getarg(1))
 
         length_box = op.getarg(2)
         ll = self.rm.loc(length_box)
         if length_loc is not ll:
             self.assembler.regalloc_mov(ll, length_loc)
-        ofs_loc = self.ensure_reg_or_16bit_imm(ConstInt(ofs))
         return [base_loc, startindex_loc, length_loc, ofs_loc, imm(itemsize), 
pad_byte]
 
     def prepare_cond_call(self, op):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to