Author: Richard Plangger <planri...@gmail.com> Branch: memop-simplify2 Changeset: r80943:ddb6d7bd0eca Date: 2015-11-25 16:00 +0100 http://bitbucket.org/pypy/pypy/changeset/ddb6d7bd0eca/
Log: added basic transformation tests that check getarrayitem_gc_irf -> gc_load_irf diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py --- a/rpython/jit/backend/llsupport/llmodel.py +++ b/rpython/jit/backend/llsupport/llmodel.py @@ -35,7 +35,7 @@ # can an ISA instruction handle a constant offset? load_constant_offset = False # can an ISA instruction handle a factor to the offset? - load_supported_factors = [1] + load_supported_factors = (1,) vector_extension = False vector_register_size = 0 # in bytes 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 @@ -10,6 +10,7 @@ from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr,\ FLAG_POINTER from rpython.jit.metainterp.history import JitCellToken +from rpython.jit.backend.llsupport.descr import (unpack_arraydescr,) FLAG_ARRAY = 0 FLAG_STR = 1 @@ -114,7 +115,7 @@ def handle_getarrayitem(self, op): itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) - ptr_box, index_box = op.getargs() + ptr_box, index_box = op.getarglist() offset = 0 factor = 1 @@ -122,22 +123,25 @@ if itemsize in self.cpu.load_supported_factors: factor = itemsize else: - index_box = ResOperation(rop.INT_MUL, [index_box, Const(factor)]) + index_box = ResOperation(rop.INT_MUL, [index_box, ConstInt(itemsize)]) self.emit_op(index_box) # adjust the constant offset if self.cpu.load_constant_offset: - offset = ofs + offset = 0 else: - index_box = ResOperation(rop.INT_ADD, [index_box, Const(ofs)]) - self.emit_op(index_box) + offset = 0 + pass + # ofs is NOT the offset! + #index_box = ResOperation(rop.INT_ADD, [index_box, ConstInt(ofs)]) + #self.emit_op(index_box) if factor == 1 and offset == 0: newload = ResOperation(OpHelpers.get_gc_load(op.type), - [ptr_box, index_box, Const(itemsize), Const(sign)]) - self.replace_op_with(newload, op) + [ptr_box, index_box, ConstInt(itemsize), ConstInt(sign)]) + self.replace_op_with(op, newload) else: newload = ResOperation(OpHelpers.get_gc_load_scaled(op.type), - [ptr_box, index_box, Const(factor), Const(offset), Const(sign)]) - self.replace_op_with(newload, op) + [ptr_box, index_box, ConstInt(factor), ConstInt(itemsize), ConstInt(sign)]) + self.replace_op_with(op, newload) 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 @@ -1,3 +1,4 @@ +import py from rpython.jit.backend.llsupport.descr import get_size_descr,\ get_field_descr, get_array_descr, ArrayDescr, FieldDescr,\ SizeDescr, get_interiorfield_descr @@ -68,6 +69,11 @@ wbdescr = self.gc_ll_descr.write_barrier_descr WORD = globals()['WORD'] # + F = lltype.GcArray(lltype.Float) + fdescr = get_array_descr(self.gc_ll_descr, F) + SF = lltype.GcArray(lltype.SingleFloat) + sfdescr = get_array_descr(self.gc_ll_descr, SF) + # strdescr = self.gc_ll_descr.str_descr unicodedescr = self.gc_ll_descr.unicode_descr strlendescr = strdescr.lendescr @@ -124,6 +130,9 @@ class BaseFakeCPU(object): JITFRAME_FIXED_SIZE = 0 + load_constant_offset = False + load_supported_factors = (1,) + def __init__(self): self.tracker = FakeTracker() self._cache = {} @@ -1081,3 +1090,23 @@ guard_false(i2) [i5, i0] jump() """) + + @py.test.mark.parametrize('factors,suffix,ops,index,descr,off,factor', [ + [ (1,), 'i', ['i2 = int_mul(i1,8)'], 'i2', 'adescr', 8, 1 ], + [ (1,), 'f', ['i2 = int_mul(i1,8)'], 'i2', 'fdescr', 8, 0 ], + [ (1,), 'i', ['i2 = int_mul(i1,4)'], 'i2', 'sfdescr', 4, 0 ], + [ (1,), 'r', ['i2 = int_mul(i1,8)'], 'i2', 'cdescr', 8, 0 ], + ]) + def test_getarrayitem(self, factors, suffix, ops, index, descr, off, factor): + self.cpu.load_supported_factors = factors + ops = '\n'.join(ops) + self.check_rewrite(""" + [p0,i1] + i2 = getarrayitem_gc_{suffix}(p0,i1,descr={descr}) + jump() + """.format(**locals()), """ + [p0,i1] + {ops} + i3 = gc_load_{suffix}(p0,{index},{off},{factor}) + jump() + """.format(**locals())) diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py --- a/rpython/jit/backend/x86/runner.py +++ b/rpython/jit/backend/x86/runner.py @@ -27,7 +27,7 @@ # can an ISA instruction handle a constant offset? load_constant_offset = False # can an ISA instruction handle a factor to the offset? - load_supported_factors = [1] + load_supported_factors = (1,) from rpython.jit.backend.x86.arch import JITFRAME_FIXED_SIZE all_reg_indexes = gpr_reg_mgr_cls.all_reg_indexes 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 @@ -1099,8 +1099,8 @@ # '_ALWAYS_PURE_LAST', # ----- end of always_pure operations ----- - 'GC_LOAD/3/rfi', - 'GC_LOAD_INDEX/4/rfi', + 'GC_LOAD/4/rfi', + 'GC_LOAD_INDEX/5/rfi', '_RAW_LOAD_FIRST', 'GETARRAYITEM_GC/2d/rfi', @@ -1616,7 +1616,7 @@ return rop.GC_LOAD_R @staticmethod - def get_gc_load_scaled(tp): + def get_gc_load_caled(tp): if tp == 'i': return rop.GC_LOAD_SCALED_I elif tp == 'f': _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit