[pypy-commit] pypy vecopt2: updated vector to small test (simpler) and added new test for constant expansion

plan_rich noreply at buildbot.pypy.org
Tue May 5 09:46:27 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt2
Changeset: r77132:42697efbbfa7
Date: 2015-05-04 19:53 +0200
http://bitbucket.org/pypy/pypy/changeset/42697efbbfa7/

Log:	updated vector to small test (simpler) and added new test for
	constant expansion

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
@@ -118,12 +118,13 @@
         assert isinstance(op, GuardResOp)
         olddescr = tgt_op.getdescr()
         descr = compile.ResumeAtLoopHeaderDescr()
-        descr.rd_consts = olddescr.rd_consts 
-        descr.rd_pendingfields = olddescr.rd_pendingfields
-        descr.rd_virtuals = olddescr.rd_virtuals
-        descr.rd_numb = olddescr.rd_numb
-        descr.rd_count = olddescr.rd_count
-        descr.rd_frame_info_list = olddescr.rd_frame_info_list
+        if olddescr:
+            descr.rd_consts = olddescr.rd_consts 
+            descr.rd_pendingfields = olddescr.rd_pendingfields
+            descr.rd_virtuals = olddescr.rd_virtuals
+            descr.rd_numb = olddescr.rd_numb
+            descr.rd_count = olddescr.rd_count
+            descr.rd_frame_info_list = olddescr.rd_frame_info_list
         #
         tgt_op.setdescr(descr)
         tgt_op.rd_snapshot = op.rd_snapshot
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
@@ -1012,6 +1012,47 @@
         vopt = self.vectorize(self.parse_loop(ops),15)
         self.assert_equal(vopt.loop, self.parse_loop(opt))
 
+    def test_too_small_vector(self):
+        ops = """
+        [p0,i0]
+        guard_early_exit() [p0,i0]
+        i1 = getarrayitem_raw(p0, 0, descr=chararraydescr) # constant index
+        i2 = getarrayitem_raw(p0, 1, descr=chararraydescr) # constant index
+        i4 = int_add(i1, i2)
+        i3 = int_add(i0,1)
+        i5 = int_lt(i3, 10)
+        guard_true(i5) [p0, i0]
+        jump(p0,i1)
+        """
+        try:
+            self.vectorize(self.parse_loop(ops))
+            py.test.fail("loop is not vectorizable")
+        except NotAVectorizeableLoop:
+            pass
+
+    def test_constant_expansion(self):
+        ops = """
+        [p0,i0]
+        guard_early_exit() [p0,i0]
+        i1 = getarrayitem_raw(p0, i0, descr=floatarraydescr) # constant index
+        i4 = int_mul(i1, 2)
+        i3 = int_add(i0,1)
+        i5 = int_lt(i3, 10)
+        guard_true(i5) [p0, i0]
+        jump(p0,i3)
+        """
+        opt="""
+        [p0,i0]
+        i2 = int_add(i0, 4)
+        i3 = int_lt(i2, 10)
+        guard_true(i3) [p0,i0]
+        v1 = vec_getarrayitem_raw(p0, i0, 4, descr=floatarraydescr)
+        v2 = int_mul(v1, 2)
+        jump(p0,i2)
+        """
+        vopt = self.vectorize(self.parse_loop(ops),3)
+        self.assert_equal(vopt.loop, self.parse_loop(opt))
+
 
 class TestLLtype(BaseTestVectorize, LLtypeMixin):
     pass
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
@@ -97,37 +97,40 @@
         #if 4 < i:
         #    self.check_trace_count(1)
 
-    @py.test.mark.parametrize('i,k',[(9,3)])
-    def test_vector_register_too_small_vector(self, i, k):
+    @py.test.mark.parametrize('i',[1,2,3,4,9])
+    def test_vector_register_too_small_vector(self, i):
         myjitdriver = JitDriver(greens = [],
                                 reds = 'auto',
                                 vectorize=True)
         T = lltype.Array(rffi.SHORT, hints={'nolength': True})
-        def f(d,v):
+
+        def g(d, va, vb):
             i = 0
-            va = lltype.malloc(T, v, flavor='raw', zero=True)
-            vb = lltype.malloc(T, v, flavor='raw', zero=True)
-            for j in range(v):
+            while i < d:
+                myjitdriver.jit_merge_point()
+                a = va[i]
+                b = vb[i]
+                ec = intmask(a) + intmask(b)
+                va[i] = rffi.r_short(ec)
+                i += 1
+
+        def f(d):
+            i = 0
+            va = lltype.malloc(T, d+100, flavor='raw', zero=True)
+            vb = lltype.malloc(T, d+100, flavor='raw', zero=True)
+            for j in range(d+100):
                 va[j] = rffi.r_short(1)
                 vb[j] = rffi.r_short(2)
-            while i < d:
-                myjitdriver.jit_merge_point()
-                j = 0
-                while j < v:
-                    a = va[j]
-                    b = vb[j]
-                    ec = intmask(a) + intmask(b)
-                    va[j] = rffi.r_short(ec)
-                    j += 1
 
-                i += 1
-            res = intmask(va[v-1])
+            g(d+100, va, vb)
+            g(d, va, vb) # this iteration might not fit into the vector register
+
+            res = intmask(va[d])
             lltype.free(va, flavor='raw')
             lltype.free(vb, flavor='raw')
             return res
-        res = self.meta_interp(f, [i,k])
-        assert res == f(i,k)
-
+        res = self.meta_interp(f, [i])
+        assert res == f(i) == 3
 
 class VectorizeLLtypeTests(VectorizeTests):
     pass


More information about the pypy-commit mailing list