[pypy-commit] pypy vecopt: rpython translation issues, adding reshape operation to zjit tests
plan_rich
noreply at buildbot.pypy.org
Mon Jun 29 10:50:34 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78342:b785c8f713af
Date: 2015-06-29 10:49 +0200
http://bitbucket.org/pypy/pypy/changeset/b785c8f713af/
Log: rpython translation issues, adding reshape operation to zjit tests
diff --git a/pypy/module/micronumpy/compile.py b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -37,12 +37,20 @@
class BadToken(Exception):
pass
+class FakeArguments(W_Root):
+ def __init__(self, args_w, kw_w):
+ self.args_w = args_w
+ self.kw_w = kw_w
+
+ def unpack(self):
+ return self.args_w, self.kw_w
+
SINGLE_ARG_FUNCTIONS = ["sum", "prod", "max", "min", "all", "any",
"unegative", "flat", "tostring", "count_nonzero",
"argsort", "cumsum", "logical_xor_reduce"]
-TWO_ARG_FUNCTIONS = ["dot", 'take', 'searchsorted']
-TWO_ARG_FUNCTIONS_OR_NONE = ['view', 'astype']
+TWO_ARG_FUNCTIONS = ["dot", 'multiply', 'take', 'searchsorted']
+TWO_ARG_FUNCTIONS_OR_NONE = ['view', 'astype', 'reshape']
THREE_ARG_FUNCTIONS = ['where']
class W_TypeObject(W_Root):
@@ -779,6 +787,8 @@
raise ArgumentNotAnArray
if self.name == "dot":
w_res = arr.descr_dot(interp.space, arg)
+ if self.name == "multiply":
+ w_res = arr.descr_mul(interp.space, arg)
elif self.name == 'take':
w_res = arr.descr_take(interp.space, arg)
elif self.name == "searchsorted":
@@ -807,8 +817,12 @@
w_res = arr.descr_view(interp.space, arg)
elif self.name == 'astype':
w_res = arr.descr_astype(interp.space, arg)
+ elif self.name == 'reshape':
+ w_arg = self.args[1]
+ assert isinstance(w_arg, ArrayConstant)
+ w_res = arr.reshape(interp.space, w_arg.wrap(interp.space))
else:
- assert False
+ assert False, "missing two arg impl for: %s" % (self.name,)
else:
raise WrongFunctionName
if isinstance(w_res, W_NDimArray):
diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -118,6 +118,17 @@
retval = self.interp.eval_graph(self.graph, [i])
return retval
+ def define_matrix_dot():
+ return """
+ mat = |16|
+ m = reshape(mat, [4,4])
+ """
+
+ def test_matrix_dot(self):
+ result = self.run("matrix_dot")
+ assert int(result) == 45
+ self.check_vectorized(1, 1)
+
def define_float32_copy():
return """
a = astype(|30|, float32)
@@ -387,7 +398,7 @@
def test_sum_int(self):
result = self.run("sum_int")
assert result == sum(range(65))
- self.check_vectorized(2, 2) # 1 vecopt try+success for type conversion
+ self.check_vectorized(2, 2) # 1 sum, 1 for type conversion
def define_sum_multi():
return """
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
@@ -1670,12 +1670,13 @@
def genop_guard_guard_true(self, ign_1, guard_op, guard_token, locs, ign_2):
loc = locs[0]
- if loc.is_xmm:
- self._guard_vector_true(guard_op, loc)
- self.implement_guard(guard_token, 'NZ')
- else:
- self.mc.TEST(loc, loc)
- self.implement_guard(guard_token, 'Z')
+ if isinstance(loc, RegLoc):
+ if loc.is_xmm:
+ self._guard_vector_true(guard_op, loc)
+ self.implement_guard(guard_token, 'NZ')
+ return
+ self.mc.TEST(loc, loc)
+ self.implement_guard(guard_token, 'Z')
genop_guard_guard_nonnull = genop_guard_guard_true
def genop_guard_guard_no_exception(self, ign_1, guard_op, guard_token,
@@ -1770,12 +1771,13 @@
def genop_guard_guard_false(self, ign_1, guard_op, guard_token, locs, ign_2):
loc = locs[0]
- if loc.is_xmm:
- self._guard_vector_false(guard_op, loc)
- self.implement_guard(guard_token, 'NZ')
- else:
- self.mc.TEST(loc, loc)
- self.implement_guard(guard_token, 'NZ')
+ if isinstance(loc, RegLoc):
+ if loc.is_xmm:
+ self._guard_vector_false(guard_op, loc)
+ self.implement_guard(guard_token, 'NZ')
+ return
+ self.mc.TEST(loc, loc)
+ self.implement_guard(guard_token, 'NZ')
genop_guard_guard_isnull = genop_guard_guard_false
def genop_guard_guard_value(self, ign_1, guard_op, guard_token, locs, ign_2):
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
@@ -393,7 +393,6 @@
def _consider_guard_tf(self, op):
arg = op.getarg(0)
if arg.type == VECTOR:
- assert arg.item_type == INT
loc = self.xrm.make_sure_var_in_reg(arg)
else:
loc = self.rm.make_sure_var_in_reg(arg)
diff --git a/rpython/jit/backend/x86/regloc.py b/rpython/jit/backend/x86/regloc.py
--- a/rpython/jit/backend/x86/regloc.py
+++ b/rpython/jit/backend/x86/regloc.py
@@ -607,19 +607,18 @@
_rx86_getattr(self, methname)(val1, val2)
invoke._annspecialcase_ = 'specialize:arg(1)'
+ possible_instr_unrolled = unrolling_iterable([(1,'B_xx'),(2,'W_xx'),(4,'D_xx'),(8,'Q_xx')])
+
def INSN(self, size, loc1, loc2):
code1 = loc1.location_code()
code2 = loc2.location_code()
- val1 = getattr(loc1, "value_" + code1)()
- val2 = getattr(loc2, "value_" + code2)()
- suffix = 'B'
- if size == 2:
- suffix = 'W'
- elif size == 4:
- suffix = 'D'
- else:
- suffix = 'Q'
- invoke(self, suffix + "_"+ code1+code2, val1, val2)
+ assert code1 == code2 == 'x'
+ val1 = loc1.value_x()
+ val2 = loc2.value_x()
+ for s,suffix in possible_instr_unrolled:
+ if s == size:
+ invoke(self, suffix, val1, val2)
+ break
return INSN
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -113,13 +113,13 @@
def vectorbox_clone_set(box, count=-1, size=-1, type='-', clone_signed=True, signed=False):
if count == -1:
- count = box.item_count
+ count = box.getcount()
if size == -1:
- size = box.item_size
+ size = box.getsize()
if type == '-':
- type = box.item_type
+ type = box.gettype()
if clone_signed:
- signed = box.item_signed
+ signed = box.getsigned()
return BoxVector(type, count, size, signed)
def getpackopnum(type):
@@ -156,8 +156,8 @@
def of(box, count=-1):
assert isinstance(box, BoxVector)
if count == -1:
- count = box.item_count
- return PackType(box.item_type, box.item_size, box.item_signed, count)
+ count = box.getcount()
+ return PackType(box.gettype(), box.getsize(), box.getsigned(), count)
@staticmethod
def by_descr(descr, vec_reg_size):
@@ -295,6 +295,7 @@
vop = ResOperation(op.vector, args, result, op.getdescr())
if op.is_guard():
assert isinstance(op, GuardResOp)
+ assert isinstance(vop, GuardResOp)
vop.setfailargs(op.getfailargs())
vop.rd_snapshot = op.rd_snapshot
self.preamble_ops.append(vop)
@@ -307,7 +308,7 @@
#
# mark the position and the vbox in the hash
for i, node in enumerate(self.getoperations()):
- if i >= vbox.item_count:
+ if i >= vbox.getcount():
break
op = node.getoperation()
self.sched_data.setvector_of_box(op.result, i, vbox)
@@ -342,7 +343,7 @@
# use the input as an indicator for the pack type
packable = self.input_type.getcount()
- packed = vbox.item_count
+ packed = vbox.getcount()
assert packed >= 0
assert packable >= 0
if packed > packable:
@@ -394,7 +395,7 @@
def update_arg_in_vector_pos(self, argidx, box):
arguments = [op.getoperation().getarg(argidx) for op in self.getoperations()]
for i,arg in enumerate(arguments):
- if i >= box.item_count:
+ if i >= box.getcount():
break
self.sched_data.setvector_of_box(arg, i, box)
@@ -418,7 +419,7 @@
raise NotImplementedError("cannot yet extend float")
def extend_int(self, vbox, newtype):
- vbox_cloned = newtype.new_vector_box(vbox.item_count)
+ vbox_cloned = newtype.new_vector_box(vbox.getcount())
self.sched_data._prevent_signext(newtype.getsize(), vbox.getsize())
newsize = newtype.getsize()
assert newsize > 0
@@ -430,11 +431,11 @@
return vbox_cloned
def unpack(self, vbox, index, count, arg_ptype):
- assert index < vbox.item_count
- assert index + count <= vbox.item_count
+ assert index < vbox.getcount()
+ assert index + count <= vbox.getcount()
assert count > 0
vbox_cloned = vectorbox_clone_set(vbox, count=count)
- opnum = getunpackopnum(vbox.item_type)
+ opnum = getunpackopnum(vbox.gettype())
op = ResOperation(opnum, [vbox, ConstInt(index), ConstInt(count)], vbox_cloned)
self.costmodel.record_vector_unpack(vbox, index, count)
self.preamble_ops.append(op)
@@ -447,9 +448,9 @@
new_box = [1,2,3,4,5,6,_,_] after the operation, tidx=4, scount=2
"""
assert sidx == 0 # restriction
- count = tgt.item_count + src.item_count
+ count = tgt.getcount() + src.getcount()
new_box = vectorbox_clone_set(tgt, count=count)
- opnum = getpackopnum(tgt.item_type)
+ opnum = getpackopnum(tgt.gettype())
op = ResOperation(opnum, [tgt, src, ConstInt(tidx), ConstInt(scount)], new_box)
self.preamble_ops.append(op)
self.costmodel.record_vector_pack(src, sidx, scount)
@@ -467,14 +468,14 @@
assert isinstance(arg0, BoxVector)
assert isinstance(index, ConstInt)
assert isinstance(count, ConstInt)
- assert arg0.item_size == result.item_size
+ assert arg0.getsize() == result.getsize()
if isinstance(arg1, BoxVector):
- assert arg1.item_size == result.item_size
+ assert arg1.getsize() == result.getsize()
else:
assert count.value == 1
- assert index.value < result.item_count
- assert index.value + count.value <= result.item_count
- assert result.item_count > arg0.item_count
+ assert index.value < result.getcount()
+ assert index.value + count.value <= result.getcount()
+ assert result.getcount() > arg0.getcount()
def expand(self, arg, argidx):
elem_count = self.input_type.getcount()
@@ -484,7 +485,7 @@
invariant_ops = self.sched_data.invariant_oplist
invariant_vars = self.sched_data.invariant_vector_vars
if isinstance(arg, BoxVector):
- box_type = arg.item_type
+ box_type = arg.gettype()
# note that heterogenous nodes are not yet tracked
already_expanded = expanded_map.get(arg, None)
@@ -830,7 +831,7 @@
return self.box_to_vbox.get(arg, (-1, None))
def setvector_of_box(self, box, off, vector):
- assert off < vector.item_count
+ assert off < vector.getcount()
self.box_to_vbox[box] = (off, vector)
def prepend_invariant_operations(self, oplist):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -1357,18 +1357,18 @@
def test_abc(self):
trace="""
- [p0, p9, i10, p7, i11, p2, p4, p5, p12, i13, i14, i15, i16, i17, i18]
- guard_early_exit(descr=<rpython.jit.metainterp.compile.ResumeAtLoopHeaderDescr object at 0x7f8a20c32090>) [p7, p5, p4, p2, p0, i10, i13, p9, p12, i11, i14]
- i19 = raw_load(i15, i14, descr=int16arraydescr)
- i21 = int_add(i14, 2)
- i22 = int_add(i19, i16)
- i24 = int_signext(i22, 2)
- raw_store(i17, i11, i24, descr=int16arraydescr)
- i26 = int_add(i10, 1)
- i28 = int_add(i11, 2)
- i29 = int_ge(i26, i18)
- guard_false(i29, descr=<rpython.jit.metainterp.compile.ResumeGuardFalseDescr object at 0x7f8a20c32990>) [p7, p5, p4, p2, p0, i21, i28, i26, None, i13, p9, p12, None, None]
- jump(p0, p9, i26, p7, i28, p2, p4, p5, p12, i13, i21, i15, i16, i17, i18)
+ # int32 sum
+ label(p0, p19, i18, i24, i14, i8, i25, descr=TargetToken(140320937897104))
+ guard_early_exit(descr=<Guard0x7f9f03ab6310>) [p0, p19, i18, i14, i24]
+ i27 = raw_load(i8, i24, descr=<ArrayS 4>)
+ guard_not_invalidated(descr=<Guard0x7f9f03af5050>) [p0, i27, p19, i18, i14, i24]
+ i28 = int_add(i14, i27)
+ i29 = int_signext(i28, 4)
+ i30 = int_add(i18, 1)
+ i31 = int_add(i24, 4)
+ i32 = int_ge(i30, i25)
+ guard_false(i32, descr=<Guard0x7f9f03ab17d0>) [p0, i29, i30, i31, p19, None, None, None]
+ jump(p0, p19, i30, i31, i29, i8, i25, descr=TargetToken(140320937897104))
"""
# schedule 885 -> ptype is non for raw_load?
opt = self.vectorize(self.parse_loop(trace))
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -509,7 +509,7 @@
renamer.start_renaming(arg, arg_cloned)
cj = ConstInt(j)
ci = ConstInt(1)
- opnum = getunpackopnum(vbox.item_type)
+ opnum = getunpackopnum(vbox.gettype())
unpack_op = ResOperation(opnum, [vbox, cj, ci], arg_cloned)
self.costmodel.record_vector_unpack(vbox, j, 1)
self.emit_operation(unpack_op)
@@ -833,7 +833,7 @@
box = result
result = BoxVectorAccum(box, accum.var, '+')
# pack the scalar value
- op = ResOperation(getpackopnum(box.item_type),
+ op = ResOperation(getpackopnum(box.gettype()),
[box, accum.var, ConstInt(0), ConstInt(1)], result)
sched_data.invariant_oplist.append(op)
# rename the variable with the box
More information about the pypy-commit
mailing list