Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78025:eaef430ca49d
Date: 2015-06-11 10:08 +0200
http://bitbucket.org/pypy/pypy/changeset/eaef430ca49d/

Log:    signext (due to its missing x86 opcodes) is weigthed as "not a
        profitable operation"

diff --git a/pypy/module/micronumpy/compile.py 
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -724,8 +724,13 @@
                 raise ArgumentMismatch
             if self.name == "sum":
                 if len(self.args)>1:
-                    w_res = arr.descr_sum(interp.space,
+                    var = self.args[1]
+                    if isinstance(var, DtypeClass):
+                        w_res = arr.descr_sum(interp.space, None, 
var.execute(interp))
+                    else:
+                        w_res = arr.descr_sum(interp.space,
                                           self.args[1].execute(interp))
+
                 else:
                     w_res = arr.descr_sum(interp.space)
             elif self.name == "prod":
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
@@ -332,6 +332,17 @@
         assert result == sum(range(30))
         self.check_vectorized(1, 1)
 
+    def define_sum_float_to_int16():
+        return """
+        a = |30|
+        sum(a,int16)
+        """
+
+    def test_sum_float_to_int16(self):
+        result = self.run("sum_float_to_int16")
+        assert result == sum(range(30))
+        self.check_vectorized(1, 1)
+
     def define_cumsum():
         return """
         a = |30|
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py 
b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
@@ -119,7 +119,7 @@
         raw_store(p0, i4, i31, descr=int)
         """)
         savings = self.savings(loop1)
-        assert savings == 1
+        assert savings >= 0
 
     def test_sum(self):
         loop1 = self.parse("""
@@ -131,5 +131,26 @@
         savings = self.savings(loop1)
         assert savings == 2
 
+    def test_sum_float_to_int16(self):
+        loop1 = self.parse("""
+        f10 = raw_load(p0, i0, descr=double)
+        f11 = raw_load(p0, i1, descr=double)
+        i10 = cast_float_to_int(f10)
+        i11 = cast_float_to_int(f11)
+        i12 = int_signext(i10, 2)
+        i13 = int_signext(i11, 2)
+        i14 = int_add(i1, i12)
+        i16 = int_signext(i14, 2)
+        i15 = int_add(i16, i13)
+        i17 = int_signext(i15, 2)
+        """)
+        savings = self.savings(loop1)
+        # it does not benefit because signext has
+        # a very inefficient implementation (x86
+        # does not provide nice instr to convert
+        # integer sizes)
+        # signext -> no benefit, + 2x unpack
+        assert savings < 0
+
 class Test(CostModelBaseTest, LLtypeMixin):
     pass
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
@@ -12,7 +12,7 @@
 from rpython.jit.metainterp.optimizeopt.dependency import DependencyGraph
 from rpython.jit.metainterp.optimizeopt.unroll import Inliner
 from rpython.jit.metainterp.optimizeopt.vectorize import 
(VectorizingOptimizer, MemoryRef,
-        isomorphic, Pair, NotAVectorizeableLoop, NotAVectorizeableLoop, 
GuardStrengthenOpt)
+        isomorphic, Pair, NotAVectorizeableLoop, NotAProfitableLoop, 
GuardStrengthenOpt)
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.history import ConstInt, BoxInt, 
get_const_ptr_for_string
 from rpython.jit.metainterp import executor, compile, resume
@@ -109,6 +109,8 @@
         opt.find_adjacent_memory_refs()
         opt.extend_packset()
         opt.combine_packset()
+        if not opt.costmodel.profitable(opt.packset):
+            raise NotAProfitableLoop()
         opt.schedule(True)
         gso = GuardStrengthenOpt(opt.dependency_graph.index_vars)
         gso.propagate_all_forward(opt.loop)
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
@@ -361,11 +361,16 @@
         if not we_are_translated():
             # some test cases check the accumulation variables
             self.packset.accum_vars = {}
+            print "packs:"
             for pack in self.packset.packs:
                 accum = pack.accum
                 if accum:
                     self.packset.accum_vars[accum.var] = accum.pos
 
+                print " %dx %s (accum? %d) " % (len(pack.operations),
+                                                
pack.operations[0].op.getopname(),
+                                                accum is not None)
+
     def schedule(self, vector=False):
         self.guard_early_exit = -1
         self.clear_newoperations()
@@ -394,6 +399,8 @@
     def unpack_from_vector(self, op, sched_data, renamer):
         renamer.rename(op)
         args = op.getarglist()
+        if op.getopnum() == rop.INT_SIGNEXT:
+            py.test.set_trace()
         for i, arg in enumerate(op.getarglist()):
             if isinstance(arg, Box):
                 argument = self._unpack_from_vector(i, arg, sched_data, 
renamer)
@@ -481,7 +488,7 @@
     def unpack_cost(self, index, op):
         raise NotImplementedError
 
-    def savings_for_pack(self, opnum, times):
+    def savings_for_pack(self, pack, times):
         raise NotImplementedError
 
     def savings_for_unpacking(self, node, index):
@@ -495,8 +502,8 @@
     def calculate_savings(self, packset):
         savings = 0
         for pack in packset.packs:
-            savings += self.savings_for_pack(pack.opnum, pack.opcount())
             op0 = pack.operations[0].getoperation()
+            savings += self.savings_for_pack(pack, pack.opcount())
             if op0.result:
                 for i,node in enumerate(pack.operations):
                     savings += self.savings_for_unpacking(node, i)
@@ -507,10 +514,22 @@
 
 class X86_CostModel(CostModel):
 
-    def savings_for_pack(self, opnum, times):
-        cost, benefit_factor = (1,1) # TODO custom values for different ops
+    def savings_for_pack(self, pack, times):
+        cost, benefit_factor = (1,1)
+        op = pack.operations[0].getoperation()
+        if op.getopnum() == rop.INT_SIGNEXT:
+            cost, benefit_factor = self.cb_signext(pack)
         return benefit_factor * times - cost
 
+    def cb_signext(self, pack):
+        op0 = pack.operations[0].getoperation()
+        size = op0.getarg(1).getint()
+        orig_size = pack.output_type.getsize()
+        if size == orig_size:
+            return 0,0
+        # no benefit for this operation! needs many x86 instr 
+        return 1,0
+
     def unpack_cost(self, index, op):
         if op.getdescr():
             if op.getdescr().is_array_of_floats():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to