[pypy-commit] pypy optresult-unroll: fight, the best I got so far

fijal noreply at buildbot.pypy.org
Tue Aug 18 17:22:26 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79041:f10f772c7fb6
Date: 2015-08-18 17:22 +0200
http://bitbucket.org/pypy/pypy/changeset/f10f772c7fb6/

Log:	fight, the best I got so far

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
@@ -244,11 +244,6 @@
         # mapping const value -> info corresponding to it's heap cache
         self.const_infos = self.optimizer.cpu.ts.new_ref_dict()
 
-    def force_at_end_of_preamble(self):
-        self.cached_dict_reads.clear()
-        self.corresponding_array_descrs.clear()
-        self.force_all_lazy_setfields_and_arrayitems()
-
     def flush(self):
         self.cached_dict_reads.clear()
         self.corresponding_array_descrs.clear()
@@ -478,6 +473,11 @@
             if indexb is None or indexb.contains(idx):
                 cf.force_lazy_setfield(self, None, can_cache)
 
+    def force_at_end_of_preamble(self):
+        self.cached_dict_reads.clear()
+        self.corresponding_array_descrs.clear()
+        self.force_all_lazy_setfields_and_arrayitems()
+
     def force_all_lazy_setfields_and_arrayitems(self):
         items = self.cached_fields.items()
         if not we_are_translated():
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -137,7 +137,7 @@
             v1, v2 = v2, v1
         # if both are constant, the pure optimization will deal with it
         if v2.is_constant() and not v1.is_constant():
-            if False and not self.optimizer.is_inputarg(arg1):
+            if not self.optimizer.is_inputarg(arg1):
                 if arg1.getopnum() == rop.INT_ADD:
                     prod_arg1 = arg1.getarg(0)
                     prod_arg2 = arg1.getarg(1)
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
@@ -41,6 +41,7 @@
 class AbstractShortOp(object):
     """ An operation that is potentially produced by the short preamble
     """
+    pass
 
 class HeapOp(AbstractShortOp):
     def __init__(self, res, getfield_op):
@@ -209,15 +210,15 @@
         # of AbstractShortOp
         self.potential_ops = OrderedDict()
         self.produced_short_boxes = {}
-        self.short_inputargs = []
         # 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 = []
-        for i in range(len(inputargs)):
-            box = inputargs[i]
+        self.short_inputargs = []
+        for i in range(len(label_args)):
+            box = label_args[i]
             renamed = OpHelpers.inputarg_from_tp(box.type)
-            self.potential_ops[box] = ShortInputArg(label_args[i], renamed)
             self.short_inputargs.append(renamed)
+            self.potential_ops[box] = ShortInputArg(box, renamed)
 
         optimizer.produce_potential_short_preamble_ops(self)
 
@@ -302,7 +303,7 @@
                 renamed = OpHelpers.inputarg_from_tp(label_args[i].type)
                 short_inpargs.append(renamed)
             else:
-                #assert isinstance(inparg, ShortInputArg)
+                assert isinstance(inparg.short_op, ShortInputArg)
                 short_inpargs.append(inparg.preamble_op)
         return short_inpargs
 
@@ -314,7 +315,8 @@
         self.potential_ops[op] = CompoundOp(op, pop, prev_op)
 
     def add_pure_op(self, op):
-        assert op not in self.potential_ops
+        if op in self.potential_ops:
+            return
         self.add_potential_op(op, PureOp(op))
 
     def add_loopinvariant_op(self, 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
@@ -879,7 +879,7 @@
         jump(p2, p3)
         """
         short = """
-        [p1]
+        [p1, p2]
         i1 = getfield_gc_i(p1, descr=valuedescr)
         jump(i1)
         """
@@ -1221,12 +1221,10 @@
         setfield_gc(p0, p1, descr=nextdescr)
         setfield_gc(p2, i1, descr=valuedescr)
         setfield_gc(p1, p2, descr=nextdescr)
-        jump(p1)
+        jump(p1, p2, i1)
         """
         loop = """
-        [p0]
-        p41 = getfield_gc_r(p0, descr=nextdescr)
-        i0 = getfield_gc_i(p41, descr=valuedescr)
+        [p0, p41, i0]
         i1 = int_add(i0, 1)
         p1 = new_with_vtable(descr=nodesize2)
         p2 = new_with_vtable(descr=nodesize2)
@@ -1234,7 +1232,7 @@
         setfield_gc(p0, p1, descr=nextdescr)
         setfield_gc(p2, i1, descr=valuedescr)
         setfield_gc(p1, p2, descr=nextdescr)
-        jump(p1)
+        jump(p1, p2, i1)
         """
         self.optimize_loop(ops, loop, preamble)
 
@@ -2397,7 +2395,11 @@
         setfield_gc(p1, i2, descr=valuedescr)
         jump(p1, i1, i2, 1) # , i5)
         """
-        self.optimize_loop(ops, expected, preamble)
+        expected_short = """
+        []
+        """
+        self.optimize_loop(ops, expected, preamble,
+                           expected_short=expected_short)
 
     def test_duplicate_setfield_residual_guard_2(self):
         # the difference with the previous test is that the field value is
@@ -8718,5 +8720,16 @@
         """
         self.optimize_loop(ops, expected, expected_short=expected_short)
 
+    def test_simple_swap_arguments(self):
+        ops = """
+        [i0, i1]
+        i2 = int_add(i1, 1)
+        jump(i2, i0)
+        """
+        expected = """
+        []
+        """
+        self.optimize_loop(ops, expected)
+
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py
@@ -12,7 +12,7 @@
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      InputArgRef
 from rpython.jit.metainterp.optimizeopt.shortpreamble import \
-     ShortPreambleBuilder, PreambleOp
+     ShortPreambleBuilder, PreambleOp, ShortInputArg
 from rpython.jit.metainterp.compile import LoopCompileData
 from rpython.jit.metainterp.optimizeopt.virtualstate import \
      NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS,\
@@ -64,6 +64,9 @@
             remap[v] = k
         equaloplists(short, exp, remap=remap)
 
+def producable_short_boxes(l):
+    return [x for x in l if not isinstance(x.short_op, ShortInputArg)]
+        
 class TestUnroll(BaseTestUnroll):
     def test_simple(self):
         loop = """
@@ -230,7 +233,8 @@
         jump(i1, p1, p2)
         """
         es, loop, preamble = self.optimize(loop)
-        assert len(es.short_boxes) == 2
+        assert len(producable_short_boxes(es.short_boxes)) == 2
+        xxx
 
     def test_setfield_forced_virtual(self):
         loop = """
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
@@ -107,7 +107,10 @@
                      for op in end_jump.getarglist()]
         jump_args = state.virtual_state.make_inputargs(orig_jump_args,
                                     self.optimizer, force_boxes=True)
-        extra_jump_args = self.inline_short_preamble(jump_args)
+        pass_to_short = state.virtual_state.make_inputargs(orig_jump_args,
+                                    self.optimizer, force_boxes=True,
+                                    append_virtuals=True)
+        extra_jump_args = self.inline_short_preamble(pass_to_short)
         # remove duplicates, removes stuff from used boxes too
         label_args, jump_args = self.filter_extra_jump_args(
             start_label.getarglist() + self.short_preamble_producer.used_boxes,
@@ -166,9 +169,11 @@
         for arg in label_args:
             infos[arg] = self.optimizer.getinfo(arg)            
         sb = ShortBoxes()
+        label_args_plus_virtuals = virtual_state.make_inputargs(end_args,
+                                        self.optimizer, append_virtuals=True)
         short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs,
-                                            label_args)
-        short_inputargs = sb.create_short_inputargs(label_args)
+                                            label_args_plus_virtuals)
+        short_inputargs = sb.create_short_inputargs(label_args_plus_virtuals)
         for produced_op in short_boxes:
             op = produced_op.short_op.res
             if not isinstance(op, Const):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -516,7 +516,8 @@
                                           state)
         return state
 
-    def make_inputargs(self, inputargs, optimizer, force_boxes=False):
+    def make_inputargs(self, inputargs, optimizer, force_boxes=False,
+                       append_virtuals=False):
         assert len(inputargs) == len(self.state)
         boxes = [None] * self.numnotvirtuals
 
@@ -530,6 +531,14 @@
         for i in range(len(inputargs)):
             self.state[i].enum_forced_boxes(boxes, inputargs[i], optimizer)
 
+        if append_virtuals:
+            # we append the virtuals here in case some stuff is proven
+            # to be not a virtual and there are getfields in the short preamble
+            # that will read items out of there
+            for i in range(len(inputargs)):
+                if not isinstance(self.state[i], NotVirtualStateInfo):
+                    boxes.append(inputargs[i])
+            
         return boxes
 
     def debug_print(self, hdr='', bad=None, metainterp_sd=None):


More information about the pypy-commit mailing list