[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