Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78099:2e80beb1f2b4
Date: 2015-06-15 09:20 +0200
http://bitbucket.org/pypy/pypy/changeset/2e80beb1f2b4/

Log:    added test case to sum on llgraph

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
@@ -354,6 +354,20 @@
         assert result == sum(range(30))
         self.check_vectorized(1, 1)
 
+    def define_sum_multi():
+        return """
+        a = |30|
+        b = sum(a)
+        c = |60|
+        d = sum(c)
+        b + c
+        """
+
+    def test_sum_multi(self):
+        result = self.run("sum_multi")
+        assert result == sum(range(30)) + sum(range(0,60))
+        self.check_vectorized(1, 1)
+
     def define_sum_float_to_int16():
         return """
         a = |30|
diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -31,7 +31,11 @@
             try:
                 newbox = _cache[box]
             except KeyError:
-                newbox = _cache[box] = box.__class__()
+                if isinstance(box, BoxVectorAccum):
+                    newbox = _cache[box] = \
+                        box.__class__(box, box.scalar_var, box.operator)
+                else:
+                    newbox = _cache[box] = box.__class__()
             return newbox
         #
         self.inputargs = map(mapping, inputargs)
@@ -696,6 +700,17 @@
         assert len(vx) == len(vy)
         return [_vx == _vy for _vx,_vy in zip(vx,vy)]
 
+    def bh_vec_int_xor(self, vx, vy):
+        return [int(x) ^ int(y) for x,y in zip(vx,vy)]
+
+    def bh_vec_float_pack(self, vector, value, index, count):
+        if isinstance(value, list):
+            for i in range(count):
+                vector[index + i] = value[i]
+        else:
+            vector[index] = value
+        return vector
+
     def bh_vec_cast_float_to_singlefloat(self, vx):
         return vx
 
@@ -872,7 +887,7 @@
                     def prod(acc, x): return acc * x
                     value = reduce(prod, value, 1)
                 else:
-                    raise NotImplementedError
+                    raise NotImplementedError("accum operator in fail guard")
             values.append(value)
         if hasattr(descr, '_llgraph_bridge'):
             target = (descr._llgraph_bridge, -1)
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
@@ -484,10 +484,10 @@
         self.threshold = threshold
 
     def unpack_cost(self, index, op):
-        raise NotImplementedError
+        raise NotImplementedError("unpack cost")
 
     def savings_for_pack(self, pack, times):
-        raise NotImplementedError
+        raise NotImplementedError("savings for pack")
 
     def savings_for_unpacking(self, node, index):
         savings = 0
@@ -691,13 +691,15 @@
         return None, -1
 
     def accumulate_prepare(self, sched_data, renamer):
+        vec_reg_size = sched_data.vec_reg_size
         for pack in self.packs:
             if not pack.is_accumulating():
                 continue
             accum = pack.accum
             # create a new vector box for the parameters
             box = pack.input_type.new_vector_box()
-            op = ResOperation(rop.VEC_BOX, [ConstInt(0)], box)
+            size = vec_reg_size // pack.input_type.getsize()
+            op = ResOperation(rop.VEC_BOX, [ConstInt(size)], box)
             sched_data.invariant_oplist.append(op)
             result = box.clonebox()
             # clear the box to zero TODO might not be zero for every reduction?
diff --git a/rpython/jit/metainterp/test/test_vectorize.py 
b/rpython/jit/metainterp/test/test_vectorize.py
--- a/rpython/jit/metainterp/test/test_vectorize.py
+++ b/rpython/jit/metainterp/test/test_vectorize.py
@@ -153,6 +153,24 @@
         res = self.meta_interp(f, [30])
         assert res == f(30) == 128
 
+    def test_sum(self):
+        myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True)
+        myjitdriver2 = JitDriver(greens = [], reds = 'auto', vectorize=True)
+        T = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
+        def f(d):
+            va = lltype.malloc(T, d, flavor='raw', zero=True)
+            for j in range(d):
+                va[j] = float(j)
+            i = 0
+            accum = 0
+            while i < d:
+                myjitdriver.jit_merge_point()
+                accum += va[i]
+                i += 1
+            lltype.free(va, flavor='raw')
+            return accum
+        res = self.meta_interp(f, [60])
+        assert res == f(60) == sum(range(60))
 
 class VectorizeLLtypeTests(VectorizeTests):
     pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to