[pypy-commit] pypy arm-backend-2: as pointed out by David Edelsohn and Maciej, get rid of redundant calls to list

bivab noreply at buildbot.pypy.org
Sat Jan 14 17:19:27 CET 2012


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r51312:483ce484be66
Date: 2012-01-14 16:34 +0100
http://bitbucket.org/pypy/pypy/changeset/483ce484be66/

Log:	as pointed out by David Edelsohn and Maciej, get rid of redundant
	calls to list when accessing the list of inputargs of an operation.
	Also replace all calls to make_sure_var_in_reg with calls to
	_ensure_value_is_boxes which makes sure that all temporary boxes are
	also considered as forbidden.

diff --git a/pypy/jit/backend/arm/helper/regalloc.py b/pypy/jit/backend/arm/helper/regalloc.py
--- a/pypy/jit/backend/arm/helper/regalloc.py
+++ b/pypy/jit/backend/arm/helper/regalloc.py
@@ -33,9 +33,9 @@
         imm_a1 = check_imm_box(a1, imm_size, allow_zero=allow_zero)
         if not imm_a0 and imm_a1:
             l0 = self._ensure_value_is_boxed(a0)
-            l1 = self.make_sure_var_in_reg(a1, boxes)
+            l1 = self._ensure_value_is_boxed(a1, boxes)
         elif commutative and imm_a0 and not imm_a1:
-            l1 = self.make_sure_var_in_reg(a0, boxes)
+            l1 = self._ensure_value_is_boxed(a0, boxes)
             l0 = self._ensure_value_is_boxed(a1, boxes)
         else:
             l0 = self._ensure_value_is_boxed(a0, boxes)
@@ -90,8 +90,8 @@
         assert fcond is not None
         a0 = op.getarg(0)
         a1 = op.getarg(1)
-        arg1 = self.make_sure_var_in_reg(a0, selected_reg=r.r0)
-        arg2 = self.make_sure_var_in_reg(a1, selected_reg=r.r1)
+        arg1 = self.rm.make_sure_var_in_reg(a0, selected_reg=r.r0)
+        arg2 = self.rm.make_sure_var_in_reg(a1, selected_reg=r.r1)
         assert arg1 == r.r0
         assert arg2 == r.r1
         if isinstance(a0, Box) and self.stays_alive(a0):
@@ -113,7 +113,7 @@
 
         l0 = self._ensure_value_is_boxed(arg0, forbidden_vars=boxes)
         if imm_a1:
-            l1 = self.make_sure_var_in_reg(arg1, boxes)
+            l1 = self._ensure_value_is_boxed(arg1, boxes)
         else:
             l1 = self._ensure_value_is_boxed(arg1, forbidden_vars=boxes)
 
@@ -134,7 +134,7 @@
         assert fcond is not None
         a0 = op.getarg(0)
         assert isinstance(a0, Box)
-        reg = self.make_sure_var_in_reg(a0)
+        reg = self._ensure_value_is_boxed(a0)
         self.possibly_free_vars_for_op(op)
         if guard_op is None:
             res = self.force_allocate_reg(op.result, [a0])
diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -892,7 +892,7 @@
         # need the box here
         if isinstance(args[4], Box):
             length_box = args[4]
-            length_loc = regalloc.make_sure_var_in_reg(args[4], forbidden_vars)
+            length_loc = regalloc._ensure_value_is_boxed(args[4], forbidden_vars)
         else:
             length_box = TempInt()
             length_loc = regalloc.force_allocate_reg(length_box,
diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py
--- a/pypy/jit/backend/arm/regalloc.py
+++ b/pypy/jit/backend/arm/regalloc.py
@@ -183,7 +183,7 @@
             self.assembler.load(loc, immvalue)
         else:
             loc = self.make_sure_var_in_reg(thing,
-                            forbidden_vars=forbidden_vars)
+                            forbidden_vars=self.temp_boxes + forbidden_vars)
         return loc
 
     def get_scratch_reg(self, type=INT, forbidden_vars=[], selected_reg=None):
@@ -285,12 +285,7 @@
 
     def make_sure_var_in_reg(self, var, forbidden_vars=[],
                          selected_reg=None, need_lower_byte=False):
-        if var.type == FLOAT:
-            return self.vfprm.make_sure_var_in_reg(var, forbidden_vars,
-                                         selected_reg, need_lower_byte)
-        else:
-            return self.rm.make_sure_var_in_reg(var, forbidden_vars,
-                                        selected_reg, need_lower_byte)
+        assert 0, 'should not be called directly'
 
     def convert_to_imm(self, value):
         if isinstance(value, ConstInt):
@@ -312,7 +307,7 @@
     def prepare_loop(self, inputargs, operations):
         self._prepare(inputargs, operations)
         self._set_initial_bindings(inputargs)
-        self.possibly_free_vars(list(inputargs))
+        self.possibly_free_vars(inputargs)
 
     def prepare_bridge(self, inputargs, arglocs, ops):
         self._prepare(inputargs, ops)
@@ -410,18 +405,18 @@
             self.rm._sync_var(v)
 
     def _prepare_op_int_add(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         a0, a1 = boxes
         imm_a0 = check_imm_box(a0)
         imm_a1 = check_imm_box(a1)
         if not imm_a0 and imm_a1:
-            l0 = self._ensure_value_is_boxed(a0)
-            l1 = self.make_sure_var_in_reg(a1, boxes)
+            l0 = self._ensure_value_is_boxed(a0, boxes)
+            l1 = self._ensure_value_is_boxed(a1, boxes)
         elif imm_a0 and not imm_a1:
-            l0 = self.make_sure_var_in_reg(a0)
+            l0 = self._ensure_value_is_boxed(a0, boxes)
             l1 = self._ensure_value_is_boxed(a1, boxes)
         else:
-            l0 = self._ensure_value_is_boxed(a0)
+            l0 = self._ensure_value_is_boxed(a0, boxes)
             l1 = self._ensure_value_is_boxed(a1, boxes)
         return [l0, l1]
 
@@ -438,9 +433,9 @@
         imm_a1 = check_imm_box(a1)
         if not imm_a0 and imm_a1:
             l0 = self._ensure_value_is_boxed(a0, boxes)
-            l1 = self.make_sure_var_in_reg(a1, boxes)
+            l1 = self._ensure_value_is_boxed(a1, boxes)
         elif imm_a0 and not imm_a1:
-            l0 = self.make_sure_var_in_reg(a0, boxes)
+            l0 = self._ensure_value_is_boxed(a0, boxes)
             l1 = self._ensure_value_is_boxed(a1, boxes)
         else:
             l0 = self._ensure_value_is_boxed(a0, boxes)
@@ -455,7 +450,7 @@
         return locs + [res]
 
     def prepare_op_int_mul(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         a0, a1 = boxes
 
         reg1 = self._ensure_value_is_boxed(a0, forbidden_vars=boxes)
@@ -597,14 +592,14 @@
     prepare_op_guard_isnull = prepare_op_guard_true
 
     def prepare_op_guard_value(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         a0, a1 = boxes
         imm_a1 = check_imm_box(a1)
         l0 = self._ensure_value_is_boxed(a0, boxes)
         if not imm_a1:
             l1 = self._ensure_value_is_boxed(a1, boxes)
         else:
-            l1 = self.make_sure_var_in_reg(a1, boxes)
+            l1 = self._ensure_value_is_boxed(a1, boxes)
         assert op.result is None
         arglocs = self._prepare_guard(op, [l0, l1])
         self.possibly_free_vars(op.getarglist())
@@ -620,7 +615,7 @@
     prepare_op_guard_not_invalidated = prepare_op_guard_no_overflow
 
     def prepare_op_guard_exception(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         arg0 = ConstInt(rffi.cast(lltype.Signed, op.getarg(0).getint()))
         loc = self._ensure_value_is_boxed(arg0)
         loc1 = self.get_scratch_reg(INT, boxes)
@@ -648,7 +643,7 @@
 
     def _prepare_guard_class(self, op, fcond):
         assert isinstance(op.getarg(0), Box)
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
 
         x = self._ensure_value_is_boxed(boxes[0], boxes)
         y = self.get_scratch_reg(REF, forbidden_vars=boxes)
@@ -727,7 +722,7 @@
         return []
 
     def prepare_op_setfield_gc(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         a0, a1 = boxes
         ofs, size, sign = unpack_fielddescr(op.getdescr())
         base_loc = self._ensure_value_is_boxed(a0, boxes)
@@ -806,23 +801,22 @@
         return [res, base_loc, imm(ofs)]
 
     def prepare_op_setarrayitem_gc(self, op, fcond):
-        a0, a1, a2 = list(op.getarglist())
         size, ofs, _ = unpack_arraydescr(op.getdescr())
         scale = get_scale(size)
         args = op.getarglist()
-        base_loc = self._ensure_value_is_boxed(a0, args)
-        ofs_loc = self._ensure_value_is_boxed(a1, args)
-        value_loc = self._ensure_value_is_boxed(a2, args)
+        base_loc = self._ensure_value_is_boxed(args[0], args)
+        ofs_loc = self._ensure_value_is_boxed(args[1], args)
+        value_loc = self._ensure_value_is_boxed(args[2], args)
         assert check_imm_arg(ofs)
         return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)]
     prepare_op_setarrayitem_raw = prepare_op_setarrayitem_gc
 
     def prepare_op_getarrayitem_gc(self, op, fcond):
-        a0, a1 = boxes = list(op.getarglist())
+        boxes = op.getarglist()
         size, ofs, _ = unpack_arraydescr(op.getdescr())
         scale = get_scale(size)
-        base_loc = self._ensure_value_is_boxed(a0, boxes)
-        ofs_loc = self._ensure_value_is_boxed(a1, boxes)
+        base_loc = self._ensure_value_is_boxed(boxes[0], boxes)
+        ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes)
         self.possibly_free_vars_for_op(op)
         self.free_temp_vars()
         res = self.force_allocate_reg(op.result)
@@ -852,13 +846,13 @@
         return [l0, l1, res]
 
     def prepare_op_strgetitem(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         base_loc = self._ensure_value_is_boxed(boxes[0])
 
         a1 = boxes[1]
         imm_a1 = check_imm_box(a1)
         if imm_a1:
-            ofs_loc = self.make_sure_var_in_reg(a1, boxes)
+            ofs_loc = self._ensure_value_is_boxed(a1, boxes)
         else:
             ofs_loc = self._ensure_value_is_boxed(a1, boxes)
 
@@ -872,7 +866,7 @@
         return [res, base_loc, ofs_loc, imm(basesize)]
 
     def prepare_op_strsetitem(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         base_loc = self._ensure_value_is_boxed(boxes[0], boxes)
         ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes)
         value_loc = self._ensure_value_is_boxed(boxes[2], boxes)
@@ -901,7 +895,7 @@
         return [l0, l1, res]
 
     def prepare_op_unicodegetitem(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         base_loc = self._ensure_value_is_boxed(boxes[0], boxes)
         ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes)
 
@@ -916,7 +910,7 @@
             imm(scale), imm(basesize), imm(itemsize)]
 
     def prepare_op_unicodesetitem(self, op, fcond):
-        boxes = list(op.getarglist())
+        boxes = op.getarglist()
         base_loc = self._ensure_value_is_boxed(boxes[0], boxes)
         ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes)
         value_loc = self._ensure_value_is_boxed(boxes[2], boxes)
@@ -930,7 +924,7 @@
         arg = op.getarg(0)
         imm_arg = check_imm_box(arg)
         if imm_arg:
-            argloc = self.make_sure_var_in_reg(arg)
+            argloc = self._ensure_value_is_boxed(arg)
         else:
             argloc = self._ensure_value_is_boxed(arg)
         self.possibly_free_vars_for_op(op)


More information about the pypy-commit mailing list