[pypy-commit] pypy optresult: hack unrolling enough to pass the first actual test

fijal noreply at buildbot.pypy.org
Sun Dec 14 19:05:41 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74917:2713ea9e60e2
Date: 2014-12-14 20:05 +0200
http://bitbucket.org/pypy/pypy/changeset/2713ea9e60e2/

Log:	hack unrolling enough to pass the first actual test

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
@@ -150,6 +150,7 @@
 
         loop.operations = self.optimizer.get_newoperations()
         final_state = self.export_state(stop_label)
+        final_state.dump(self.optimizer.metainterp_sd)
         loop.operations.append(stop_label)
         return final_state
 
@@ -386,7 +387,7 @@
         for i in range(len(short)):
             op = short[i]
             if op.is_guard():
-                op = op.clone()
+                #op = op.clone() XXXX
                 op.setfailargs(None)
                 op.setdescr(None) # will be set to a proper descr when the preamble is used
                 short[i] = op
@@ -453,13 +454,13 @@
         if op.is_guard():
             op.setdescr(None) # will be set to a proper descr when the preamble is used
 
-        if guards_needed and self.short_boxes.has_producer(op.result):
-            value_guards = self.getvalue(op.result).make_guards(op.result)
+        if guards_needed and self.short_boxes.has_producer(op):
+            value_guards = self.getvalue(op).make_guards(op)
         else:
             value_guards = []
 
         self.short.append(op)
-        self.short_seen[op.result] = None
+        self.short_seen[op] = None
         if emit and self.short_inliner:
             newop = self.short_inliner.inline_op(op)
             self.optimizer.send_extra_operation(newop)
@@ -577,21 +578,22 @@
         debug_stop('jit-log-virtualstate')
         return False
 
-    def _inline_short_preamble(self, short_preamble, inliner, patchguardop,
+    def _inline_short_preamble(self, short_preamble, memo, patchguardop,
                                assumed_classes):
         i = 1
         # XXX this is intentiontal :-(. short_preamble can change during the
         # loop in some cases
         while i < len(short_preamble):
             shop = short_preamble[i]
-            newop = inliner.inline_op(shop)
+            newop = shop.clone(memo)
+            newop.is_source_op = True
             if newop.is_guard():
                 if not patchguardop:
                     raise InvalidLoop("would like to have short preamble, but it has a guard and there's no guard_future_condition")
-                descr = patchguardop.getdescr().clone_if_mutable()
+                descr = patchguardop.getdescr().clone_if_mutable(memo)
                 newop.setdescr(descr)
             self.optimizer.send_extra_operation(newop)
-            if shop.result in assumed_classes:
+            if shop in assumed_classes:
                 classbox = self.getvalue(newop.result).get_constant_class(self.optimizer.cpu)
                 if not classbox or not classbox.same_constant(assumed_classes[shop.result]):
                     raise InvalidLoop('The class of an opaque pointer before the jump ' +
@@ -617,13 +619,13 @@
         self.inputarg_setup_ops = inputarg_setup_ops
         self.exported_values = exported_values
 
-    def dump(self):
+    def dump(self, metainterp_sd):
         debug_start("jit-exported-state")
-        logops = LogOperations()
+        logops = LogOperations(metainterp_sd, False)
         debug_print("   inputarg setup")
-        logops._log_operations(self.inputarg_setup_ops)
+        logops._log_operations([], self.inputarg_setup_ops)
         debug_print("   short boxes")
         self.short_boxes.dump(logops)
         debug_print("   exported values")
-        self.exported_values.dump(logops)
+        #self.exported_values.dump(logops)
         debug_stop("jit-exported-state")
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
@@ -591,32 +591,40 @@
         self.potential_ops = {}
         self.alternatives = {}
         self.synthetic = {}
-        self.memo = Memo()
         self.optimizer = optimizer
         self.available_boxes = available_boxes
         self.assumed_classes = {}
 
-        if surviving_boxes is not None:
-            for box in surviving_boxes:
-                self.potential_ops[box] = None
-            optimizer.produce_potential_short_preamble_ops(self)
+        assert surviving_boxes is not None
+        for box in surviving_boxes:
+            self.potential_ops[box] = None
+        optimizer.produce_potential_short_preamble_ops(self)
 
-            self.short_boxes = {}
-            self.short_boxes_in_production = {}
+        self.short_boxes = {}
+        self.short_boxes_in_production = {}
 
-            for op in self.potential_ops.keys():
-                try:
-                    self.produce_short_preamble_op(op)
-                except BoxNotProducable:
-                    pass
+        for op in self.potential_ops.keys():
+            try:
+                self.produce_short_preamble_op(op)
+            except BoxNotProducable:
+                pass
 
-            self.short_boxes_in_production = None # Not needed anymore
-        else:
-            self.short_boxes = {}
+        self.short_boxes_in_production = None # Not needed anymore
+        #else:
+        #    self.short_boxes = {}
+
+    def dump(self, logops):
+        for op, resop in self.short_boxes.iteritems():
+            if isinstance(op, AbstractInputArg):
+                assert resop is None
+                debug_print(logops.repr_of_arg(op))
+            else:
+                debug_print("%s:%s"% (logops.repr_of_resop(op),
+                                      logops.repr_of_resop(resop)))
 
     def prioritized_alternatives(self, box):
         if box not in self.alternatives:
-            return [box]
+            return [self.potential_ops[box]]
         alts = self.alternatives[box]
         hi, lo = 0, len(alts) - 1
         while hi < lo:
@@ -631,11 +639,13 @@
         return alts
 
     def add_to_short(self, box, op):
-        if op:
-            op = op.clone(self.memo)
-            op.is_source_op = True
+        #if op:
+        #    op = op.clone(self.memo)
+        #    op.is_source_op = True
         if box in self.short_boxes:
+            xxx
             if op is None:
+                xxxx
                 oldop = self.short_boxes[box].clone()
                 oldres = oldop.result
                 newbox = oldop.result = oldres.clonebox()
@@ -643,6 +653,7 @@
                 self.short_boxes[box] = None
                 self.short_boxes[newbox] = oldop
             else:
+                xxxx
                 newop = op.clone()
                 newbox = newop.result = op.result.clonebox()
                 self.short_boxes[newop.result] = newop
@@ -655,11 +666,11 @@
     def produce_short_preamble_op(self, op):
         if op in self.short_boxes:
             return
-        if isinstance(op, Const) or isinstance(op, AbstractInputArg):
+        if isinstance(op, Const):
             return
         if op in self.short_boxes_in_production:
             raise BoxNotProducable
-        if self.availible_boxes is not None and op not in self.available_boxes:
+        if self.available_boxes is not None and op not in self.available_boxes:
             raise BoxNotProducable
         self.short_boxes_in_production[op] = None
 
@@ -689,7 +700,7 @@
                 if classbox:
                     self.assumed_classes[op] = classbox
         if op not in self.potential_ops:
-            self.potential_ops[op] = None
+            self.potential_ops[op] = op
         else:
             if op not in self.alternatives:
                 self.alternatives[op] = [op]


More information about the pypy-commit mailing list