[pypy-commit] pypy vecopt: removed primitive type mixin

plan_rich noreply at buildbot.pypy.org
Tue Jun 2 14:45:47 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77759:20d16b623806
Date: 2015-06-02 14:43 +0200
http://bitbucket.org/pypy/pypy/changeset/20d16b623806/

Log:	removed primitive type mixin added two schedule tests for
	constant/variable expansion, need to move the instructions before
	the label

diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -519,38 +519,7 @@
 
 # ____________________________________________________________
 
-class PrimitiveTypeMixin(object):
-    _mixin_ = True
-
-    def gettype(self):
-        raise NotImplementedError
-    def getsize(self):
-        raise NotImplementedError
-    def getsigned(self):
-        raise NotImplementedError
-
-    def matches_type(self, other):
-        assert isinstance(other, PrimitiveTypeMixin)
-        return self.gettype() == other.gettype()
-
-    def matches_size(self, other):
-        assert isinstance(other, PrimitiveTypeMixin)
-        return self.getsize() == other.getsize()
-
-    def matches_sign(self, other):
-        assert isinstance(other, PrimitiveTypeMixin)
-        return self.getsigend() == other.signed()
-
-    def matches(self, other):
-        if isinstance(other, PrimitiveTypeMixin):
-            return self.matches_type(other) and \
-                   self.matches_size(other) and \
-                   self.matches_sign(other)
-        return False
-
-
-
-class BoxVector(Box, PrimitiveTypeMixin):
+class BoxVector(Box):
     type = VECTOR
     _attrs_ = ('item_type','item_count','item_size','item_signed')
     _extended_display = False
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -602,7 +602,7 @@
             while i >= 0:
                 node = self.nodes[i]
                 op = node.getoperation()
-                if node.is_ovf():
+                if op.is_ovf():
                     break
                 i -= 1
             else:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
@@ -93,3 +93,34 @@
         v3[f64#2] = vec_cast_int_to_float(v2[i32#2])
         """, False)
         self.assert_equal(loop2, loop3)
+
+    def test_scalar_pack(self):
+        loop1 = self.parse("""
+        i10 = int_add(i0, 73)
+        i11 = int_add(i1, 73)
+        """)
+        pack1 = self.pack(loop1, 0, 2)
+        loop2 = self.schedule(loop1, [pack1])
+        loop3 = self.parse("""
+        v1[i64#2] = vec_box(2)
+        v2[i64#2] = vec_int_pack(v1[i64#2], i0, 0, 1)
+        v3[i64#2] = vec_int_pack(v2[i64#2], i1, 1, 1)
+        v4[i64#2] = vec_int_expand(73)
+        v5[i64#2] = vec_int_add(v3[i64#2], v4[i64#2])
+        """, False)
+        self.assert_equal(loop2, loop3)
+
+        loop1 = self.parse("""
+        f10 = float_add(f0, 73.0)
+        f11 = float_add(f1, 73.0)
+        """)
+        pack1 = self.pack(loop1, 0, 2)
+        loop2 = self.schedule(loop1, [pack1])
+        loop3 = self.parse("""
+        v1[f64#2] = vec_box(2)
+        v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1)
+        v3[f64#2] = vec_float_pack(v2[f64#2], f1, 1, 1)
+        v4[f64#2] = vec_float_expand(73.0)
+        v5[f64#2] = vec_float_add(v3[f64#2], v4[f64#2])
+        """, False)
+        self.assert_equal(loop2, loop3)
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
@@ -5,7 +5,7 @@
 from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll
 from rpython.jit.metainterp.compile import ResumeAtLoopHeaderDescr, invent_fail_descr_for_op
 from rpython.jit.metainterp.history import (ConstInt, VECTOR, FLOAT, INT,
-        BoxVector, TargetToken, JitCellToken, Box, PrimitiveTypeMixin)
+        BoxVector, BoxFloat, BoxInt, ConstFloat, TargetToken, JitCellToken, Box)
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, Optimization
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from rpython.jit.metainterp.optimizeopt.dependency import (DependencyGraph, 
@@ -593,7 +593,7 @@
             assert isinstance(key2, IndexVar)
             return key1.compare(key2)
         #
-        raise RuntimeError("cannot compare: " + str(key1) + " <=> " + str(key2))
+        raise AssertionError("cannot compare: " + str(key1) + " <=> " + str(key2))
 
     def emit_varops(self, opt, var, old_arg):
         if isinstance(var, IndexVar):
@@ -630,7 +630,7 @@
                 return op
             i -= 1
 
-        raise RuntimeError("guard_true/false first arg not defined")
+        raise AssertionError("guard_true/false first arg not defined")
 
     def _get_key(self, cmp_op):
         if cmp_op and rop.INT_LT <= cmp_op.getopnum() <= rop.INT_GE:
@@ -772,7 +772,7 @@
         return 1
 
 
-class PackType(PrimitiveTypeMixin):
+class PackType(object):
     UNKNOWN_TYPE = '-'
 
     def __init__(self, type, size, signed, count=-1, scalar_cost=1, vector_cost=1):
@@ -845,11 +845,18 @@
         return self.input_type.getsize()
 
     def determine_input_type(self, op):
+        arg = op.getarg(0)
         _, vbox = self.sched_data.getvector_of_box(op.getarg(0))
         if vbox:
             return PackType.of(vbox)
         else:
-            raise RuntimeError("fatal: box %s is not in a vector box" % (op.getarg(0),))
+            vec_reg_size = self.sched_data.vec_reg_size
+            if isinstance(arg, ConstInt) or isinstance(arg, BoxInt):
+                return PackType(INT, 8, True, 2)
+            elif isinstance(arg, ConstFloat) or isinstance(arg, BoxFloat):
+                return PackType(FLOAT, 8, True, 2)
+            else:
+                raise NotImplementedError("arg %s not supported" % (arg,))
 
     def determine_output_type(self, op):
         return self.determine_input_type(op)
@@ -1010,7 +1017,8 @@
             op = ResOperation(opnum, [tgt_box, src_box, ConstInt(i),
                                       ConstInt(src_box.item_count)], new_box)
             self.preamble_ops.append(op)
-            self._check_vec_pack(op)
+            if not we_are_translated():
+                self._check_vec_pack(op)
             i += src_box.item_count
 
             # overwrite the new positions, arguments now live in new_box
@@ -1041,10 +1049,11 @@
         assert index.value + count.value <= result.item_count
         assert result.item_count > arg0.item_count
 
-    def expand_box_to_vector_box(self, vbox, ops, arg, argidx):
+    def expand_box_to_vector_box(self, vbox, nodes, arg, argidx):
         all_same_box = True
-        for i, op in enumerate(ops):
-            if arg is not op.getoperation().getarg(argidx):
+        for i, node in enumerate(nodes):
+            op = node.getoperation()
+            if not arg.same_box(op.getarg(argidx)):
                 all_same_box = False
                 break
             i += 1
@@ -1060,16 +1069,17 @@
             expand_op = ResOperation(expand_opnum, [arg], vbox)
             self.preamble_ops.append(expand_op)
         else:
-            resop = ResOperation(rop.VEC_BOX, [ConstInt(len(ops))], vbox)
+            resop = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox)
             self.preamble_ops.append(resop)
             opnum = rop.VEC_FLOAT_PACK
             if arg.type == INT:
                 opnum = rop.VEC_INT_PACK
-            for i,op in enumerate(ops):
-                arg = op.getoperation().getarg(argidx)
+            for i,node in enumerate(nodes):
+                op = node.getoperation()
+                arg = op.getarg(argidx)
                 new_box = vbox.clonebox()
                 resop = ResOperation(opnum,
-                                     [vbox,arg,ConstInt(i),ConstInt(0)], new_box)
+                                     [vbox,arg,ConstInt(i),ConstInt(1)], new_box)
                 vbox = new_box
                 self.preamble_ops.append(resop)
         return vbox


More information about the pypy-commit mailing list