[pypy-commit] pypy vecopt2: introduced vec_getarrayitem_raw which was previously handled by vector raw load (was not correct)

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


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt2
Changeset: r77117:771fe82d7b07
Date: 2015-04-16 15:27 +0200
http://bitbucket.org/pypy/pypy/changeset/771fe82d7b07/

Log:	introduced vec_getarrayitem_raw which was previously handled by
	vector raw load (was not correct)

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
@@ -684,6 +684,12 @@
     def bh_vec_int_signext(self, vx, ext, count):
         return [heaptracker.int_signext(_vx, ext) for _vx in vx]
 
+    def bh_vec_getarrayitem_raw(self, struct, offset, count, descr):
+        values = []
+        for i in range(count):
+            val = self.bh_getarrayitem_raw(struct, offset + i, descr)
+            values.append(val)
+        return values
     def bh_vec_raw_load(self, struct, offset, count, descr):
         values = []
         stride = descr.get_item_size_in_bytes()
@@ -696,6 +702,9 @@
         stride = descr.get_item_size_in_bytes()
         for i in range(count):
             self.bh_raw_store(struct, offset + i*stride, newvalues[i], descr)
+    def bh_vec_setarrayitem_raw(self, struct, offset, newvalues, count, descr):
+        for i in range(count):
+            self.bh_setarrayitem_raw(struct, offset + i, newvalues[i], descr)
 
 
     def store_fail_descr(self, deadframe, descr):
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1477,13 +1477,14 @@
             assert kind == 'v'
         return lltype.nullptr(rclass.OBJECTPTR.TO)
 
-    def _prepare_resume_from_failure(self, opnum, deadframe):
+    def _prepare_resume_from_failure(self, opnum, deadframe, resumedescr):
         from rpython.jit.metainterp.resoperation import rop
         #
         if opnum == rop.GUARD_FUTURE_CONDITION:
             pass
         elif opnum == rop.GUARD_NO_EARLY_EXIT:
-            self.position = 0
+            self.position = resumedescr.rd_frame_info_list.pc
+            pass
         elif opnum == rop.GUARD_TRUE:
             # Produced directly by some goto_if_not_xxx() opcode that did not
             # jump, but which must now jump.  The pc is just after the opcode.
@@ -1656,7 +1657,7 @@
         all_virtuals)
 
     current_exc = blackholeinterp._prepare_resume_from_failure(
-        resumedescr.guard_opnum, deadframe)
+        resumedescr.guard_opnum, deadframe, resumedescr)
 
     _run_forever(blackholeinterp, current_exc)
 
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -338,12 +338,14 @@
                          rop.CALL_MALLOC_NURSERY_VARSIZE,
                          rop.CALL_MALLOC_NURSERY_VARSIZE_FRAME,
                          rop.LABEL,
+                         rop.VEC_RAW_LOAD,
+                         rop.VEC_RAW_STORE,
+                         rop.VEC_GETARRAYITEM_RAW,
+                         rop.VEC_SETARRAYITEM_RAW,
                          ):      # list of opcodes never executed by pyjitpl
                 continue
-            # XXX this is temporary! after the algorithm works adjust the
-            # black hole interpreter!
-            if rop._VEC_ARITHMETIC_FIRST <= value <= rop._VEC_ARITHMETIC_LAST or \
-               value == rop.VEC_RAW_LOAD or value == rop.VEC_RAW_STORE:
+             # trace will generate such an op
+            if rop._VEC_ARITHMETIC_FIRST <= value <= rop._VEC_ARITHMETIC_LAST:
                 continue
 
             raise AssertionError("missing %r" % (key,))
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
@@ -556,7 +556,7 @@
     def test_packset_init_simple(self):
         ops = """
         [p0,i0]
-        i3 = getarrayitem_gc(p0, i0, descr=chararraydescr)
+        i3 = getarrayitem_raw(p0, i0, descr=chararraydescr)
         i1 = int_add(i0, 1)
         i2 = int_le(i1, 16)
         guard_true(i2) [p0, i0]
@@ -601,7 +601,7 @@
         i1 = int_add(i0, 1)
         i2 = int_le(i1, 16)
         guard_true(i2) [p0, i0]
-        i3 = getarrayitem_gc(p0, i1, descr=chararraydescr)
+        i3 = getarrayitem_raw(p0, i1, descr=chararraydescr)
         jump(p0,i1)
         """
         loop = self.parse_loop(ops)
@@ -631,12 +631,12 @@
     def test_isomorphic_operations(self):
         ops_src = """
         [p1,p0,i0]
-        i3 = getarrayitem_gc(p0, i0, descr=chararraydescr)
+        i3 = getarrayitem_raw(p0, i0, descr=chararraydescr)
         i1 = int_add(i0, 1)
         i2 = int_le(i1, 16)
-        i4 = getarrayitem_gc(p0, i1, descr=chararraydescr)
-        i5 = getarrayitem_gc(p1, i1, descr=floatarraydescr)
-        i6 = getarrayitem_gc(p0, i1, descr=floatarraydescr)
+        i4 = getarrayitem_raw(p0, i1, descr=chararraydescr)
+        i5 = getarrayitem_raw(p1, i1, descr=floatarraydescr)
+        i6 = getarrayitem_raw(p0, i1, descr=floatarraydescr)
         guard_true(i2) [p0, i0]
         jump(p1,p0,i1)
         """
@@ -657,7 +657,7 @@
         i1 = int_add(i0, 1)
         i2 = int_le(i1, 16)
         guard_true(i2) [p0, i0]
-        i3 = getarrayitem_gc(p0, i1, descr=chararraydescr)
+        i3 = getarrayitem_raw(p0, i1, descr=chararraydescr)
         i4 = int_add(i3, 1)
         jump(p0,i1)
         """
@@ -676,9 +676,9 @@
         i1 = int_add(i0, 1)
         i2 = int_le(i1, 16)
         guard_true(i2) [p0, i0]
-        i3 = getarrayitem_gc(p0, i1, descr=chararraydescr)
+        i3 = getarrayitem_raw(p0, i1, descr=chararraydescr)
         i4 = int_mul(i3, 2)
-        setarrayitem_gc(p0, i1, i4, descr=chararraydescr)
+        setarrayitem_raw(p0, i1, i4, descr=chararraydescr)
         jump(p0,i1)
         """
         loop = self.parse_loop(ops)
@@ -695,7 +695,7 @@
     def test_packset_combine_simple(self,descr):
         ops = """
         [p0,i0]
-        i3 = getarrayitem_gc(p0, i0, descr={descr}arraydescr)
+        i3 = getarrayitem_raw(p0, i0, descr={descr}arraydescr)
         i1 = int_add(i0,1)
         jump(p0,i1)
         """.format(descr=descr)
@@ -736,9 +736,9 @@
     def test_packset_combine_2_loads_one_redundant(self):
         ops = """
         [p0,i0]
-        i3 = getarrayitem_gc(p0, i0, descr=floatarraydescr)
+        i3 = getarrayitem_raw(p0, i0, descr=floatarraydescr)
         i1 = int_add(i0,1)
-        i4 = getarrayitem_gc(p0, i1, descr=floatarraydescr)
+        i4 = getarrayitem_raw(p0, i1, descr=floatarraydescr)
         jump(p0,i1)
         """
         pytest.skip("loop unrolling must apply redundant loop unrolling")
@@ -762,7 +762,7 @@
 
         ops = """
         [p0,i0]
-        i3 = getarrayitem_gc(p0, i0, descr=floatarraydescr)
+        i3 = getarrayitem_raw(p0, i0, descr=floatarraydescr)
         jump(p0,i3)
         """
         try:
@@ -826,10 +826,10 @@
         guard_no_early_exit() []
         i10 = int_le(i0, 128)  # 1, 8, 15, 22
         guard_true(i10) [p0,p1,p2,i0] # 2, 9, 16, 23
-        i2 = getarrayitem_gc(p0, i0, descr={descr}arraydescr) # 3, 10, 17, 24
-        i3 = getarrayitem_gc(p1, i0, descr={descr}arraydescr) # 4, 11, 18, 25
+        i2 = getarrayitem_raw(p0, i0, descr={descr}arraydescr) # 3, 10, 17, 24
+        i3 = getarrayitem_raw(p1, i0, descr={descr}arraydescr) # 4, 11, 18, 25
         i4 = {op}(i2,i3) # 5, 12, 19, 26
-        setarrayitem_gc(p2, i0, i4, descr={descr}arraydescr) # 6, 13, 20, 27
+        setarrayitem_raw(p2, i0, i4, descr={descr}arraydescr) # 6, 13, 20, 27
         i1 = int_add(i0, {stride}) # 7, 14, 21, 28
         jump(p0,p1,p2,i1) # 29
         """.format(op=op,descr=descr,stride=1) # stride getarray is always 1
@@ -842,10 +842,10 @@
         guard_true(i11) []
         i12 = int_add(i1, {stride})
         guard_no_early_exit() []
-        v1 = vec_raw_load(p0, i0, 2, descr={descr}arraydescr)
-        v2 = vec_raw_load(p1, i0, 2, descr={descr}arraydescr)
+        v1 = vec_getarrayitem_raw(p0, i0, 2, descr={descr}arraydescr)
+        v2 = vec_getarrayitem_raw(p1, i0, 2, descr={descr}arraydescr)
         v3 = {op}(v1,v2,2)
-        vec_raw_store(p2, i0, v3, 2, descr={descr}arraydescr)
+        vec_setarrayitem_raw(p2, i0, v3, 2, descr={descr}arraydescr)
         jump(p0,p1,p2,i12)
         """.format(op='vec_'+op,descr=descr,stride=1)
         loop = self.parse_loop(ops)
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
@@ -497,9 +497,13 @@
 
     def _vectorize_VEC_RAW_LOAD(self, vop):
         self.vector_result(vop)
+    def _vectorize_VEC_GETARRAYITEM_RAW(self, vop):
+        self.vector_result(vop)
 
     def _vectorize_VEC_RAW_STORE(self, vop):
         self.vector_arg(vop, 2)
+    def _vectorize_VEC_SETARRAYITEM_RAW(self, vop):
+        self.vector_arg(vop, 2)
 
 VecScheduleData._inspect_operation = \
         make_dispatcher_method(VecScheduleData, '_vectorize_')
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -507,6 +507,7 @@
 
     'GETARRAYITEM_GC/2d',
     'GETARRAYITEM_RAW/2d',
+    'VEC_GETARRAYITEM_RAW/3d',
     'RAW_LOAD/2d',
     'VEC_RAW_LOAD/3d',
     'GETINTERIORFIELD_GC/2d',
@@ -530,6 +531,7 @@
     'INCREMENT_DEBUG_COUNTER/1',
     'SETARRAYITEM_GC/3d',
     'SETARRAYITEM_RAW/3d',
+    'VEC_SETARRAYITEM_RAW/4d',
     'RAW_STORE/3d',
     'VEC_RAW_STORE/4d',
     'SETINTERIORFIELD_GC/3d',
@@ -705,12 +707,10 @@
 }
 _opvector = {
     rop.RAW_LOAD:         rop.VEC_RAW_LOAD,
-    rop.GETARRAYITEM_RAW: rop.VEC_RAW_LOAD,
-    rop.GETARRAYITEM_GC:  rop.VEC_RAW_LOAD,
+    rop.GETARRAYITEM_RAW: rop.VEC_GETARRAYITEM_RAW,
 
     rop.RAW_STORE:        rop.VEC_RAW_STORE,
-    rop.SETARRAYITEM_RAW: rop.VEC_RAW_STORE,
-    rop.SETARRAYITEM_GC:  rop.VEC_RAW_STORE,
+    rop.SETARRAYITEM_RAW: rop.VEC_SETARRAYITEM_RAW,
 
     rop.INT_ADD:   rop.VEC_INT_ADD,
     rop.INT_SUB:   rop.VEC_INT_SUB,
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
@@ -79,7 +79,7 @@
         assert res == 42
         self.check_trace_count(1)
 
-    @py.test.mark.parametrize('i',[8])
+    @py.test.mark.parametrize('i',[1,2,3,8,17,128,500])
     def test_vectorize_array_get_set(self,i):
         myjitdriver = JitDriver(greens = [],
                                 reds = ['i','d','va','vb','vc'],
@@ -112,7 +112,8 @@
             return res
         res = self.meta_interp(f, [i])
         assert res == f(i)
-        self.check_trace_count(1)
+        if i > 4:
+            self.check_trace_count(1)
 
 class TestLLtype(VectorizeTest, LLJitMixin):
     pass


More information about the pypy-commit mailing list