[pypy-commit] pypy optresult-unroll: emit guard_no_overflow in the short preamble

fijal noreply at buildbot.pypy.org
Tue Aug 11 16:56:50 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78911:c4b254735dd6
Date: 2015-08-11 15:14 +0200
http://bitbucket.org/pypy/pypy/changeset/c4b254735dd6/

Log:	emit guard_no_overflow in the short preamble

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
@@ -333,6 +333,9 @@
         else:
             self._items = [None] * size
 
+    def all_items(self):
+        return self._items
+
     def _force_elements(self, op, optforce, descr):
         arraydescr = op.getdescr()
         for i in range(self.length):
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -64,8 +64,11 @@
         op = self.get_box_replacement(op)
         if op.is_constant():
             return
-        assert op.get_forwarded() is None
-        op.set_forwarded(bound)
+        cur = op.get_forwarded()
+        if cur is not None:
+            cur.intersect(bound)
+        else:
+            op.set_forwarded(bound)
 
     def getnullness(self, op):
         if op.type == 'i':
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
@@ -273,12 +273,14 @@
                 arg.set_forwarded(None)
                 #self.force_info_from(arg) <- XXX?
         self.short.append(preamble_op)
+        if preamble_op.is_ovf():
+            self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
         info = preamble_op.get_forwarded()
         preamble_op.set_forwarded(None)
         if info is not empty_info:
             info.make_guards(preamble_op, self.short)
         if optimizer is not None:
-            optimizer.setinfo_from_preamble(box, info)
+            optimizer.setinfo_from_preamble(box, info, None)
         return preamble_op
 
     def add_preamble_op(self, preamble_op):


More information about the pypy-commit mailing list