Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit