[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