[pypy-commit] pypy memop-simplify2: raw_store got the wrong scaling factor passed in rewrite

plan_rich noreply at buildbot.pypy.org
Fri Nov 27 07:30:20 EST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: memop-simplify2
Changeset: r80998:92f1f9606cd7
Date: 2015-11-27 13:28 +0100
http://bitbucket.org/pypy/pypy/changeset/92f1f9606cd7/

Log:	raw_store got the wrong scaling factor passed in rewrite

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
@@ -184,11 +184,19 @@
            op.getopnum() in (rop.GETARRAYITEM_RAW_I,
                              rop.GETARRAYITEM_RAW_F):
             self.handle_getarrayitem(op)
-        if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW,
-                             rop.RAW_STORE):
+        if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW):
             self.handle_setarrayitem(op)
+        if op.getopnum() == rop.RAW_STORE:
+            itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
+            ptr_box = op.getarg(0)
+            index_box = op.getarg(1)
+            value_box = op.getarg(2)
+            self.emit_gc_store_or_indexed(op, ptr_box, index_box, value_box, itemsize, 1, ofs)
         if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F):
-            self.handle_rawload(op)
+            itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
+            ptr_box = op.getarg(0)
+            index_box = op.getarg(1)
+            self.emit_gc_load_or_indexed(op, ptr_box, index_box, itemsize, 1, ofs, sign)
 
     def rewrite(self, operations):
         # we can only remember one malloc since the next malloc can possibly
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
@@ -1136,9 +1136,9 @@
         [True, None, 'i3 = raw_load_i(p0,i1,descr=adescr)->gc_load_indexed_i(p0,i1,1,8,-8)'],
         [True, None, 'i3 = raw_load_f(p0,i1,descr=fdescr)->gc_load_indexed_f(p0,i1,1,8,8)'],
         [True, None, 'i3 = raw_load_i(p0,i1,descr=sfdescr)->gc_load_indexed_i(p0,i1,1,8,4)'],
-        [True, (1,2,4,8), 'i3 = raw_store(p0,i1,i2,descr=raw_sfdescr)->gc_store_indexed(p0,i1,i2,4,8,4)'],
+        [True, (1,2,4,8), 'i3 = raw_store(p0,i1,i2,descr=raw_sfdescr)->gc_store_indexed(p0,i1,i2,1,8,4)'],
         [False, (1,), 'i3 = raw_store(p0,i1,i2,descr=raw_sfdescr)' '->'
-                      'i4 = int_mul(i1,4);i5 = int_add(i4,8);gc_store(p0,i5,i2,4)'],
+                      'i5 = int_add(i1,8);gc_store(p0,i5,i2,4)'],
     ])
     def test_gc_load_store_transform(self, support_offset, factors, fromto):
         self.cpu.load_constant_offset = support_offset
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
@@ -1484,7 +1484,7 @@
     def _genop_gc_load(self, op, arglocs, resloc):
         base_loc, ofs_loc, size_loc, sign_loc = arglocs
         assert isinstance(size_loc, ImmedLoc)
-        rc_addr = addr_add(base_loc, ofs_loc, 0, 0)
+        src_addr = addr_add(base_loc, ofs_loc, 0, 0)
         self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
 
     genop_gc_load_i = _genop_gc_load
@@ -1585,7 +1585,7 @@
     genop_discard_setinteriorfield_raw = genop_discard_setinteriorfield_gc
 
     def genop_discard_gc_store(self, op, arglocs):
-        base_loc, ofs_loc, size_loc = arglocs
+        base_loc, ofs_loc, value_loc, size_loc = arglocs
         assert isinstance(size_loc, ImmedLoc)
         scale = get_scale(size_loc.value)
         dest_addr = AddressLoc(base_loc, ofs_loc, 0, 0)
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
@@ -921,8 +921,8 @@
         args = op.getarglist()
         N = len(args)
         # we force all arguments in a reg (unless they are Consts),
-        # because it will be needed anyway by the following setfield_gc
-        # or setarrayitem_gc. It avoids loading it twice from the memory.
+        # because it will be needed anyway by the following gc_load
+        # It avoids loading it twice from the memory.
         arglocs = [self.rm.make_sure_var_in_reg(op.getarg(i), args)
                    for i in range(N)]
         self.perform_discard(op, arglocs)
@@ -1163,30 +1163,6 @@
         base_loc = self.loc(op.getarg(0))
         self.perform_discard(op, [base_loc])
 
-    def _consider_getarrayitem(self, op):
-        itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
-        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:
-            sign_loc = imm1
-        else:
-            sign_loc = imm0
-        self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs),
-                          sign_loc], result_loc)
-
-    consider_getarrayitem_gc_i = _consider_getarrayitem
-    consider_getarrayitem_gc_r = _consider_getarrayitem
-    consider_getarrayitem_gc_f = _consider_getarrayitem
-    consider_getarrayitem_raw_i = _consider_getarrayitem
-    consider_getarrayitem_raw_f = _consider_getarrayitem
-    consider_getarrayitem_gc_pure_i = _consider_getarrayitem
-    consider_getarrayitem_gc_pure_r = _consider_getarrayitem
-    consider_getarrayitem_gc_pure_f = _consider_getarrayitem
-    consider_raw_load_i = _consider_getarrayitem
-    consider_raw_load_f = _consider_getarrayitem
-
     def _consider_gc_load(self, op):
         args = op.getarglist()
         base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)


More information about the pypy-commit mailing list