[pypy-commit] pypy vecopt: removed a bug where packtype was modified but not copied before that
plan_rich
noreply at buildbot.pypy.org
Tue May 19 16:59:44 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77390:0e3498ee6eb4
Date: 2015-05-19 10:11 +0200
http://bitbucket.org/pypy/pypy/changeset/0e3498ee6eb4/
Log: removed a bug where packtype was modified but not copied before that
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
@@ -528,6 +528,15 @@
w_rhs = IntObject(int(w_rhs.floatval))
assert isinstance(w_lhs, W_NDimArray)
w_res = w_lhs.descr_getitem(interp.space, w_rhs)
+ assert isinstance(w_rhs, IntObject)
+ if isinstance(w_res, boxes.W_Float64Box):
+ print "access", w_lhs, "[", w_rhs.intval, "] => ", float(w_res.value)
+ if isinstance(w_res, boxes.W_Float32Box):
+ print "access", w_lhs, "[", w_rhs.intval, "] => ", float(w_res.value)
+ if isinstance(w_res, boxes.W_Int64Box):
+ print "access", w_lhs, "[", w_rhs.intval, "] => ", float(int(w_res.value))
+ if isinstance(w_res, boxes.W_Int32Box):
+ print "access", w_lhs, "[", w_rhs.intval, "] => ", float(int(w_res.value))
else:
raise NotImplementedError
if (not isinstance(w_res, W_NDimArray) and
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
@@ -154,7 +154,8 @@
return """
a = astype(|30|, int)
b = a + 1i
- c = a + 2.0
+ d = astype(|30|, int)
+ c = d + 2.0
x1 = b -> 7
x2 = b -> 8
x3 = c -> 11
@@ -164,7 +165,7 @@
def test_int_add_const(self):
result = self.run("int_add_const")
assert int(result) == 7+1+8+1+11+2+12+2
- self.check_vectorized(1, 1)
+ self.check_vectorized(2, 2)
def define_int32_add_const():
return """
@@ -172,7 +173,9 @@
b = a + 1i
x1 = b -> 7
x2 = b -> 8
- x1 + x2
+ x3 = b -> 9
+ x4 = b -> 10
+ x1 + x2 + x3 + x4
"""
#return """
#a = astype(|30|, int32)
@@ -186,9 +189,27 @@
#"""
def test_int32_add_const(self):
result = self.run("int32_add_const")
- assert int(result) == 7+1+8+1
+ assert int(result) == 7+1+8+1+9+1+10+1
self.check_vectorized(1, 1)
+ def define_int32_copy():
+ return """
+ a = astype(|30|, float32)
+ x1 = a -> 7
+ x2 = a -> 8
+ x3 = a -> 9
+ x4 = a -> 10
+ x5 = a -> 11
+ x6 = a -> 12
+ x7 = a -> 13
+ x8 = a -> 14
+ x9 = a -> 15
+ x1 + x2 + x3 + x4
+ """
+ def test_int32_copy(self):
+ result = self.run("int32_copy")
+ assert int(result) == 7+8+9+10
+ self.check_vectorized(1, 1)
def define_pow():
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
@@ -2564,10 +2564,10 @@
elif size == 8 and tosize == 4:
# is there a better sequence to move them?
scratch = X86_64_SCRATCH_REG.value
- print resloc, "[0] <- int32(", srcloc, "[0])"
+ #print resloc, "[0] <- int32(", srcloc, "[0])"
print resloc, "[1] <- int32(", srcloc, "[1])"
- self.mc.PEXTRQ_rxi(scratch, srcloc.value, 0)
- self.mc.PINSRD_xri(resloc.value, scratch, 0)
+ #self.mc.PEXTRQ_rxi(scratch, srcloc.value, 0)
+ #self.mc.PINSRD_xri(resloc.value, scratch, 0)
self.mc.PEXTRQ_rxi(scratch, srcloc.value, 1)
self.mc.PINSRD_xri(resloc.value, scratch, 1)
else:
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
@@ -1616,7 +1616,7 @@
pass
def consider_vec_cast_float_to_singlefloat(self, op):
- count = op.getarg(2)
+ count = op.getarg(1)
assert isinstance(count, ConstInt)
args = op.getarglist()
loc0 = self.make_sure_var_in_reg(op.getarg(0), args)
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
@@ -581,9 +581,10 @@
class OpToVectorOp(object):
- def __init__(self, arg_ptypes, result_ptype, index=-1, result_vsize_arg=-1):
+ def __init__(self, arg_ptypes, result_ptype, has_ptype=False, index=-1, result_vsize_arg=-1):
self.arg_ptypes = arg_ptypes
self.result_ptype = result_ptype
+ self.has_ptype = has_ptype
# TODO remove them?
self.result = result_ptype != None
self.result_vsize_arg = result_vsize_arg
@@ -620,10 +621,10 @@
rop.VEC_FLOAT_MUL: OpToVectorOp((PT_FLOAT_GENERIC,PT_FLOAT_GENERIC), PT_FLOAT_GENERIC),
rop.VEC_FLOAT_EQ: OpToVectorOp((PT_FLOAT_GENERIC,PT_FLOAT_GENERIC), PT_INT_GENERIC),
- rop.VEC_RAW_LOAD: OpToVectorOp((), PT_GENERIC),
- rop.VEC_GETARRAYITEM_RAW: OpToVectorOp((), PT_GENERIC),
- rop.VEC_RAW_STORE: OpToVectorOp((None,None,PT_INT_GENERIC,), None),
- rop.VEC_SETARRAYITEM_RAW: OpToVectorOp((None,None,PT_INT_GENERIC,), None),
+ rop.VEC_RAW_LOAD: OpToVectorOp((), PT_GENERIC, has_ptype=True),
+ rop.VEC_GETARRAYITEM_RAW: OpToVectorOp((), PT_GENERIC, has_ptype=True),
+ rop.VEC_RAW_STORE: OpToVectorOp((None,None,PT_GENERIC,), None, has_ptype=True),
+ rop.VEC_SETARRAYITEM_RAW: OpToVectorOp((None,None,PT_GENERIC,), None, has_ptype=True),
rop.VEC_CAST_FLOAT_TO_SINGLEFLOAT: OpToVectorOp((PT_DOUBLE,), PT_FLOAT),
# TODO remove index
@@ -656,9 +657,6 @@
# properties that hold for the pack are:
# + isomorphism (see func above)
# + tight packed (no room between vector elems)
- if pack.operations[0].op.vector == rop.VEC_RAW_LOAD:
- assert pack.ptype is not None
- print pack.ptype
if pack.ptype is None:
self.propagate_ptype()
@@ -694,6 +692,8 @@
for i,arg in enumerate(args):
arg_ptype = tovector.get_arg_ptype(i)
+ if arg_ptype and tovector.has_ptype:
+ arg_ptype = self.pack.ptype
if arg_ptype is not None:
if arg_ptype.size == -1:
arg_ptype = self.pack.ptype
@@ -708,8 +708,10 @@
tovector = ROP_ARG_RES_VECTOR.get(op0.vector, None)
if tovector is None:
raise NotImplementedError("vecop map entry missing. trans: pack -> vop")
+ if tovector.has_ptype:
+ assert False, "load/store must have ptypes attached from the descriptor"
args = op0.getarglist()[:]
- res_ptype = tovector.get_result_ptype()
+ res_ptype = tovector.get_result_ptype().clone()
for i,arg in enumerate(args):
if tovector.vector_arg(i):
_, vbox = self.box_to_vbox.get(arg, (-1, None))
@@ -722,9 +724,10 @@
def vector_result(self, vop, tovector):
ops = self.pack.operations
- result = vop.result
- ptype = tovector.get_result_ptype()
- if ptype is not None and ptype.gettype() != PackType.UNKNOWN_TYPE:
+ ptype = tovector.get_result_ptype().clone()
+ if tovector.has_ptype:
+ ptype = self.pack.ptype
+ if ptype is not None:
if ptype.size == -1:
ptype.size = self.pack.ptype.size
vbox = self.box_vector(ptype)
@@ -771,7 +774,6 @@
return vbox
def extend(self, vbox, arg_ptype):
- py.test.set_trace()
if vbox.item_count * vbox.item_size == self.vec_reg_size:
return vbox
size = arg_ptype.getsize()
@@ -802,7 +804,6 @@
opnum = rop.VEC_FLOAT_PACK
if tgt_box.item_type == INT:
opnum = rop.VEC_INT_PACK
- py.test.set_trace()
arg_count = len(args)
i = index
while i < arg_count and tgt_box.item_count < packable:
@@ -813,6 +814,8 @@
continue
new_box = tgt_box.clonebox()
new_box.item_count += src_box.item_count
+ if opnum == rop.VEC_FLOAT_PACK:
+ py.test.set_trace()
op = ResOperation(opnum, [tgt_box, src_box, ConstInt(i),
ConstInt(src_box.item_count)], new_box)
self.preamble_ops.append(op)
More information about the pypy-commit
mailing list