[pypy-commit] pypy default: be a bit more diligent what do we inherit in virtuals

fijal noreply at buildbot.pypy.org
Wed Sep 9 15:30:46 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: 
Changeset: r79561:d69bcdeb2c61
Date: 2015-09-09 15:30 +0200
http://bitbucket.org/pypy/pypy/changeset/d69bcdeb2c61/

Log:	be a bit more diligent what do we inherit in virtuals

diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -20,6 +20,9 @@
     def force_box(self, op, optforce):
         return op
 
+    def is_virtual(self):
+        return False
+
     def is_precise(self):
         return False
 
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
@@ -39,6 +39,10 @@
             i = infos.get(item, None)
             if i is not None:
                 self.setinfo_from_preamble(item, i, infos)
+            else:
+                item.set_forwarded(None)
+                # let's not inherit stuff we don't
+                # know anything about
 
     def setinfo_from_preamble(self, op, preamble_info, exported_infos):
         op = self.get_box_replacement(op)
@@ -128,10 +132,10 @@
     def optimize_peeled_loop(self, start_label, end_jump, ops, state,
                              call_pure_results, inline_short_preamble=True):
         self._check_no_forwarding([[start_label, end_jump], ops])
-        try:
-            label_args = self.import_state(start_label, state)
-        except VirtualStatesCantMatch:
-            raise InvalidLoop("Cannot import state, virtual states don't match")
+        #try:
+        label_args = self.import_state(start_label, state)
+        #except VirtualStatesCantMatch:
+        #    raise InvalidLoop("Cannot import state, virtual states don't match")
         self.potential_extra_ops = {}
         self.optimizer.init_inparg_dict_from(label_args)
         info, _ = self.optimizer.propagate_all_forward(
@@ -349,6 +353,22 @@
             for op in short:
                 op.set_forwarded(None)
 
+    def _expand_info(self, arg, infos):
+        info = self.optimizer.getinfo(arg)
+        if arg in infos:
+            return
+        if info:
+            infos[arg] = info
+            if info.is_virtual():
+                self._expand_infos_from_virtual(info, infos)
+
+    def _expand_infos_from_virtual(self, info, infos):
+        items = info.all_items()
+        for item in items:
+            if item is None:
+                continue
+            self._expand_info(item, infos)
+
     def export_state(self, start_label, original_label_args, renamed_inputargs,
                      memo):
         end_args = [self.optimizer.force_box_for_end_of_preamble(a)
@@ -358,11 +378,11 @@
         end_args = [self.get_box_replacement(arg) for arg in end_args]
         infos = {}
         for arg in end_args:
-            infos[arg] = self.optimizer.getinfo(arg)
+            self._expand_info(arg, infos)
         label_args, virtuals = virtual_state.make_inputargs_and_virtuals(
             end_args, self.optimizer)
         for arg in label_args:
-            infos[arg] = self.optimizer.getinfo(arg)            
+            self._expand_info(arg, infos)
         sb = ShortBoxes()
         short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs,
                                             label_args + virtuals)


More information about the pypy-commit mailing list