[pypy-commit] pypy memop-simplify2: added tests for raw_load_i/f transformation to gc_load_i/f

plan_rich noreply at buildbot.pypy.org
Thu Nov 26 07:16:33 EST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: memop-simplify2
Changeset: r80971:14b59b151355
Date: 2015-11-26 13:17 +0100
http://bitbucket.org/pypy/pypy/changeset/14b59b151355/

Log:	added tests for raw_load_i/f transformation to gc_load_i/f

diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -117,6 +117,8 @@
         itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
         ptr_box, index_box = op.getarglist()
 
+        assert itemsize <= ofs
+
         offset = 0
         factor = 1
         # i * f + c
@@ -147,6 +149,16 @@
                          ConstInt(offset), ConstInt(itemsize)])
             self.replace_op_with(op, newload)
 
+    def handle_rawload(self, op):
+        itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
+        ptr_box, index_box = op.getarglist()
+
+        if sign:
+            itemsize = -itemsize
+        newload = ResOperation(OpHelpers.get_gc_load(op.type),
+                    [ptr_box, index_box, ConstInt(itemsize)])
+        self.replace_op_with(op, newload)
+
     def rewrite(self, operations):
         # we can only remember one malloc since the next malloc can possibly
         # collect; but we can try to collapse several known-size mallocs into
@@ -164,9 +176,13 @@
             if op is self._changed_op:
                 op = self._changed_op_to
             # ---------- GC_LOAD --------------
-            if op.is_getarrayitem(): # TODO
+            if op.is_getarrayitem() or op.getopnum() in (
+                rop.GETARRAYITEM_RAW_I,
+                rop.GETARRAYITEM_RAW_F):
                 self.handle_getarrayitem(op)
-                pass
+            if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F):
+                self.handle_rawload(op)
+            # TODO
             # ---------- GETFIELD_GC ----------
             if op.getopnum() in (rop.GETFIELD_GC_I, rop.GETFIELD_GC_F,
                                  rop.GETFIELD_GC_R):
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -1154,3 +1154,22 @@
             i3 = gc_load_{suffix}(p0,{index},{params})
             jump()
         """.format(**locals()))
+
+    @py.test.mark.parametrize('fromto', [
+        'raw_load_i(p0,i1,descr=adescr) -> gc_load_i(p0,i1,-8)',
+        'raw_load_f(p0,i1,descr=fdescr) -> gc_load_f(p0,i1,8)',
+        'raw_load_i(p0,i1,descr=sfdescr) -> gc_load_i(p0,i1,4)',
+    ])
+    def test_raw_load_rewrite(self, fromto):
+        for factor in [(1,), (1,2,4,8), (1,2,4), (1,4)]:
+            self.cpu.load_supported_factors = factor
+            f, t = fromto.split(' -> ')
+            self.check_rewrite("""
+                [p0,i1]
+                i2 = {f}
+                jump()
+            """.format(**locals()), """
+                [p0,i1]
+                i2 = {t}
+                jump()
+            """.format(**locals()))
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
@@ -1483,9 +1483,7 @@
 
     def _genop_gc_load(self, op, arglocs, resloc):
         base_loc, ofs_loc, size_loc, sign_loc = arglocs
-        assert isinstance(ofs, ImmedLoc)
         assert isinstance(size_loc, ImmedLoc)
-        scale = get_scale(size_loc.value)
         self.load_from_mem(resloc, ofs_loc, size_loc, sign_loc)
 
     genop_gc_load_i = _genop_gc_load
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1173,15 +1173,16 @@
     consider_raw_load_f = _consider_getarrayitem
 
     def _consider_gc_load(self, op):
-        ptr, index, size, sign = op.getarglist()
+        args = op.getarglist()
         base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
         ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
         result_loc = self.force_allocate_reg(op)
-        if sign.value:
+        size = op.getarg(2).value
+        size_loc = imm(abs(size))
+        if size < 0:
             sign_loc = imm1
         else:
             sign_loc = imm0
-        size_loc = imm(size.value)
         self.perform(op, [base_loc, ofs_loc, size_loc, sign_loc], result_loc)
 
     consider_gc_load_i = _consider_gc_load
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -401,6 +401,10 @@
                               rop.GETARRAYITEM_GC_PURE_F,
                               rop.GETARRAYITEM_GC_PURE_R)
 
+    def is_rawarrayitem(self):
+        return self.opnum in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F,
+                              rop.GETARRAYITEM_RAW_R, rop.GETARRAYITEM_GC_PURE_I,)
+
     def is_real_call(self):
         opnum = self.opnum
         return (opnum == rop.CALL_I or


More information about the pypy-commit mailing list