[pypy-commit] pypy ppc-vsx-support: vector operations (load/store) where not considered in dep. construction (was not needed up to now)

plan_rich pypy.commits at gmail.com
Mon Sep 12 10:48:26 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r87045:f7f829beb5bb
Date: 2016-09-12 16:47 +0200
http://bitbucket.org/pypy/pypy/changeset/f7f829beb5bb/

Log:	vector operations (load/store) where not considered in dep.
	construction (was not needed up to now)

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
@@ -13,6 +13,7 @@
 MODIFY_COMPLEX_OBJ = [ (rop.SETARRAYITEM_GC, 0, 1)
                      , (rop.SETARRAYITEM_RAW, 0, 1)
                      , (rop.RAW_STORE, 0, 1)
+                     , (rop.VEC_STORE, 0, 1)
                      , (rop.SETINTERIORFIELD_GC, 0, -1)
                      , (rop.SETINTERIORFIELD_RAW, 0, -1)
                      , (rop.SETFIELD_GC, 0, -1)
@@ -31,6 +32,8 @@
                    , (rop.GETARRAYITEM_RAW_F, 0, 1)
                    , (rop.RAW_LOAD_I, 0, 1)
                    , (rop.RAW_LOAD_F, 0, 1)
+                   , (rop.VEC_LOAD_I, 0, 1)
+                   , (rop.VEC_LOAD_F, 0, 1)
                    , (rop.GETINTERIORFIELD_GC_I, 0, 1)
                    , (rop.GETINTERIORFIELD_GC_F, 0, 1)
                    , (rop.GETINTERIORFIELD_GC_R, 0, 1)
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
@@ -43,11 +43,14 @@
         if not delayed:
             return
         args = op.getarglist()
+        if op.is_guard():
+            args = args[:] + op.getfailargs()
         for arg in args:
             if arg.is_constant() or arg.is_inputarg():
                 continue
             if arg not in self.seen:
                 needs_resolving[arg] = None
+
         indexvars = self.graph.index_vars
         i = len(delayed)-1
         while i >= 0:
@@ -118,8 +121,6 @@
                 self.worklist.insert(0, node)
 
     def try_emit_or_delay(self, node):
-        # implement me in subclass. e.g. as in VecScheduleState
-
         if not node.is_imaginary() and node.is_pure():
             # this operation might never be emitted. only if it is really needed
             self.delay_emit(node)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
@@ -540,6 +540,15 @@
         """)
         self.assert_dependencies(graph, full_check=True)
 
+    def test_dep_on_vector_op(self):
+        graph = self.build_dependency("""
+        [p0, i1] # 0: 1,2,3
+        i19 = int_mul(i1, 8) # 1: 2
+        v20[2xi64] = vec_load_i(p0, i19, 1, 0, descr=arraydescr) # 2:
+        jump(p0, i1) # 3:
+        """)
+        self.assert_dependencies(graph, full_check=True)
+
 
     def test_iterate(self):
         n1,n2,n3,n4,n5 = [FakeNode(i+1) for i in range(5)]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
@@ -175,13 +175,11 @@
             gso = GuardStrengthenOpt(graph.index_vars)
             gso.propagate_all_forward(info, loop)
         # re-schedule
-        #vsize = self.cpu.vector_ext.vec_size()
-        #graph = DependencyGraph(loop)
-        #state = VecScheduleState(graph, PackSet(vsize), self.cpu, costmodel)
-        #state.prepare()
-        #scheduler = Scheduler()
-        #scheduler.walk_and_emit(state)
-        #state.post_schedule()
+        graph = DependencyGraph(loop)
+        state = SchedulerState(self.cpu, graph)
+        state.prepare()
+        Scheduler().walk_and_emit(state)
+        state.post_schedule()
         return opt
 
     def vectorize(self, loop, unroll_factor = -1):
@@ -200,13 +198,11 @@
         gso.propagate_all_forward(info, loop)
         #
         # re-schedule
-        #vsize = self.cpu.vector_ext.vec_size()
-        #graph = DependencyGraph(loop)
-        #state = VecScheduleState(graph, PackSet(vsize), self.cpu, costmodel)
-        #state.prepare()
-        #scheduler = Scheduler()
-        #scheduler.walk_and_emit(state)
-        #state.post_schedule()
+        graph = DependencyGraph(loop)
+        state = SchedulerState(self.cpu, graph)
+        state.prepare()
+        Scheduler().walk_and_emit(state)
+        state.post_schedule()
         #
         oplist = loop.operations
         loop.operations = loop.prefix[:]
diff --git a/rpython/jit/metainterp/optimizeopt/vector.py b/rpython/jit/metainterp/optimizeopt/vector.py
--- a/rpython/jit/metainterp/optimizeopt/vector.py
+++ b/rpython/jit/metainterp/optimizeopt/vector.py
@@ -261,14 +261,13 @@
         gso.propagate_all_forward(info, loop, user_code)
 
         # re-schedule the trace -> removes index operations
-        # work in progress
-        #graph = DependencyGraph(loop)
-        #costmodel = GenericCostModel(self.cpu, self.cost_threshold)
-        #state = VecScheduleState(graph, PackSet(vsize), self.cpu, costmodel)
-        #state.prepare()
-        #scheduler = Scheduler()
-        #scheduler.walk_and_emit(state)
-        #state.post_schedule()
+        graph = DependencyGraph(loop)
+        costmodel = GenericCostModel(self.cpu, self.cost_threshold)
+        state = ScheduleState(self.cpu, graph)
+        state.prepare()
+        scheduler = Scheduler()
+        scheduler.walk_and_emit(state)
+        state.post_schedule()
 
     def unroll_loop_iterations(self, loop, unroll_count):
         """ Unroll the loop X times. unroll_count + 1 = unroll_factor """


More information about the pypy-commit mailing list