[pypy-commit] pypy result-in-resops: some more progress. an always failing guard is actually a fatal thing, not an invalid loop

fijal noreply at buildbot.pypy.org
Fri Sep 21 00:36:48 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57444:19dc9779567a
Date: 2012-09-21 00:19 +0200
http://bitbucket.org/pypy/pypy/changeset/19dc9779567a/

Log:	some more progress. an always failing guard is actually a fatal
	thing, not an invalid loop

diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -464,8 +464,9 @@
 
     def make_equal_to(self, box, value, replace=False):
         assert isinstance(value, OptValue)
-        assert replace or box not in self.values
-        self.values[box] = value
+        if replace:
+            assert not box.has_extra("optimize_value")
+        box.set_extra("optimize_value", value)
 
     def make_constant(self, box, constbox):
         self.make_equal_to(box, ConstantValue(constbox))
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -34,7 +34,7 @@
                 resbox = self.optimizer.constant_fold(op)
                 # note that INT_xxx_OVF is not done from here, and the
                 # overflows in the INT_xxx operations are ignored
-                self.optimizer.make_constant(op.result, resbox)
+                self.optimizer.make_constant(op, resbox)
                 return
 
             # did we do the exact same operation already?
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -197,8 +197,8 @@
             box = value.box
             assert isinstance(box, Const)
             if not box.same_constant(constbox):
-                raise InvalidLoop('A GUARD_{VALUE,TRUE,FALSE} was proven to' +
-                                  'always fail')
+                raise Exception('A GUARD_{VALUE,TRUE,FALSE} was proven to' +
+                                'always fail')
             return
         if emit_operation:
             self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -183,6 +183,7 @@
     def test_constant_propagate(self):
         ops = """
         [i]
+        guard_value(i, 2) []
         i0 = int_add(i, 3)
         i1 = int_is_true(i0)
         guard_true(i1) []
@@ -192,8 +193,9 @@
         jump(i)
         """
         expected = """
-        []
-        jump()
+        [i]
+        guard_value(i, 2) []
+        jump(i)
         """
         self.optimize_loop(ops, expected)
 
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -593,6 +593,10 @@
         return getattr(self, key)
 
     @specialize.arg(1)
+    def has_extra(self, key):
+        return hasattr(self, key)
+
+    @specialize.arg(1)
     def set_extra(self, key, value):
         if key not in self.DOCUMENTED_KEYS:
             raise Exception("Please document '%s' extra parameter and it's lifetime" % key)


More information about the pypy-commit mailing list