[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