[pypy-svn] r78595 - in pypy/branch/jit-unroll-loops/pypy/jit/metainterp: optimizeopt test

hakanardo at codespeak.net hakanardo at codespeak.net
Sun Oct 31 13:25:56 CET 2010


Author: hakanardo
Date: Sun Oct 31 13:25:51 2010
New Revision: 78595

Modified:
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
   pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(hakanardo, arigo) workaround that dissables string optimisation of the preamble

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/__init__.py	Sun Oct 31 13:25:51 2010
@@ -10,15 +10,18 @@
 def optimize_loop_1(metainterp_sd, loop, unroll=True):
     """Optimize loop.operations to remove internal overheadish operations. 
     """
+    opt_str = OptString()
     optimizations = [OptIntBounds(),
                      OptRewrite(),
                      OptVirtualize(),
-                     OptString(),
+                     opt_str,
                      OptHeap(),
                      OptFfiCall(),
                     ]
     if unroll:
         optimizations.insert(0, OptUnroll())
+        opt_str.enabled = False # FIXME: Workaround to disable string optimisation
+                                # during preamble but to keep it during the loop
     optimizer = Optimizer(metainterp_sd, loop, optimizations)
     optimizer.propagate_all_forward()
 

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py	Sun Oct 31 13:25:51 2010
@@ -162,7 +162,7 @@
             for value in self._chars:
                 value.get_args_for_fail(modifier)
 
-    def enum_forced_boxes(self, boxes, already_seen):
+    def FIXME_enum_forced_boxes(self, boxes, already_seen):
         key = self.get_key_box()
         if key in already_seen:
             return
@@ -225,7 +225,7 @@
             self.left.get_args_for_fail(modifier)
             self.right.get_args_for_fail(modifier)
 
-    def enum_forced_boxes(self, boxes, already_seen):
+    def FIXME_enum_forced_boxes(self, boxes, already_seen):
         key = self.get_key_box()
         if key in already_seen:
             return
@@ -283,7 +283,7 @@
             self.vstart.get_args_for_fail(modifier)
             self.vlength.get_args_for_fail(modifier)
 
-    def enum_forced_boxes(self, boxes, already_seen):
+    def FIXME_enum_forced_boxes(self, boxes, already_seen):
         key = self.get_key_box()
         if key in already_seen:
             return
@@ -365,7 +365,8 @@
 
 class OptString(optimizer.Optimization):
     "Handling of strings and unicodes."
-
+    enabled = True
+    
     def make_vstring_plain(self, box, source_op, mode):
         vvalue = VStringPlainValue(self.optimizer, box, source_op, mode)
         self.make_equal_to(box, vvalue)
@@ -643,6 +644,10 @@
         self.optimizer.newoperations.append(op)
 
     def propagate_forward(self, op):
+        if not self.enabled:
+            self.emit_operation(op)
+            return
+            
         opnum = op.getopnum()
         for value, func in optimize_ops:
             if opnum == value:
@@ -651,6 +656,9 @@
         else:
             self.emit_operation(op)
 
+    def force_at_end_of_preamble(self):
+        self.enabled = True
+
 optimize_ops = _findall(OptString, 'optimize_')
 
 def _findall_call_oopspec():

Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/test/test_optimizeopt.py	Sun Oct 31 13:25:51 2010
@@ -3946,12 +3946,14 @@
         self.optimize_loop(ops, expected, preamble)
 
     # ----------
-    def optimize_strunicode_loop(self, ops, optops, preamble):
+    def optimize_strunicode_loop(self, ops, optops, preamble=None):
+        if not preamble:
+            preamble = ops # FIXME: Force proper testing of preamble
         # check with the arguments passed in
         self.optimize_loop(ops, optops, preamble)
         # check with replacing 'str' with 'unicode' everywhere
         def r(s):
-            return r.replace('str','unicode').replace('s"', 'u"')
+            return s.replace('str','unicode').replace('s"', 'u"')
         self.optimize_loop(r(ops), r(optops), r(preamble))
 
     def test_newstr_1(self):
@@ -3991,7 +3993,7 @@
         jump(p2, p3)
         """
         expected = """
-        [p2, p1]
+        [p1, p2]
         i1 = strlen(p1)
         i2 = strlen(p2)
         i3 = int_add(i1, i2)
@@ -4001,7 +4003,7 @@
         i5 = strlen(p2)
         i6 = int_add(i4, i5)      # will be killed by the backend
         copystrcontent(p2, p3, 0, i4, i5)
-        jump(p3, p2)
+        jump(p2, p3)
         """
         self.optimize_strunicode_loop(ops, expected)
 
@@ -4107,12 +4109,18 @@
         escape(p3)
         jump()
         """
+        preamble = """
+        []
+        p3 = call(0, s"ab", s"cde", descr=strconcatdescr)
+        escape(p3)
+        jump()
+        """
         expected = """
         []
         escape(s"abcde")
         jump()
         """
-        self.optimize_strunicode_loop(ops, expected)
+        self.optimize_strunicode_loop(ops, expected, preamble)
 
     def test_str_slice_1(self):
         ops = """
@@ -4219,7 +4227,7 @@
         self.optimize_strunicode_loop(ops, expected)
 
     # ----------
-    def optimize_strunicode_loop_extradescrs(self, ops, optops):
+    def optimize_strunicode_loop_extradescrs(self, ops, optops, preamble=None):
         from pypy.jit.metainterp.optimizeopt import string
         def my_callinfo_for_oopspec(oopspecindex):
             calldescrtype = type(LLtypeMixin.strequaldescr)
@@ -4234,7 +4242,7 @@
         saved = string.callinfo_for_oopspec
         try:
             string.callinfo_for_oopspec = my_callinfo_for_oopspec
-            self.optimize_strunicode_loop(ops, optops)
+            self.optimize_strunicode_loop(ops, optops, preamble)
         finally:
             string.callinfo_for_oopspec = saved
 
@@ -4320,14 +4328,13 @@
         """
         expected = """
         [p1, i1, i2, p3]
-        guard_nonnull(p3) []
         i4 = int_sub(i2, i1)
         i0 = call(0, p1, i1, i4, p3, descr=streq_slice_nonnull_descr)
         escape(i0)
         jump(p1, i1, i2, p3)
         """
         self.optimize_strunicode_loop_extradescrs(ops,
-                                                  expected)
+                                                  expected, ops)
 
     def test_str_equal_slice4(self):
         ops = """
@@ -4407,7 +4414,6 @@
         """
         expected = """
         [p1]
-        guard_nonnull(p1) []
         i0 = call(0, p1, s"hello world", descr=streq_nonnull_descr)
         escape(i0)
         jump(p1)
@@ -4424,7 +4430,6 @@
         """
         expected = """
         [p1]
-        guard_nonnull(p1) []
         i1 = strlen(p1)
         i0 = int_eq(i1, 0)
         escape(i0)
@@ -4442,7 +4447,6 @@
         """
         expected = """
         [p1]
-        guard_nonnull(p1) []
         i0 = call(0, p1, 120, descr=streq_nonnull_char_descr)
         escape(i0)
         jump(p1)



More information about the Pypy-commit mailing list