[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