[pypy-commit] pypy vecopt-merge: did not consider guard in pack load, thus a wrong pack load was computed

plan_rich noreply at buildbot.pypy.org
Mon Oct 12 15:52:37 CEST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: vecopt-merge
Changeset: r80135:b9f8f993880a
Date: 2015-10-12 15:52 +0200
http://bitbucket.org/pypy/pypy/changeset/b9f8f993880a/

Log:	did not consider guard in pack load, thus a wrong pack load was
	computed

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
@@ -891,6 +891,11 @@
                 descr = left.getdescr()
                 bytesize = descr.get_item_size_in_bytes()
                 return bytesize * self.numops() - vec_reg_size
+            else:
+                assert left.is_guard() and left.getopnum() in \
+                       (rop.GUARD_TRUE, rop.GUARD_FALSE)
+                bytesize = left.getarg(0).bytesize
+                return bytesize * self.numops() - vec_reg_size
             return 0
         if self.numops() == 0:
             return -1
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
@@ -1339,6 +1339,23 @@
             'guard_true(i100) [p0, i0]',
         ], trace)
 
+    def test_pack_too_much(self):
+        trace = self.parse_loop("""
+        [p0, p1, i2, i3, i4, i5]
+        i6 = raw_load_i(i4, i3, descr=int16arraydescr)
+        guard_not_invalidated() [p0, i6, i3, i2, p1]
+        i7 = int_is_true(i6)
+        guard_true(i7) [p0, i6, i3, i2, p1]
+        i10 = getarrayitem_raw_i(139832330560762, 2, descr=chararraydescr)
+        guard_value(i10, 1) [p0, i6, i3, i2, p1]
+        i16 = int_add(i2, 1)
+        i18 = int_add(i3, 2)
+        i19 = int_ge(i16, i5)
+        guard_false(i19) [p0, i6, i3, i2, p1]
+        jump(p0, p1, i16, i18, i4, i5)""")
+        self.vectorize(trace)
+        self.debug_print_operations(trace)
+
 
 class TestLLtype(BaseTestVectorize, LLtypeMixin):
     pass
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
@@ -794,6 +794,8 @@
     def split_overloaded_packs(self):
         newpacks = []
         for i,pack in enumerate(self.packs):
+            if pack.operations[0].op.is_guard():
+                import pdb; pdb.set_trace()
             load = pack.pack_load(self.vec_reg_size)
             if load > Pack.FULL:
                 pack.split(newpacks, self.vec_reg_size)


More information about the pypy-commit mailing list