Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult-unroll
Changeset: r78933:b98fe23848c6
Date: 2015-08-12 16:24 +0200
http://bitbucket.org/pypy/pypy/changeset/b98fe23848c6/

Log:    fix some tests

diff --git a/rpython/jit/metainterp/compile.py 
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -52,7 +52,8 @@
         if unroll:
             opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
             return opt.optimize_preamble(self.start_label, self.end_label,
-                                         self.operations)
+                                         self.operations,
+                                         self.call_pure_results)
         else:
             xxx
 
@@ -93,7 +94,7 @@
         assert unroll # we should not be here if it's disabled
         opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
         return opt.optimize_peeled_loop(self.start_label, self.end_jump,
-                                        self.operations, self.state)
+            self.operations, self.state, self.call_pure_results)
 
 def show_procedures(metainterp_sd, procedure=None, error=None):
     # debugging
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -286,7 +286,10 @@
 
     def clean_caches(self):
         del self._lazy_setfields_and_arrayitems[:]
-        for descr, cf in self.cached_fields.items():
+        items = self.cached_fields.items()
+        if not we_are_translated():
+            items.sort(key=str, reverse=True)
+        for descr, cf in items:
             if not descr.is_always_pure():
                 cf.invalidate(descr)
         for descr, submap in self.cached_arrayitems.iteritems():
@@ -474,8 +477,10 @@
                 cf.force_lazy_setfield(self, None, can_cache)
 
     def force_all_lazy_setfields_and_arrayitems(self):
-        # XXX fix the complexity here
-        for descr, cf in self.cached_fields.items():
+        items = self.cached_fields.items()
+        if not we_are_translated():
+            items.sort(key=str, reverse=True)
+        for descr, cf in items:
             cf.force_lazy_setfield(self, descr)
         for submap in self.cached_arrayitems.itervalues():
             for index, cf in submap.iteritems():
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py 
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -54,9 +54,11 @@
         opinfo = opt.optimizer.ensure_ptr_info_arg0(g)
         pop = PreambleOp(self.res, preamble_op)
         assert not opinfo.is_virtual()
+        descr = self.getfield_op.getdescr()
         if g.is_getfield():
+            cf = optheap.field_cache(descr)
             opinfo.setfield(preamble_op.getdescr(), self.res, pop,
-                            optheap=optheap)
+                            optheap, cf)
         else:
             index = g.getarg(1).getint()
             assert index >= 0
@@ -88,7 +90,7 @@
         if optpure is None:
             return
         op = self.res
-        if op.is_call():
+        if preamble_op.is_call():
             optpure.extra_call_pure.append(PreambleOp(op, preamble_op))
         else:
             opt.pure(op.getopnum(), PreambleOp(op, preamble_op))
@@ -101,8 +103,11 @@
             if newarg is None:
                 return None
             arglist.append(newarg)
-        return ProducedShortOp(self, op.copy_and_change(op.getopnum(),
-                                                        args=arglist))
+        if op.is_call():
+            opnum = OpHelpers.call_pure_for_descr(op.getdescr())
+        else:
+            opnum = op.getopnum()
+        return ProducedShortOp(self, op.copy_and_change(opnum, args=arglist))
 
     def __repr__(self):
         return "PureOp(%r)" % (self.res,)
@@ -189,7 +194,6 @@
         # of AbstractShortOp
         self.potential_ops = {}
         self.produced_short_boxes = {}
-        self.extra_short_boxes = {}
         # a way to produce const boxes, e.g. setfield_gc(p0, Const).
         # We need to remember those, but they don't produce any new boxes
         self.const_short_boxes = []
@@ -212,7 +216,6 @@
         for op, produced_op in self.produced_short_boxes.iteritems():
             if not isinstance(produced_op, ShortInputArg):
                 short_boxes.append(produced_op)
-        short_boxes += self.extra_short_boxes
 
         for short_op in self.const_short_boxes:
             getfield_op = short_op.getfield_op
@@ -233,7 +236,10 @@
         elif isinstance(op, Const):
             return op
         elif op in self.potential_ops:
-            return self.add_op_to_short(self.potential_ops[op]).preamble_op
+            r = self.add_op_to_short(self.potential_ops[op])
+            if r is None:
+                return None
+            return r.preamble_op
         else:
             return None
 
@@ -244,11 +250,20 @@
         try:
             if isinstance(shortop, CompoundOp):
                 lst = shortop.flatten(self, [])
-                if len(lst) == 1:
-                    pop = lst[0]
+                if len(lst) == 0:
+                    return None
                 else:
-                    pop = lst[0]
-                    for i in range(1, len(lst)):
+                    index = -1
+                    for i, item in enumerate(lst):
+                        if not isinstance(item.short_op, HeapOp):
+                            assert index == -1
+                            index = i
+                    if index == -1:
+                        index = 0
+                    pop = lst[index]
+                    for i in range(len(lst)):
+                        if i == index:
+                            continue
                         opnum = OpHelpers.same_as_for_type(shortop.res.type)
                         new_name = ResOperation(opnum, [shortop.res])
                         assert lst[i].short_op is not pop.short_op
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -3602,8 +3602,8 @@
         [p1, i1, p2, i2]
         setfield_gc(p2, i2, descr=adescr)
         i3 = call_i(i1, descr=readadescr)
+        setfield_gc(p2, i3, descr=adescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        setfield_gc(p2, i3, descr=adescr)
         jump(p1, i1, p2, i2)
         """
         self.optimize_loop(ops, expected)
@@ -3622,8 +3622,8 @@
         [p1, i1, p2, i2]
         setfield_gc(p2, i2, descr=adescr)
         i3 = call_i(i1, descr=writeadescr)
+        setfield_gc(p2, i3, descr=adescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        setfield_gc(p2, i3, descr=adescr)
         jump(p1, i1, p2, i2)
         """
         self.optimize_loop(ops, expected)
@@ -3634,8 +3634,8 @@
         setfield_gc(p1, i1, descr=valuedescr)
         setfield_gc(p2, i2, descr=adescr)
         i3 = call_i(i1, descr=plaincalldescr)
+        setfield_gc(p2, i3, descr=adescr)
         setfield_gc(p1, i3, descr=valuedescr)
-        setfield_gc(p2, i3, descr=adescr)
         jump(p1, i1, p2, i2)
         """
         self.optimize_loop(ops, ops)
@@ -3678,6 +3678,7 @@
         '''
         expected = '''
         [p1, i4, i3]
+        setfield_gc(p1, i3, descr=valuedescr)
         jump(p1, i3, i3)
         '''
         preamble = '''
@@ -3703,6 +3704,7 @@
         '''
         expected = '''
         [p1, i4, i3]
+        setfield_gc(p1, i3, descr=valuedescr)
         jump(p1, i3, i3)
         '''
         preamble = '''
@@ -3760,16 +3762,16 @@
         jump(p1, i4, i3)
         '''
         expected = '''
-        [p1, i4, i3, i5]
+        [p1, i4, i3]
         setfield_gc(p1, i4, descr=valuedescr)
-        jump(p1, i3, i5, i5)
+        jump(p1, i3, i3)
         '''
         preamble = '''
         [p1, i1, i4]
         setfield_gc(p1, i1, descr=valuedescr)
         i3 = call_i(p1, descr=elidablecalldescr)
-        i151 = same_as_i(i3)
-        jump(p1, i4, i3, i151)
+        # i151 = same_as_i(i3)
+        jump(p1, i4, i3)
         '''
         self.optimize_loop(ops, expected, preamble)
 
@@ -3789,36 +3791,36 @@
         escape_n(i1)
         escape_n(i2)
         i4 = call_i(123456, 4, i0, 6, descr=elidablecalldescr)
-        i153 = same_as_i(i4)
-        jump(i0, i4, i153)
+        # i153 = same_as_i(i4)
+        jump(i0, i4)
         '''
         expected = '''
-        [i0, i4, i5]
+        [i0, i4]
         escape_n(42)
         escape_n(i4)
-        jump(i0, i5, i5)
+        jump(i0, i4)
         '''
         self.optimize_loop(ops, expected, preamble, call_pure_results)
 
     def test_call_pure_constant_folding_memoryerr(self):
         ops = '''
         [p0, i0]
-        escape(i0)
-        i3 = call_pure(123456, p0, descr=elidable2calldescr)
+        escape_n(i0)
+        i3 = call_pure_i(123456, p0, descr=elidable2calldescr)
         guard_no_exception() []
         jump(p0, i3)
         '''
         preamble = '''
         [p0, i0]
-        escape(i0)
-        i3 = call(123456, p0, descr=elidable2calldescr)
+        escape_n(i0)
+        i3 = call_i(123456, p0, descr=elidable2calldescr)
         guard_no_exception() []
-        i4 = same_as(i3)
+        # i4 = same_as(i3)
         jump(p0, i3, i4)
         '''
         expected = '''
         [p0, i3, i4]
-        escape(i3)
+        escape_n(i3)
         jump(p0, i4, i4)
         '''
         self.optimize_loop(ops, expected, preamble)
@@ -8333,18 +8335,18 @@
     def test_cache_setarrayitem_across_loop_boundaries(self):
         ops = """
         [p1]
-        p2 = getarrayitem_gc_r(p1, 3, descr=arraydescr)
+        p2 = getarrayitem_gc_r(p1, 3, descr=gcarraydescr)
         guard_nonnull_class(p2, ConstClass(node_vtable)) []
         call_n(p2, descr=nonwritedescr)
         p3 = new_with_vtable(descr=nodesize)
-        setarrayitem_gc(p1, 3, p3, descr=arraydescr)
+        setarrayitem_gc(p1, 3, p3, descr=gcarraydescr)
         jump(p1)
         """
         expected = """
         [p1, p2]
         call_n(p2, descr=nonwritedescr)
         p3 = new_with_vtable(descr=nodesize)
-        setarrayitem_gc(p1, 3, p3, descr=arraydescr)
+        setarrayitem_gc(p1, 3, p3, descr=gcarraydescr)
         jump(p1, p3)
         """
         self.optimize_loop(ops, expected)
@@ -8392,8 +8394,8 @@
         [i0, i1]
         p0 = escape_r()
         p1 = escape_r()
+        setfield_gc(p1, p0, descr=bdescr)
         setfield_gc(p0, p1, descr=adescr)
-        setfield_gc(p1, p0, descr=bdescr)
         jump(i0, i1)
         """
         self.optimize_loop(ops, expected)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -20,6 +20,7 @@
 from rpython.jit.metainterp.counter import DeterministicJitCounter
 from rpython.config.translationoption import get_combined_translation_config
 from rpython.jit.metainterp.resoperation import rop, ResOperation, InputArgRef
+from rpython.jit.metainterp.optimizeopt.util import args_dict
 
 
 def test_sort_descrs():
@@ -438,6 +439,12 @@
             metainterp_sd.callinfocollection = self.callinfocollection
         #
         compile_data.enable_opts = self.enable_opts
+        new_call_pure_results = args_dict()
+        if call_pure_results is not None:
+            for k, v in call_pure_results.items():
+                new_call_pure_results[list(k)] = v
+
+        compile_data.call_pure_results = new_call_pure_results
         state = optimize_trace(metainterp_sd, None, compile_data)
         return state
 
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -37,6 +37,8 @@
 
     def setinfo_from_preamble(self, op, preamble_info, exported_infos):
         op = self.get_box_replacement(op)
+        if op.get_forwarded() is not None:
+            return # XXX?
         if isinstance(preamble_info, info.PtrInfo):
             if preamble_info.is_virtual():
                 # XXX do we want to sanitize this?
@@ -88,10 +90,10 @@
                 assert op.get_forwarded() is None
         assert not self.optimizer._newoperations
     
-    def optimize_preamble(self, start_label, end_label, ops):
+    def optimize_preamble(self, start_label, end_label, ops, 
call_pure_results):
         self._check_no_forwarding([[start_label, end_label], ops])
         info, newops = self.optimizer.propagate_all_forward(
-            start_label.getarglist()[:], ops)
+            start_label.getarglist()[:], ops, call_pure_results)
         exported_state = self.export_state(start_label, end_label,
                                            info.inputargs)
         # we need to absolutely make sure that we've cleaned up all
@@ -99,12 +101,13 @@
         self.optimizer._clean_optimization_info(self.optimizer._newoperations)
         return exported_state, self.optimizer._newoperations
 
-    def optimize_peeled_loop(self, start_label, end_jump, ops, state):
+    def optimize_peeled_loop(self, start_label, end_jump, ops, state,
+                             call_pure_results):
         self._check_no_forwarding([[start_label, end_jump], ops])
         self.import_state(start_label, state)
         self.potential_extra_ops = {}
         self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops,
-                                             rename_inputargs=False)
+                                             call_pure_results, False)
         orig_jump_args = [self.get_box_replacement(op)
                      for op in end_jump.getarglist()]
         jump_args = state.virtual_state.make_inputargs(orig_jump_args,
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to