[pypy-commit] pypy vecopt: wrong assumption: it can happen that a call that is exception guarded is not immediatley after the call

plan_rich noreply at buildbot.pypy.org
Tue Jun 2 14:00:11 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77758:cd53c1c662a5
Date: 2015-06-02 14:00 +0200
http://bitbucket.org/pypy/pypy/changeset/cd53c1c662a5/

Log:	wrong assumption: it can happen that a call that is exception
	guarded is not immediatley after the call

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
@@ -598,22 +598,32 @@
         elif guard_opnum in (rop.GUARD_OVERFLOW, rop.GUARD_NO_OVERFLOW):
             # previous operation must be an ovf_operation
             guard_node.setpriority(100)
-            prev_node = self.nodes[guard_node.getindex()-1]
-            assert prev_node.getoperation().is_ovf()
-            prev_node.edge_to(guard_node, None, label='overflow')
-        elif guard_opnum == rop.GUARD_NOT_FORCED:
-            # previous op must be one that can raise
-            guard_node.setpriority(100)
-            prev_node = self.nodes[guard_node.getindex()-1]
-            assert prev_node.getoperation().can_raise()
-            prev_node.edge_to(guard_node, None, label='forced')
-        elif guard_opnum in (rop.GUARD_NO_EXCEPTION, rop.GUARD_EXCEPTION):
+            i = guard_node.getindex()-1
+            while i >= 0:
+                node = self.nodes[i]
+                op = node.getoperation()
+                if node.is_ovf():
+                    break
+                i -= 1
+            else:
+                raise AssertionError("(no)overflow: no overflowing op present")
+            node.edge_to(guard_node, None, label='overflow')
+        elif guard_opnum in (rop.GUARD_NO_EXCEPTION, rop.GUARD_EXCEPTION, rop.GUARD_NOT_FORCED):
             # previous op must be one that can raise or a not forced guard
             guard_node.setpriority(100)
-            prev_node = self.nodes[guard_node.getindex()-1]
-            prev_node.edge_to(guard_node, None, label='exception')
-            if not prev_node.getoperation().getopnum() == rop.GUARD_NOT_FORCED:
-                assert prev_node.getoperation().can_raise()
+            i = guard_node.getindex() - 1
+            while i >= 0:
+                node = self.nodes[i]
+                op = node.getoperation()
+                if op.can_raise():
+                    node.edge_to(guard_node, None, label='exception/notforced')
+                    break
+                if op.is_guard():
+                    node.edge_to(guard_node, None, label='exception/notforced')
+                    break
+                i -= 1
+            else:
+                raise AssertionError("(no)exception/not_forced: not op raises for them")
         else:
             pass # not invalidated, early exit, future condition!
 
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
@@ -57,6 +57,8 @@
             raise NotAVectorizeableLoop()
         if unroll_factor == -1:
             unroll_factor = opt.get_unroll_count(ARCH_VEC_REG_SIZE)
+            print ""
+            print "unroll factor: ", unroll_factor, opt.smallest_type_bytes
         opt.analyse_index_calculations()
         if opt.dependency_graph is not None:
             self._write_dot_and_convert_to_svg(opt.dependency_graph, "ee" + self.test_name)
@@ -831,6 +833,7 @@
     def test_packset_vector_operation(self, op, descr, stride):
         ops = """
         [p0,p1,p2,i0]
+        guard_early_exit() []
         i1 = int_add(i0, {stride})
         i10 = int_le(i1, 128)
         guard_true(i10) []
@@ -845,20 +848,14 @@
         assert len(vopt.dependency_graph.memory_refs) == 12
         assert len(vopt.packset.packs) == 4
 
-        for opindices in [(4,11,18,25),(5,12,19,26),
-                          (6,13,20,27),(7,14,21,28)]:
+        for opindices in [(5,12,19,26),(6,13,20,27),
+                          (7,14,21,28),(8,15,22,29)]:
             self.assert_has_pack_with(vopt.packset, opindices)
 
     @pytest.mark.parametrize('op,descr,stride',
-            [('int_add','char',1),
-             ('int_sub','char',1),
-             ('int_mul','char',1),
-             ('float_add','float',8),
+            [('float_add','float',8),
              ('float_sub','float',8),
              ('float_mul','float',8),
-             ('float_add','singlefloat',4),
-             ('float_sub','singlefloat',4),
-             ('float_mul','singlefloat',4),
              ('int_add','int',8),
              ('int_sub','int',8),
              ('int_mul','int',8),
@@ -1314,6 +1311,7 @@
 
 
     def test_abc(self):
+        py.test.skip()
         trace ="""
         """
         opt = self.vectorize(self.parse_loop(trace))
@@ -1336,7 +1334,6 @@
         """
         opt = self.vectorize(self.parse_loop(trace))
         self.debug_print_operations(opt.loop)
-        return
 
 class TestLLtype(BaseTestVectorize, LLtypeMixin):
     pass
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
@@ -214,7 +214,8 @@
                     if not isinstance(target_guard.getdescr(), ResumeAtLoopHeaderDescr):
                         descr = invent_fail_descr_for_op(copied_op.getopnum(), self)
                         olddescr = copied_op.getdescr()
-                        descr.copy_all_attributes_from(olddescr)
+                        if olddescr:
+                            descr.copy_all_attributes_from(olddescr)
                         copied_op.setdescr(descr)
 
                     if oi < ee_pos:
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
@@ -178,7 +178,7 @@
         return rop._RAW_LOAD_FIRST < self.getopnum() < rop._RAW_LOAD_LAST
 
     def is_raw_store(self):
-        return rop._RAW_LOAD_FIRST < self.getopnum() < rop._RAW_LOAD_LAST
+        return rop._RAW_STORE_FIRST < self.getopnum() < rop._RAW_STORE_LAST
 
     def is_comparison(self):
         return self.is_always_pure() and self.returns_bool_result()


More information about the pypy-commit mailing list